# 宏那些事 ## 关于作者: 个人公众号: ![](../img/wechat.jpg) ## 1.宏中包含特殊符号 分为几种:`#`,`##`,`\` ### 1.1 字符串化操作符(#) **在一个宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组**,换言之就是:**#是“字符串化”的意思,出现在宏定义中的#是把跟在后面的参数转换成一个字符串**。 **注意:其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。** 例如: ```c++ #define exp(s) printf("test s is:%s\n",s) #define exp1(s) printf("test s is:%s\n",#s) #define exp2(s) #s int main() { exp("hello"); exp1(hello); string str = exp2( bac ); cout<(b) ? (a) \ :(b)) int main() { int max_val = MAX(3,6); cout<0) fun() ``` 这个宏被展开后就是: ``` if(a>0) f1(); f2(); ``` 本意是a>0执行f1 f2,而实际是f2每次都会执行,所以就错误了。 为了解决这种问题,在写代码的时候,通常可以采用`{}`块。 如: ```c++ #define fun() {f1();f2();} if(a>0) fun(); // 宏展开 if(a>0) { f1(); f2(); }; ``` 但是会发现上述宏展开后多了一个分号,实际语法不太对。(虽然编译运行没问题,正常没分号)。 ### 2.2避免使用goto控制流 在一些函数中,我们可能需要在return语句之前做一些清理工作,比如释放在函数开始处由malloc申请的内存空间,使用goto总是一种简单的方法: ```c++ int f() { int *p = (int *)malloc(sizeof(int)); *p = 10; cout<<*p<