assert 用于运行时的断言
实现方法如下
#define assert(x) \
do { if (!(x)) printf("assertion failed: %s", #x); } while (0)
在宏语句中,参数可以通过前置 #
,将其转化为字符串常量。
static_assert 用于编译期断言
实现方法如下:
#define static_assert(a, b) \
do { switch (0) case 0: case (a): ; } while (0)
原理:
- switch 每一个分支都有一个或多个整数值常量或常量表达式标记
- switch 各个分支表达式必须互不相同
do{ } while (0) 技巧
采用 do-while 技巧,可以将多条语句包裹,从而保证编译时不会出错。
例如:
#define DUMP_WRITE(addr, nr) \
do { memcpy(bufp, addr, nr); bufp += nr; } while (0)
# 如果去掉 do-while 的包裹,就会造成下面语句中的 else 分句匹配错误,从而编译失败
if (addr)
DUMP_WRITE(addr, nr);
else
do_something_else();