总是用C中的括号括起一个定义是否有很好的理由?

很显然, define必须有括号的时候,像这样:

 #define WIDTH 80+20 int a = WIDTH * 2; //expect a==200 but a==120 

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

 #define WIDTH (100) 

有人问我C为什么这样做,所以我试图find一个边界情况下单个数字define的括号缺less导致问题,但我想不出一个。

这样的情况是否存在?

是的 。 预处理器连接运算符( ## )将导致问题,例如:

 #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) 

相同的string( # )。 显然,这是一个angular落的情况下,可能无所谓考虑如何WIDTH将被使用。 不过,还是要记住预处理器。

(添加第二只企鹅失败的原因是C99- iirc中预处理规则的微妙细节,因为连接到两个非占位符预处理标记必须总是导致单个预处理标记 – 但是这是不相关的,即使串联被允许它仍然会给出一个不同的结果比没有包括的#define !)。

所有其他的答案都是正确的,只要从C ++扫描器的angular度来看它并不重要,因为实际上,一个数字是primefaces的。 但是,在阅读这个问题时,没有迹象表明只有没有进一步的预处理扩展的情况才会被考虑,所以即使我完全同意其中的build议也是错误的。

有时候你不得不写代码,而不是考虑当前的注意事项,但是下次要编辑的时候需要注意。

现在你的macros是一个整数。 想象一下,有人在将来编辑它。 假设他们不是你,而是一个不那么小心或者更加匆忙的人。 括号在那里提醒他们在括号中做任何修改。

这种思维方式在C语言中是一个好习惯。我个人以某种风格来编写代码,有些人可能会觉得这种风格是“冗余的”,而这样的事情,尤其是在处理错误方面。 冗余是为了未来编辑的可维护性和可组合性。

每当定义由单个标记(仅一个操作数,没有操作符)组成时,不需要括号,因为单个标记(例如100 )在search和parsing时是不可分割的primefaces。

正如布拉戈维斯特·布图列夫所言:

这个定义由一个单一的标记(只有一个操作数,没有操作符)组成,括号是不需要的,因为单个标记(比如100)是一个不可分割的primefaces。

但是当涉及到macros时,我会推荐以下规则:

  1. 避免像macros一样的function@see Lundin的评论。

如果你想使用像macros一样的function,请严格考虑以下两条规则:

  1. 在macros中始终使用括号括起参数
  2. 只能使用一次macros参数

为什么规则1? (为了保持正确的操作顺序)

 #define quad(x) (x*x) int a = quad(2+3); 

将扩展到:

 int a = (2+3*2+3); 

为什么规则2? (为确保副作用只应用一次)

 #define quad(x) (x*x) int i = 1; int a = quad(i++); 

将扩展到:

 int a = i++ * i++; 

因为100是一个单一的标记,我怀疑你会发现一个圆括号很重要的情况(对于一个标记!)

海事组织仍然是一个好习惯,因为当涉及到多个令牌时,它们可能很重要。

不,不存在#define WIDTH 100可以产生明确的或“令人惊讶的”扩展的情况。 这是因为它只能导致单个令牌被一个令牌replace。

正如你所知道的那样,当单个标记(例如WIDTH )导致多个标记(例如80 + 20 )时,会出现macros观混淆。 就我所能推测,这是使用括号代替的唯一原因,正如我的第一段所探讨的那样,这里不适用。

不过,除了这个技术事实,这可能还是一个很好的做法。 它促进了习惯,也提醒人们这个macros是否被修改为更复杂的东西。

有时候有一个很好的理由。

对于一个单一的号码,没有什么好的理由。

对于其他情况,如你所示,有一个很好的理由。

有些人更喜欢小心,总是使用括号(@aix推荐它,我不这样做,但没有硬性答案)。

这当然不会伤害,这是一个好习惯。 但数值计算中(100)100之间没有区别。

当代码只定义一个数字时, @Alexander Gessler很好地回答了这个问题。

然而,许多编码人员并没有注意到以下的一元运算符

 #define TEMPERATURE1M (-1) #define TEMPERATURE1P (+1) 

当代码使用一个使用运算符的#define ,enclosing ()确保预期的数字结果和优先级。

 #define TEMPERATURE_WITH (-1) #define TEMPERATURE_WITHOUT -1 // Consider how these will compile int w = 10-TEMPERATURE_WITH; int wo = 10-TEMPERATURE_WITHOUT; // May not compile 

最后一行代码可以编译给定的C99语义变化@Olaf