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
다르게 평가?
'정의 된 (foo)'이 전혀 작동한다는 것은 놀랍습니다. 함수 호출이 아닙니다. 이 경우()는 그룹화 연산자로 사용됩니다. 'foo'를 모두 묶어'defined '와는 거리를두고 그룹핑하는 것은 말이되지 않습니다. –
@ 존 : 16.1/1에서 명시 적으로 허용되는 형식이며, (정의 된 구현에서)'정의 된 foo'가 작동하는 모든 곳에서 작동합니다. –