【问题标题】:How to call a macro inside a macro?如何在宏内部调用宏?
【发布时间】:2015-09-26 10:12:29
【问题描述】:

是否可以这样在宏内部调用宏:

#include <stdio.h>
#define AA(a1, a2) a1, 3, 5, a2
#define BB(x, y1, y2, y3, y4) { printf("%d %d %d %d %d\n",x, y1, y2, y3, y4 ); }

int main ()
{
   int n = 21, k= 11;
   BB(31, AA(n,k));
}

此代码在编译时返回以下错误:

test_macro.c:在函数“main”中:
test_macro.c:9:18: erreur: 宏 « BB » 需要 5 个参数,mais seulement 2 ont été passés
test_macro.c:9:4: erreur: 'BB' undeclared (第一次在这个函数中使用)
test_macro.c:9:4:注意:每个未声明的标识符对于它出现的每个函数只报告一次

【问题讨论】:

  • 你真的错过了结尾}吗?
  • 当你尝试时会发生什么?
  • 省略宏后的分号,或者 - 更好 - 如果使用 gcc,将整个宏体(非标准)括起来以使其成为表达式。
  • 问题出在您的错误中。你已经用 5 个参数定义了 BB,当你调用它时只提供了 2 个。

标签: c macros


【解决方案1】:

您可能想要的是通过扩展AA(n,k) 来提供BB 的附加参数。正如 Sourav Ghosh 所指出的,在您的程序中,AA(n,k) 在作为单个参数传递给 BB 后被扩展。为了让它之前扩展,您可以使用更多的宏级别并将您的程序定义为:

#define AA(a1, a2) a1, 3, 5, a2
#define BB(x, y1, y2, y3, y4) { printf("%d %d %d %d %d\n",x, y1, y2, y3, y4 ); }
#define BBB(a,b) BB(a,b)

int main ()
{
  int n = 21, k= 11;
  BBB(31, AA(n,k));
}

【讨论】:

    【解决方案2】:

    在您的代码中,当遇到以下行时,在预处理阶段,

    BB(31, AA(n,k));
    

    根据 MA​​CRO 替换规则,首先,BB 将按照 replacement-list 中的指定进行扩展(替换),然后在替换列表中,如果有任何其他 MACRO 替换是可能(这里是AA),接下来会发生。

    问题出现了。 BB 的宏定义需要 5 个参数,但您只传递了 2 个参数,因为 AA 的扩展尚未发生。

    相关,来自C11,第 §6.10.3 章,宏替换(强调我的

    表单的预处理指令

      # define identifier replacement-list new-line
    

    定义了一个类对象宏,它使宏名称的每个后续实例都被构成指令其余部分的预处理标记的替换列表替换。 然后重新扫描替换列表以获取更多宏名称,如下所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多