我看《U N I X环境高级编程》第七章时看到这么条宏定义:
#define doit(name) pr_limits(#name, name)
这里第二个#号是什么意思,请各位达人赐教
在标准C中,预处理语句,特别是宏定义中,常常出现'#'和'##'符号
'#'是`stringize'的意思。其后的变量将被用双引号包括的字符串替代。例:
#define display(x) show((long)(x), #x)
则display(abs(-5)); 将被替换为:show((long)(abs(-5)), "abs(-5)"); 注意有引号。
'##'是'token-paste'操作符。其后的变量将被与之前的字符串合并在一起形成一个新的token.例:
#define printvar(x) printf("%d\n", variable##x)
则printvar(3);将被替换为printf("%d\n", variable3);
##仅仅合并字符串,而形成一个token,没有引号.
看看这个简单的例子:
#include
#define doit(name) test(#name, name)
#define TEST 1
int test(char* name, int val)
{
printf("name = %s\n", name);
printf("value = %d\n", val);
}
int main()
{
doit(TEST);
}
[hua@localhost csdn]$ ./doit
name = TEST
value = 1
用cpp将doit.c预编译得到doit.i:
[hua@localhost csdn]$ cpp doit.c > doit.i
[hua@localhost csdn]$ cat doit.i
# 1 "doit.c"
# 1 ""
# 1 ""
# 1 "doit.c"
int test(char* name, int val)
{
printf("name = %s\n", name);
printf("value = %d\n", val);
}
int main()
{
test("TEST", 1);
}
可以看到doit已经被函数替换, 并且一宏的名字作为test函数的参数。
在《U N I X环境高级编程》也这样一句话:
注意,在doit宏中使用了新的ANSI C字符串创建算符(#)