
1 loggerhead 2013-10-20 08:49:36 +08:00 有. 比如: if (1) SAFE_RELEASE_NULL(arg); else doSomeThing(); 后者末尾加分号就错了 |
2 xpfd 2013-10-20 09:29:25 +08:00 @loggerhead 正解,能不用宏的地方尽量不要用,尽量使用inline和enmu代替 |
3 iEverX 2013-10-20 14:50:09 +08:00 @loggerhead 所说确实是一个方面 最重要应该是,while(0)把一个语句块包起来,整个宏就就类似于一个语句一样。 #define A(arg) dosth(arg);doanother(arg) #define B(arg) do { dosth(arg);doanother(arg); } while(0) if (xxx) A(arg); // 这一行和下一行,doanother(arg)的执行有区别 if (xxx) B(arg); |
4 yangxin0 2013-10-20 16:31:07 +08:00 |
5 jokerlee 2013-10-20 23:40:52 +08:00 do while{...}用在宏里还有一个作用是{}之间是一个独立的作用域,里面定义的变量不会污染外部作用域 |
6 xgdyhaiyang 2013-10-22 13:09:34 +08:00 GCC 官方文档:Swallowing the Semicolon http://gcc.gnu.org/onlinedocs/cpp/Swallowig-the-Semicolon.html#Swallowing-the-Semicolon |