我发现自己经常输入错误的格式类型,并且不记得何时执行 f
或 Lf
或 lf
等。是有没有办法在 _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.));
- 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/