如何调用宏内的宏?

时间:2015-07-08 13:09:51

标签: c macros

是否可以通过这种方式在宏内调用宏:

#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));
}

此代码返回编译中的followinf错误:

  

test_macro.c:在函数'main'中:
  test_macro.c:9:18:erreur:宏“BB”请求5个论点,mais seulement 2ontétépassés
  test_macro.c:9:4:erreur:'BB'未声明(首次使用此功能)
  test_macro.c:9:4:注意:每个未声明的标识符仅针对它出现的每个函数报告一次

2 个答案:

答案 0 :(得分:5)

您可能想要的是通过扩展AA(n,k)来提供AA(n,k)的其他参数。正如Sourav Ghosh指出的那样,在你的程序中,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)); } 作为单个参数后被扩展。要在之前扩展它,您可以再使用一个宏级别并将程序定义为:

trayIcon.Icon = new Icon("c:\\users\\wulp\\documents\\visual studio 2013\\Projects\\WifiSwitch\\WifiSwitch\\Resources\\icon.ico");

答案 1 :(得分:3)

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

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

根据MACRO替换规则,首先,BB将按照替换列表中的指定进行扩展(替换),然后,在替换列表中,如果有任何其他MACRO可以进行替换(此处为AA),接下来会进行替换。

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

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

  

表单

的预处理指令
  # define identifier replacement-list new-line
     

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