在宏定义中,#的作用是将目标字符串化,这里有注意点如下:
宏定义函数的参数与预处理标记 ‘#’ 之间出现的每一个空格都会被删除,并删除第一个预处理标记之前和最后一个预处理标记之后的空白字符,但是宏定义函数参数中的空格会保留。
举个例子:
#define MAKE_STR(s) ("123" # s "456\n")
int main(void)
{
printf(MAKE_STR(hello world));return 0;
}
结果为123hello world456
看看预处理的结果
gcc -E define.c
# 1 "define.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "define.c"
int main(void)
{
printf(("123" "hello world" "456\n"));
return 0;
}
预处理前后看上去只有一个空格了,事实上编译完成后都没有了