Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中printf语句中的宏函数调用_C_C Preprocessor - Fatal编程技术网

C中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

我在理解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”作为答案

我已经了解到,宏函数调用只是简单地复制粘贴宏函数代码,而不是替换参数的调用

所以代码应该是这样的:

#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-literal
10010

在宏中有一些特殊字符,如
#
,它们改变了规则“简单地替换文本”。

完美。这就解释了为什么第二个代码不起作用。感谢
##
确保参数是串联的。因此:f(100,10)被:10010中的预处理器所取代###只在#define语句中有效,除非行以“#define[此处的东西]”开头,否则“无效”,因为“#define”指示编译器特别处理这部分代码。