[英]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,宏擴展如下進行:
您指定的代碼的步驟順序如下:
BAR(BAZ)
FOO(3,7,1)
((3)*(7)*(1))
所以海灣合作委員會是對的,VC不是。 但VC抱怨的錯誤是FOO
有3個參數而BAR
只指定了2個參數。 VC顯然試圖盡快發現錯誤並且有點太過分了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.