总是用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时,我会推荐以下规则:
- 避免像macros一样的function@see Lundin的评论。
如果你想使用像macros一样的function,请严格考虑以下两条规则:
- 在macros中始终使用括号括起参数
- 只能使用一次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