C/C++宏定义注意事项
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
宏定义后不能加“”如果想查找宏可能带来的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环境的预处理器中加入