簡體   English   中英

如何調用宏內的宏?

[英]How to call a macro inside a macro?

是否可以通過這種方式在宏內調用宏:

#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:注意:每個未聲明的標識符僅針對它出現的每個函數報告一次

您可能想要的是通過擴展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));
}

在您的代碼中,遇到以下行時,在預處理階段,

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

根據MACRO替換的規則,首先, BB將按照替換列表中的指定進行擴展(替換),然后,在替換列表中,如果可以進行任何其他MACRO替換(此處為AA ),則接下來將進行。

出現了問題。 的宏定義BB需要5個參數,但你只有2正在傳遞,因為,擴大AA未能成行呢。

相關的,從C11 ,章節§6.10.3,宏觀替換( 強調我的

表單的預處理指令

  # define identifier replacement-list new-line 

定義一個類似對象的宏,它使宏名稱的每個后續實例被構成指令其余部分的預處理標記的替換列表替換。 然后重新掃描替換列表以獲取更多宏名稱,如下所示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM