C中printf语句中的宏函数调用
我在理解printf()语句中宏函数调用的用法时遇到了一个问题 我的代码如下:C中printf语句中的宏函数调用,c,c-preprocessor,C,C Preprocessor,我在理解printf()语句中宏函数调用的用法时遇到了一个问题 我的代码如下: #include<stdio.h> #define f(g,h) g##h main() { printf("%d",f(100,10)); } #包括 #定义f(g,h)g##h main() { printf(“%d”,f(100,10)); } 此代码输出“10010”作为答案 我已经了解到,宏函数调用只是简单地复制粘贴宏函数代码,而不是替换参数的调用 所以代码应该是这样的: #incl
#include<stdio.h>
#define f(g,h) g##h
main()
{
printf("%d",f(100,10));
}
#包括
#定义f(g,h)g##h
main()
{
printf(“%d”,f(100,10));
}
此代码输出“10010”作为答案
我已经了解到,宏函数调用只是简单地复制粘贴宏函数代码,而不是替换参数的调用
所以代码应该是这样的:
#include<stdio.h>
#define f(g,h) g##h
main()
{
printf("%d",100##10);
}
#包括
#定义f(g,h)g##h
main()
{
printf(“%d”,100#10);
}
但是当我用替换宏单独执行上述代码时,我得到了一个编译错误
那么,第一个代码如何给出10010作为答案,而第二个代码给出编译错误呢?在替换宏之前,预处理器串联运算符
#
已经完成。它只能在宏体中使用。运算符##
对预处理器具有特殊意义,它是一个将两个令牌“粘合”在一起的令牌粘贴运算符。因此,在您的例子中,g
和h
被“粘合”在一起,产生了新的token-int-literal10010在宏中有一些特殊字符,如#
,它们改变了规则“简单地替换文本”。完美。这就解释了为什么第二个代码不起作用。感谢##
确保参数是串联的。因此:f(100,10)被:10010中的预处理器所取代###只在#define语句中有效,除非行以“#define[此处的东西]”开头,否则“无效”,因为“#define”指示编译器特别处理这部分代码。