簡體   English   中英

預處理器宏作為其他宏的參數

[英]Preprocessor macros as parameters to other macros

以下C ++代碼編譯並作為GCC上的程序員工作(4.0.4)

#define FOO(x,y,z) ((x)*(y)*(z))
#define BAR(x) FOO(x,1)
#define BAZ 3,7

int main()
{
    return BAR(BAZ); /* interpreted as return ((3)*(7)*(1)); */
}

但是,宏在Microsoft Visual C ++ Express 2010上導致錯誤:

main.cpp(7):警告C4003:宏'FOO'的實際參數不夠
main.cpp(7):錯誤C2059:語法錯誤:')'

問題似乎是Microsoft編譯器在內部處理BAR宏時,不會將BAZ宏擴展為可用作宏FOO的兩個獨立參數的參數。

根據標准,哪個編譯器正確處理了這種情況?

根據ISO / IEC 14882:2003(C ++ Stardard)的16.3.4,宏擴展如下進行:

  1. 宏調用將替換為宏的替換列表(正文),其中每個參數名稱(除非受#或##影響)將替換為宏調用中指定的相應參數的完整宏擴展。
  2. 重新掃描步驟1的結果 如果其中有更多的宏調用(除了那些已經擴展獲得正在考慮的文本的宏調用),它們將根據遞歸的相同過程進行擴展。

您指定的代碼的步驟順序如下:

  1. BAR(BAZ)
  2. FOO(3,7,1)
  3. ((3)*(7)*(1))

所以海灣合作委員會是對的,VC不是。 但VC抱怨的錯誤是FOO有3個參數而BAR只指定了2個參數。 VC顯然試圖盡快發現錯誤並且有點太過分了。

暫無
暫無

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

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