宏定义后不能加“;”,如果想查找宏可能带来的bug,可以增加编译选项:/P,然后选择仅编译, 这时会生成*.i的文件,打开后可以看到编译器替换宏以后的实际内容,然后再去查看相关的替换有没有错误。
带参数的宏定义时必须在后边的定义中加(),防止自动分配优先级,造成错误理解
例如:#define pow(n) n * n
假如使用时传递pow(2),pow(5)都不会有问题,编译器会替换成2*2,5*5,但是如果调用时传递pow(2+3),编译器会替换成2 + 3 * 2 + 5 = 13,而我们期望得到5 * 5 = 25,明显是错误的。所以需要在定义时加上(),#define pow(n) (n) * (n),这时编译器会替换成 (2 + 3) * (2 + 3) = 25,会得到符合我们预期的数值。
整个表达式要加(),否则也会出现替换bug,比如 #define pow(n) (n) * (n) + 5,如果我们在调用时pow(3) * 10,这时编译器会替换为:(3) * (3) + 5 * 10,而不是我们预期的 (3 * 3 + 5) * 10,所以我们要定义为:#define pow(n) ((n) * (n) + 5)。
表达式宏定义规范:
例如:#define pow(n) ((n) * (n) + 5)
宏名称大写,单词之间用下划线分隔。
#define DEF_STRING(s) #s
char szTest[] = DEF_STRING(Test String); 等价于 char szTest[] = "Test String";
符号、状态,名称宏:
宏名称大写,单词之间用下划线分隔。
例如:#define PI 3.1415926
#define WRITED 0X000001
#define READED 0X000000
语句块宏:
宏名称大写,单词之间用下划线分隔。
#define SHOW_MSG(s) printf(s);printf("\r\n")
注意最后不要加";"
兼容性宏:
#define for if(1)for,可解决vc6.0 for循环定义迭代i的重复定义问题。
说明性宏
#define IN
#define OUT
void foo( IN int nCount, OUT int *pout)
只起到说明使用的作用,不做实际替换,因为替换后为空。
预处理宏, 条件编译
#define DEBUGED 1 //debug版本生效
#define DEBUGED 0 //非debug版本生效
调用:
int a = 10;
#if DEBUGED
a = b + c;
#endif
printf("\d", a);
或者
#define DEBUGED
使用:
#ifdef DEBUGED
a = b + c
#endif
10.编译选项宏, 条件编译
直接在IDE环境的预处理器中加入
