代碼:宏的實際參數太多?
#include <iostream>
using namespace std;
#define ADD(x,y) ((x)+(y))
int main(int argc, char** argv)
{
cout << ADD(1,2,) << endl;
return 0;
}
編譯器輸出:
1>Compiling...
1>main.cpp
1>c:\warn_test\main.cpp(9) : warning C4002: too many actual parameters for macro 'ADD'
爲什麼沒有這樣的錯誤?
g++ (GCC) 4.2.1 20070719 [FreeBSD]
給出更合理的(在我心中)輸出:
main.cpp:9:18: error: macro "ADD" passed 3 arguments, but takes just 2
main.cpp: In function 'int main(int, char**)':
main.cpp:9: error: 'ADD' was not declared in this scope
雖然我不能完全確定什麼或者編譯器認爲第三個參數是。
編輯:添加完整的gcc
輸出和版本信息。
我懷疑沒有很好的理由,MSDN頁面http://msdn.microsoft.com/en-us/library/y37zb304表明它根據編譯器版本而變化,無論它是警告還是錯誤。也許是爲了支持某些依賴於它的只是一個警告的可惡的遺留代碼。第三個參數是一個0長度的令牌序列,如果有第三個宏參數,可以將其替換爲宏擴展。請注意,標準允許實現編譯具有任何特定於實現的含義的代碼,只要它們發佈診斷,所以它是「古怪」而不是「錯誤」。 – 2011-03-09 16:20:06
什麼是錯誤或警告是可配置的。您的抱怨是否說不同的編譯器有不同的默認值?這將很容易解決你的項目設置! – 2011-03-09 17:08:16