宏别忘了do{}while(0)

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

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


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


由上可看出
1.宏最好用do{}while(0)包起来;
2.if后面最好加上{},else也如此。
目录
相关文章
|
6月前
|
算法 Serverless C语言
CMake函数和宏(function和macro):使用函数和宏提高代码可读性
CMake函数和宏(function和macro):使用函数和宏提高代码可读性
134 1
|
C语言
【C语言】 函数(下):函数的嵌套调用 -- 链式访问 -- 声明 -- 定义 -- 递归 -- 练习3
【C语言】 函数(下):函数的嵌套调用 -- 链式访问 -- 声明 -- 定义 -- 递归 -- 练习3
|
编译器 C语言
【C语言】 函数(下):函数的嵌套调用 -- 链式访问 -- 声明 -- 定义 -- 递归 -- 练习1
【C语言】 函数(下):函数的嵌套调用 -- 链式访问 -- 声明 -- 定义 -- 递归 -- 练习1
|
算法 编译器 C语言
【C语言】 函数(下):函数的嵌套调用 -- 链式访问 -- 声明 -- 定义 -- 递归 -- 练习2
【C语言】 函数(下):函数的嵌套调用 -- 链式访问 -- 声明 -- 定义 -- 递归 -- 练习2
【C++】 --- 如果同时定义了两个函数,一个带const,一个不带,会有问题吗?
【C++】 --- 如果同时定义了两个函数,一个带const,一个不带,会有问题吗?
141 0
VC下__func__未定义,改用__FUNCTION__
VC下__func__未定义,改用__FUNCTION__
93 0
|
Shell
SHELL中函数的写法、调用、参数、返回值代码范例
SHELL中函数的写法、调用、参数、返回值代码范例
124 0
定义带参数的C宏,方便输出调试信息
定义带参数的C宏,方便输出调试信息
68 0
|
编译器 C++
Dev-c++中将头文件和头文件函数分离,编译主函数跳出undefined reference to 的问题解决
Dev-c++中将头文件和头文件函数分离,编译主函数跳出undefined reference to 的问题解决
Dev-c++中将头文件和头文件函数分离,编译主函数跳出undefined reference to 的问题解决
frida hook重载函数的几种写法
apply arguments MyClass.MyFunc.overload("java.util.List").implementation = function() { this.
4856 0