gpt4 book ai didi

c - 定义常量为printf格式参数,为什么要加 '+ 0'?

转载 作者:太空狗 更新时间:2023-10-29 17:09:14 27 4
gpt4 key购买 nike

我正在阅读一本关于 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提到的空#definecomment这就是使用 + 0 技巧的原因。

如果某些 header 具有#define ARG_MAX(没有值)——一种不太可能但并非不可能的事态——代码仍然可以编译,尽管输出是否有用是一个单独的讨论。 ARG_MAX 的空白替换留下仍然有效的 (long) + 0。如果正如您所期望的那样,定义是一个适当保护的表达式(可能在括号内),则添加 0 不会更改值。

在通常的事件过程中,当预处理器计算条件表达式时,扩展宏后留下的任何标识符都映射为零(ISO/IEC 9899:2011 §6.10.1 条件包含):

¶4 … After all replacements due to macro expansion and the defined unary operator have been performed, all remaining identifiers (including those lexically identical to keywords) are replaced with the pp-number 0, and then each preprocessing token is converted into a token. …

虽然这与这个问题并不直接相关,但这是您有时会看到条件表达式的原因,例如:

#if ARG_MAX + 0 > 131072

关于c - 定义常量为printf格式参数,为什么要加 '+ 0'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41475949/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com