我正在阅读一本关于 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 ,它似乎没有做任何事情,因为我试图删除它但什么也没发生。添加零有什么意义?

最佳答案

melpomenecomment 中提到的空 #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/

10-13 08:05
查看更多