在C语言中,在printf语句内调用宏函数

6

我在理解从printf()语句中调用宏函数的使用时遇到了问题。

我有以下代码:

#include<stdio.h>
#define 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);
}

但是,当我使用替换的宏单独执行上面的代码时,会出现编译错误。

那么第一个代码如何给出10010作为答案,而第二个代码却出现编译错误?


## 确保参数被连接。因此:f(100,10) 被预处理器替换为:10010 - Tomas
2

只在 #define 语句内部有效,并且除非该行以“#define [your stuff here]”开头,否则它“没有效果”,因为“#define”指示编译器特殊处理代码的那一部分。

- ActiveTrayPrntrTagDataStrDrvr
3个回答

15

预处理器连接运算符##在宏替换之前执行。它只能在宏体内使用。


完美。这就解释了为什么第二个代码没有起作用。谢谢。 - KP_K

1

## 运算符在预处理器中有特殊含义,它是一个令牌粘合运算符,可以将两个令牌“粘”在一起。因此,在您的情况下,gh 被“粘”在一起,形成了新的令牌 - 整型字面量 10010


1

在宏中有一些特殊字符,例如##,这些字符会改变规则“简单替换文本”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接