1、宏命名
用于定义常量的宏的名字及枚举里的标签需要大写,如:
#define CONSTANT 0x12345
在定义几个变量的常量时,最好使用枚举。
2、函数宏的命名
宏的名字一般用大写,但是形如函数的宏,其名字可以用小写,如果能写成内联函数的就不要写成像函数的宏。如下所示:
#define macrofun(a, b, c) \
do { \
if (a == 5) \
do_this(b, c); \
} while (0)
3、使用宏的注意事项
1)避免影响控制流程的宏,如下:
#define FOO(x) \
do { \
if (blah(x) < 0) \
return -EBUGGERED; \
} while (0)
上述代码中就很不好,它看起来像个函数,但是却能导致“调用”它的函数退出。
2)作为左值的带参数的宏: FOO(x) = y,如果有人把 FOO 变成一个内联函数的话,这种用法就会出错了。
3)忘记优先级:使用表达式定义常量的宏必须将表达式置于一对小括号之内,如:
#define CONSTANT 0x4000
#define CONSTEXP (CONSTANT | 3)
4、将宏所定义的多条表达式放在大括号中。
如果有多条语句的话,最好的写法就是写成 do while(0)的方式,如下所示示例:
#define FOO(x) \
printf("arg is %d\n", x) \
do_something_useful(x);
为了说明这个问题,下面以 for 语句为例:
for (blah = 1; blah < 10; blah++)
FOO(blah)
为了修改上面的 for 循环的错误,可以通过大括号来解决,如下:
#define FOO(x) { \
printf("arg is %s\n", x); \
do_something_useful(x); \
}