#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 인 토큰 시퀀스이며 세 번째 매크로 인수가있는 경우 매크로 확장으로 대체 될 수 있습니다. 표준에서는, 실장이, 진단을 발행하면 (자), 구현 고유의 의미를 가지는 무효 인 코드를 컴파일 할 수 있도록 (듯이)하고 있습니다. 따라서, 「잘못했다」가 아닌 「기발한」것이됩니다. –
오류 또는 경고를 구성 할 수있는 대상은 무엇입니까? 다른 컴파일러가 다른 기본값을 가지고 있다는 불만이 있습니까? 프로젝트 설정에서 쉽게 수정할 수 있습니다! –