2010-03-19 2 views
4

defined(X)을 포함하는 전처리 기 정의가 true로 평가되지는 않지만 (defined X)이됩니다. 이것은 MSVC9에서 발생합니다. 나는 다른 전처리기를 테스트하지 않았다. 간단한 예 :공간이없는 선처리 프로세서 정의에서 정의 된 (X)가 작동하지 않는 이유는 무엇입니까?

#define FEATURE0 1 
#define FEATURE1 0 
#define FEATURE2 1 

#define FEATURE3 (FEATURE0 && !FEATURE1 && (defined(FEATURE2))) 
#define FEATURE4 (FEATURE0 && !FEATURE1 && (defined FEATURE2)) 
#define FEATURE5 (FEATURE0 && !FEATURE1 && (defined (FEATURE2))) 

#if FEATURE3 
#pragma message("FEATURE3 Enabled") 
#elif (FEATURE0 && !FEATURE1 && (defined(FEATURE2))) 
#pragma message("FEATURE3 Enabled (Fallback)") 
#endif 

#if FEATURE4 
#pragma message("FEATURE4 Enabled") 
#elif (FEATURE0 && !FEATURE1 && (defined FEATURE2)) 
#pragma message("FEATURE4 Enabled (Fallback)") 
#endif 

#if FEATURE5 
#pragma message("FEATURE5 Enabled") 
#elif (FEATURE0 && !FEATURE1 && (defined (FEATURE2))) 
#pragma message("FEATURE5 Enabled (Fallback)") 
#endif 

컴파일러의 출력은 :

1> 특징 3
1> FEATURE4가
1> FEATURE5가

작업 경우

사용 사용 (대체) 사용 : defined (X)defined(X)defined X.
깨진 경우 : defined(X)

예에서 #if가지 경우에서와 같이 정의의 일부가, 상기 예에서의 #elif가지 경우와 같이, 직접 평가에 비해 이유 defined 다르게 평가?

+0

'정의 된 (foo)'이 전혀 작동한다는 것은 놀랍습니다. 함수 호출이 아닙니다. 이 경우()는 그룹화 연산자로 사용됩니다. 'foo'를 모두 묶어'defined '와는 거리를두고 그룹핑하는 것은 말이되지 않습니다. –

+0

@ 존 : 16.1/1에서 명시 적으로 허용되는 형식이며, (정의 된 구현에서)'정의 된 foo'가 작동하는 모든 곳에서 작동합니다. –

답변

5

defined#if#elif에 특정 적이다. 매크로 확장을 통해 사용할 때 동작은 정의되지 않습니다.

+1

이것은 올바른 대답이며 C++ 03 표준의 16.1/4에 명시되어 있습니다. –

3

defined(X)은 함수 호출 (a la sizeof(X))과 같이 해석되지 않으며 특수 언어 구문 분석기로 구문 분석됩니다. 이 파서는 defined을 독립 엔터티가 아닌 if 문에 대한 한정자로 인식합니다. defined(FEATURE2)을 사용하는 경우 defined을 키워드로 사용하지 않고 일반 객체 또는 #define d 엔티티 (이 경우 존재하지 않으므로 오류 발생)로 처리합니다. 나중에 elif 문 내부에서 사용하면 파서는이 키워드를 적절한 키워드로 취급합니다.

솔직히 말해서 defined(SOMETHING)이 어떤 경우에도 작동한다는 것을 알지 못했습니다.

1

C99 사양의 6.10.1.3에 따르면 으로 정의 된 키워드는 해당 표현식의 매크로 확장 전에 #if 표현식에 직접 나타나는 경우에만 인식됩니다. 매크로 확장 결과 키워드 으로 정의되면 결과는 정의되지 않습니다.

관련 문제