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); \
} 

5、常量建议使用 const 定义来代替宏