【问题标题】:Macro function call from within printf statement in C从 C 中的 printf 语句中调用宏函数
【发布时间】:2012-11-26 09:11:53
【问题描述】:

我在理解 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
  • ## 仅在您的#define 语句中有效并且“无效”,除非该行以“#define [your stuff here]”开头,因为“#define”是指示编译器的内容专门处理那部分代码。

标签: c c-preprocessor


【解决方案1】:

预处理器连接运算符## 在宏被替换之前完成。它只能用于宏体中。

【讨论】:

  • 完美。这就解释了为什么第二个代码不起作用。谢谢
【解决方案2】:

运算符## 对预处理器具有特殊意义,它是一个将两个令牌“粘合”在一起的令牌粘贴运算符。因此,在您的情况下,gh 被“粘合”在一起,从而产生了新的令牌 - int 文字 10010

【讨论】:

    【解决方案3】:

    宏中有一些特殊字符(如##)会更改“仅替换文本”规则。

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      相关资源
      最近更新 更多