宏定义的中括号

摘要:本文的主要内容在于强求在宏定义中,括号以及do{……}while(0)的重要性以及用法。

括号

在宏定义中,我们经常会看到宏定义中特别增加了括号。比如最简单的对于常数的宏定义:

其实在这里不加上括号并不会引发什么问题,只是根据习惯而加上括号,为的是避免宏定义的副作用,我们可以看以下例子:

显然第二个宏定义才是本意,而第一个宏定义由于没有增加括号,使能表达式的意义发现了改变。所以增加括号为的就是避免这种因为运算符号优先级所导致的表达式含义发生变化。所以习惯上在常数的宏定义上也增加了括号。可以再看如下的例子:

do{……}while(0)

有时宏定义也会使用do……while(0)来避免宏定义的副作用。

  1. 空的宏定义避免warning:

2. 存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现。只运行一次,变量是局部变量。

3. 如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现。使用这一编程技巧十分有用,同时有可以有效的避免一些不必要的错误。

4. 以上的第3种情况用单独的{}也可以实现,但是为什么一定要一个do{}while(0)呢,看以下代码:

可以看到if{}后会多出一个”;”号,从而使后面的else得不到对应,从而产生错误。

这种用法在C++中的MFC中十分常见。同时这也是一个十分好的编程习惯。

优势:使用do{….}while(0) 把它包裹起来,成为一个独立的语法单元,从而不会与上下文发生混淆。同时因为绝大多数的编译器都能够识别do{…}while(0)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低(这是我们很关心的一个问题)

未经允许不得转载:TacuLee » 宏定义的中括号

赞 (2)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址