宏定义解析:
#:符号是将宏中的参数转换为一个字符数组。
例如:
#define charArray(s) #s
string str = charArray( hhh );//返回hhh,忽略前面和后面的空格
string str = charArray( jj lll);//返回jj lll,忽略前面后面的空格,每部分字符串缩减为一个空格连接
传入s是什么就是什么,s是变量也会认为就是s,如果s是个宏定义,charArray也会阻止这个宏的展开。
##:符号连接操作符
1.##后面如果是个宏,会阻止宏的展开。
2.连接后的实际参数名,必须为实际存在的参数名或者是编译器已经知道的宏定义。
3.##会忽略前后的空格。
在这里插入代码片
#define expA(s) printf("前缀加上后的字符串为:%s\n",gc_##s) //gc_s必须存在
// 注意事项2
#define expB(s) printf("前缀加上后的字符串为:%s\n",gc_ ## s) //gc_s必须存在
// 注意事项1
#define gc_hello1 "I am gc_hello1"
int main() {
// 注意事项1
const char * gc_hello = "I am gc_hello";
expA(hello);
expB(hello1);
}
\:续写操作符,可以将宏定义写到下一行
1.每一个宏定义最后宏展开都会有个;号,可以使用do{}while(0)语句进行复杂宏定义,不让他产生;
do{}while(0):
用处:代替goto,在需要goto的地方使用break直接退出,不执行后面的语句。
代码块的书写也是用do{}while(0)