我正在阅读一本关于 C 编程的书“Unix 环境中的高级编程”,在“UNIX 标准化和实现”一章中,它显示了一个打印 sysconf 和 pathconf 中符号值的程序,该程序中的代码有几行看起来像这样:
#ifdef ARG_MAX
printf ("ARG_MAX defined to be %ld\n", (long) ARG_MAX + 0);
#else
printf ("no symbol for ARG_MAX\n");
#endif
每当定义的常量用作
printf
的参数时,它总是后跟 + 0
,它似乎没有做任何事情,因为我试图删除它但什么也没发生。添加零有什么意义? 最佳答案
melpomene 在 comment 中提到的空 #define
就是使用 + 0
技巧的原因。
如果某个头文件有 #define ARG_MAX
(没有值)——一种不太可能但并非不可能的事态——代码仍然可以编译,尽管输出是否有用是一个单独的讨论。 ARG_MAX
的空白替换留下仍然有效的 (long) + 0
。如果如您所料,定义是一个适当保护的表达式(可能在括号内),则添加 0
不会更改该值。
在通常的事件过程中,当预处理器评估条件表达式时,扩展宏后剩余的任何标识符都映射为零(ISO/IEC 9899:2011 §6.10.1 条件包含):
尽管这与这个问题并不直接相关,但这就是为什么您有时会看到条件表达式,例如:
#if ARG_MAX + 0 > 131072
关于c - 将常量定义为 printf 格式参数,为什么要添加 '+ 0'?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41475949/