2011-10-21 3 views
1

나는 오늘이 문제에 대해 조사한 결과,이 모든 것이 모두 C4353을 생성하는 유효한 진술임을 알게되었습니다. 내 유일한 추측은 C에서 멍청한 짓을하는 오래된 방법이라는 것입니다. 왜 이것이 오류가 아닌지. 언제 이것을 유용하게 사용할 수 있을까요?vs2010 C4353 왜이게 오류가 아닐까요

int main() 
{ 
    nullptr(); 
    0(); 
    (1 == 2)(); 
    return 0; 

} 
+0

C4353이란 무엇입니까 ?? –

+0

GCC-4.3.4는 [세 가지 모두에 대한 오류] (http://www.ideone.com/sy9cd)를 발행합니다. 이는 VC2010이 컴파일러 확장으로 지원한다는 것을 알 수 있습니다. –

+1

"이 모든 것이 모두 유효한 진술"이라는 의미는 무엇입니까? 적어도 하나 이상의 컴파일러,이 코드를 컴파일하는 Visual C++ 10.0 이외의 알고 있습니다. 추신. vs2010은 컴파일러의 이름이 아닙니다. "Vim에서이 코드를 컴파일합니다."... :-) – mloskot

답변

3

상수 0을 함수 식으로 사용하면 Microsoft에만 해당되는 확장입니다. 그들은 이유를 알기 때문에 이것을 구체적으로 구현했는데, 오류로 취급하는 것이 왜 이치에 맞지 않는지 설명합니다. 하지만 표준이 아니기 때문에 컴파일러는 경고를 내 보냅니다.

__noop()을 사용하는 대신 사용할 수 있습니다.

1

이 모든 :

nullptr(); 
    0(); 
    (1 == 2)(); 

(그들은 아무것도하지 의미)에는 조합 문 없다.

btw 나는 경고를 무시하지 않기를 바랍니다. 대부분의 경우 모든 경고를 수정하는 것이 좋습니다.

+0

나는 프로젝트를 수행하지 않는다. – rerun

1

으로는 C4353 warning page에와 __noop intrinsic documentation에 설명 된 함수 표현식으로 0의 사용은 함수 호출을 무시하지만 여전히 (부작용) 인수를 평가하는 코드를 생성하려면 Microsoft C++ 컴파일러에 지시합니다.

#if DEBUG 
    #define PRINT printf_s 
#else 
    #define PRINT __noop 
#endif 

int main() { 
    PRINT("\nhello\n"); 
} 
0

MSDN page 그 경고에 대한 충분한 설명하고 있습니다

주어진 예

DEBUG 처리기 심볼의 값에 따라, __noop 또는 인쇄 기능에 #defined 중 하나를 얻을 추적 매크로입니다 동기 부여 예제 :

// C4353.cpp 
// compile with: /W1 
void MyPrintf(void){}; 
#define X 0 
#if X 
    #define DBPRINT MyPrint 
#else 
    #define DBPRINT 0 // C4353 expected 
#endif 
int main(){ 
    DBPRINT(); 
} 

알 수 있듯이 고풍 매크로 사용을 지원하는 것입니다.