c - 使用 _Generic 进行 printf 格式化

标签 c c-preprocessor

我发现自己经常输入错误的格式类型,并且不记得何时执行 fLflf 等。是有没有办法在 _Generic 关键字的帮助下做类似下面的事情?

#define TYPE(X)   _Generic((X), float: "float", double: "double", long double: "long_double")
#define FORMAT(X) _Generic((X), float: "%f",    double: "%f",     long double: "%Lf")

printf("%s if of type %s\n", FORMAT(10.), 10., TYPE(10.));

基本上,我希望它打印:

10.000000 is of type double

有办法吗?

我想一个速记选项是做这样的事情:

#define TYPE(X)     _Generic((X), float: "float", double: "double", long double: "long_double")
#define STRINGIZE(X)   #X
printf("%s if of type %s\n", STRINGIZE(10.), TYPE(10.));
  1. if of type double

最佳答案

printf 中的格式说明符不能单独作为参数。它们需要是格式字符串的一部分。

您可以通过使 FORMAT 宏成为整个格式字符串来实现这一点,以便一次调用 printf 来打印值。然后你可以再调用其他人:

printf(FORMAT(10.), 10.);
printf(" is of type %s\n", TYPE(10.));

但是,正如评论中所述,现代编译器足够聪明,可以检测到 printf 格式字符串与其参数之间的不匹配。因此,依靠它同样有效。

关于c - 使用 _Generic 进行 printf 格式化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66467106/

相关文章:

c++ - 使用gcc或cpp搜索定义的位置

c - 为什么结构必须单词对齐?

c - Android NDK OpenSSL 交叉编译错误

python - 当 numpy 数组被 C 函数改变时,魔法就发生了

c++ - 如何使用宏参数作为字符串文字?

c - 生成反向位查找表(8位)背后的算法

c++ - C/C++ 宏扩展为参数,参数为字符串

c - access 总是返回 -1,即使文件存在

c - 将整个数组作为参数传递给函数

c - 以总和作为参数的预处理器操作