[英]How to choose fscanf format based on the type of the variable?
假设我正在实现一个矩阵,并且希望我的结构使用scalar_t
,其中scalar_t
可以是float
或double
。
然后,假设我要扫描一些文本文件并将其加载到矩阵中:
// Inner loop:
fscanf(mdata, format, &m->data[i * m->cols + j]);
如果scalar_t *
为float *
,则format
应为"%f"
。 如果为double *
, "%lf"
。
如何根据scalar_t
的类型设置scalar_t
? 我知道我可以比较sizeof
但是有一个通用的解决方案吗?
C99的<inttypes.h>
的设计人员也遇到了类似的问题。 他们使用一些特定的属性定义了诸如int32_t
类的类型,并允许每个实现将其typedef定义为int
或所需的long
。 但是后来printf和scanf格式成为特定于平台的格式。
他们的解决方案是为每种类型定义一组宏,例如SCNd32
,将其为"d"
或"ld"
以匹配typedef的int
或long
。
用法看起来像
int32_t i;
scanf("%"SCNd32, &i);
对于每种类型,对于您可能要与该类型进行的每次转换,都有一个单独的宏(因此,不仅是d
而且还有x
代表十六进制,等等)
您可以对自定义类型执行相同的操作。 在标题中:
#if something
typedef float scalar_t;
#define SCNfSCALAR "f"
#else
typedef double scalar_t;
#define SCNfSCALAR "lf"
#endif
并在调用代码中:
scalar_t x;
scanf("%"SCNfSCALAR, &x);
鉴于
您将需要一个union
,有一个float
和double
。
C标准要求double
是float
的超集。
尽管要求平台是独立的类型,但越来越多的平台将float
和double
设置为相同的类型,在很多方面, char
, unsigned char
和signed char
始终是三种独立的类型。
到目前为止,最好的方法是使用double
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.