宏定义
记得使用 do { } while (0)
比如定义如下宏:
#define err_sys(x) { perror(x); exit(1); }
比如在如下的 if-else 语句中使用了以上宏定义:
if (foo == FALSE)
err_sys(x);
else
fun;
会展开成如下形式:
if (foo == FALSE)
{ perror(x); exit(1); };
else
fun;
很容易发现以上代码是错误的:if 下一条语句大括号后面多了个分号, else 语句就会出错,找不到临近的 if 语句
应该将宏定义成如下形式:
#define err_sys(x) do { perror(x); exit(1); } while (0)
使其看起来和用起来都像一条语句
其实你如果有良好的编程习惯,这些宏定义的缺点是影响不了你的,例如:
#define err_sys(x) { perror(x); exit(1); }
if (foo == FALSE) {
err_sys(x);
} else {
fun;
}
代码展开如下:
if (foo == FALSE) {
{ perror(x); exit(1); };
} else {
fun;
}
以上代码是完全没有问题的