宏别忘了do{}while(0)

简介:
看ACE的源码,发现它的宏很多都会加上do{}while(0)包起来,以前认为多此一举。既然是出至名家之手,自然有它的道理,问过一些同事,他们也不是很清楚。最近在编译代码时才发现

1.用{}代替do{}while(0)能解决临时变量作用域的问题,但在if...else情况下会有问题。
比如有宏定义如下:
#define ADEF()\
     {  int a=0; do_something();}
在if dot.gifelse情况下
if
   ADEF();
else
do_something();


编译展开之后就变成
if
   { int a=0; do_something();};  // 最后一个;把ifdot.gifelse分割了,自然编译也通不过了
else
do_something();


由上可看出
1.宏最好用do{}while(0)包起来;
2.if后面最好加上{},else也如此。
目录
相关文章
|
5月前
|
编译器 C语言
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
|
5月前
|
算法 Serverless C语言
CMake函数和宏(function和macro):使用函数和宏提高代码可读性
CMake函数和宏(function和macro):使用函数和宏提高代码可读性
100 1
|
5月前
strtol()函数与strtoul()函数的用法
strtol()函数与strtoul()函数的用法
41 0
解决办法一:GetProcAddress函数返回值总为NULL
解决办法一:GetProcAddress函数返回值总为NULL
202 0
|
Shell
SHELL中函数的写法、调用、参数、返回值代码范例
SHELL中函数的写法、调用、参数、返回值代码范例
116 0
定义带参数的C宏,方便输出调试信息
定义带参数的C宏,方便输出调试信息
66 0
|
缓存 API
如何写出高质量的代码 data 组件 函数 注释 命名 变量的次数
如何写出高质量的代码 data 组件 函数 注释 命名 变量的次数
|
前端开发 rax
[ CALL指令有多少种写法 ] 之读书笔记
原文为360的安全专家很久之前的一篇文章,偶然发现后收获不少。特以笔记的形式记录下来, 便于加深理解。 Intel有公开的指令集格式文档,你需要的是第二卷的上半部分,指令集从A到M。这篇文档的难度超出一般人想象,里面有众多晦涩的标识、与硬件紧密相关的介绍,拿到这后,即使直接翻到目录的CALL 指令一节,也不见得能够弄清楚。
1637 0