宏定义

记得使用 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;
}

以上代码是完全没有问题的