显然,有时#define条语句必须有括号,如下所示:

#define WIDTH 80+20

int a = WIDTH * 2; // expect a==200 but a==120

所以我总是用括号括起来,即使它只是一个数字:

#define WIDTH (100)

有些C新手问我为什么要这样做,所以我试着找出一个边缘情况,在这种情况下,单个数字#define上没有括号会导致问题,但我想不出这样的情况.

这种情况是否存在?

推荐答案

Yes.预处理器串联运算符(##)将导致问题,例如:

#define _add_penguin(a) penguin ## a
#define add_penguin(a) _add_penguin(a)

#define WIDTH (100)
#define HEIGHT 200    

add_penguin(HEIGHT) // expands to penguin200
add_penguin(WIDTH)  // error, cannot concatenate penguin and (100) 

同样适用于架线(#).显然,这是一个极端情况,考虑到WIDTH的使用方式,这可能无关紧要.尽管如此,预处理器还是需要记住的.

(添加第二个penguin失败的原因是C99-iirc中预处理规则的一个微妙细节.它失败是因为连接到两个非占位符预处理令牌必须始终导致一个预处理令牌——但这与此无关,即使允许连接,它仍然会给出与unbr不同的结果.)#define岁!).

所有其他的响应都是正确的,只要从C++ scanner 的Angular 来看,这并不重要,因为,实际上,原子是原子.然而,就我对这个问题的理解而言,没有迹象表明只应考虑没有进一步预处理器扩展的情况,因此其他回答是错误的,尽管我完全同意其中的建议.

C++相关问答推荐

CC crate 示例不会与C函数链接

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

为什么写入系统调用打印的字符数不正确?

在函数中使用复合文字来初始化C语言中的变量

为什么内核使用扩展到前后相同的宏定义?

可以将C变量限制为特定的读/写速度吗?

具有交换链获取和命令缓冲区提交的同步-危险-读后写错误

如何编写一个for循环来计算C中各项的总和?

强制转换变量以在 struct 中蚕食

在C中创建任意类型的只读指针参数

错误...的多个定义(&Q)首先在这里定义&

如何在zOS上编译共享C库

如何修复我的qsort()算法?它每次都给出不同的结果

当我在34mb的.mp4文件中使用FREAD时,我得到了一个分段错误,我如何解决它?

使用 strtok 多次分割一个字符串会导致意外行为

无法将字符串文字分配给 C 中的字符数组

使用共享变量同步多线程 C 中的函数

C23 中是否有 __attribute__((nonnull)) 的等效项?

如何在 C 中编辑 struct 体中的多个变量

在 C 语言中,为什么 10/3 应该给出 3.333 却给出 3.000? (保存 10 和 3 的变量被声明为double)