当前位置: 技术问答>linux和unix
这个#号干什么的?
来源: 互联网 发布时间:2015-12-15
本文导语: 我看《U N I X环境高级编程》第七章时看到这么条宏定义: #define doit(name) pr_limits(#name, name) 这里第二个#号是什么意思,请各位达人赐教 | 在标准C中,预处理语句,特别是宏定义中,常常...
我看《U N I X环境高级编程》第七章时看到这么条宏定义:
#define doit(name) pr_limits(#name, name)
这里第二个#号是什么意思,请各位达人赐教
#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("%dn", variable##x)
则printvar(3);将被替换为printf("%dn", variable3);
##仅仅合并字符串,而形成一个token,没有引号.
给分是美德
'#'是`stringize'的意思。其后的变量将被用双引号包括的字符串替代。例:
#define display(x) show((long)(x), #x)
则display(abs(-5)); 将被替换为:show((long)(abs(-5)), "abs(-5)"); 注意有引号。
'##'是'token-paste'操作符。其后的变量将被与之前的字符串合并在一起形成一个新的token.例:
#define printvar(x) printf("%dn", variable##x)
则printvar(3);将被替换为printf("%dn", variable3);
##仅仅合并字符串,而形成一个token,没有引号.
给分是美德
|
看看这个简单的例子:
#include
#define doit(name) test(#name, name)
#define TEST 1
int test(char* name, int val)
{
printf("name = %sn", name);
printf("value = %dn", 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 = %sn", name);
printf("value = %dn", val);
}
int main()
{
test("TEST", 1);
}
可以看到doit已经被函数替换, 并且一宏的名字作为test函数的参数。
在《U N I X环境高级编程》也这样一句话:
注意,在doit宏中使用了新的ANSI C字符串创建算符(#)
#include
#define doit(name) test(#name, name)
#define TEST 1
int test(char* name, int val)
{
printf("name = %sn", name);
printf("value = %dn", 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 = %sn", name);
printf("value = %dn", val);
}
int main()
{
test("TEST", 1);
}
可以看到doit已经被函数替换, 并且一宏的名字作为test函数的参数。
在《U N I X环境高级编程》也这样一句话:
注意,在doit宏中使用了新的ANSI C字符串创建算符(#)
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。