假设我正在实现一个矩阵,我想要我的结构使用scalar_t,哪里scalar_t可以float或double.
然后,假设我想扫描一些文本文件并将其加载到我的矩阵中:
// Inner loop:
fscanf(mdata, format, &m->data[i * m->cols + j]);
Run Code Online (Sandbox Code Playgroud)
如果scalar_t *是float *,format应该是"%f".如果是的double *话"%lf".
如何调整类型的格式scalar_t?我知道我可以比较sizeof但是有一般的解决方案吗?
小智 5
C99的设计师<inttypes.h>也有类似的问题.他们定义了类似int32_t某些特定属性的类型,并允许每个实现根据需要int或long必要时对其进行类型设置.但是printf和scanf格式变得特定于平台.
他们的解决办法是与每种类型,像沿着限定一组宏SCNd32这将是"d"或"ld"以匹配int或long针对的typedef.
用法看起来像
int32_t i;
scanf("%"SCNd32, &i);
Run Code Online (Sandbox Code Playgroud)
对于每种类型,对于您可能想要对该类型执行的每次转换都有一个单独的宏(不仅如此d,也x适用于十六进制等)
您可以为自定义类型执行相同的操作.在标题中:
#if something
typedef float scalar_t;
#define SCNfSCALAR "f"
#else
typedef double scalar_t;
#define SCNfSCALAR "lf"
#endif
Run Code Online (Sandbox Code Playgroud)
并在调用代码中:
scalar_t x;
scanf("%"SCNfSCALAR, &x);
Run Code Online (Sandbox Code Playgroud)