매크로를 기반으로 조건부로 코드를 컴파일하려고합니다.C++ 매크로를 조건부로 컴파일하려면?
#if DEBUG
#define START_BLOCK(x) if(DebugVar(#x) \
{ char debugBuf[8192];
#define END_BLOCK() printf("%s\n", debugBuf); }
#else
#define START_BLOCK(x) (void)0;
#define END_BLOCK() (void)0;
#endif
문제는 DEBUG
가 정의되어있는 경우 당신이 좋아하는 일을 할 수 있다는 것입니다 : 기본적으로 나는 (실제 버전에서 간체)과 같은 매크로가
START_BLOCK(test)
char str[] = "Test is defined";
strcpy(debugBuf, str);
END_BLOCK()
START_BLOCK(foo)
char str[] = "Foo is defined";
strcpy(debugBuf, str);
END_BLOCK()
을 그리고 모든 각 있기 때문에 잘 작동 블록이 자체 범위 안에 있습니다. 그러나 DEBUG가 정의되어 있지 않으면 두 번째 블록에서 str
의 재정의를 얻게됩니다. (그럼 당신은 또한 debugBuf
가 정의되지 얻을 것이라고하지만 단순화 된 예에 불과 부작용입니다.) 내가하고 싶은 무엇
는 #else가 될 것입니다 뭔가 같은 :
#else
#define START_BLOCK(x) #if 0
#define END_BLOCK() #endif
#endif
또는 시작/끝 블록 사이에 아무것도없는 다른 방법이 컴파일됩니다. 나는 위를 시도, 나는 또한 라인을 따라 뭔가를 시도 :
#else
#define NULLMACRO(...) (void)0
#define START_BLOCK(x) NULLMACRO(
#define END_BLOCK())
#endif
행운을하지 않고.
이 방법이 효과가 있습니까? 방금 저에게 일어난 한가지 생각은 제가 최적화 컴파일러를 남용하여 사용할 수 있다는 것입니다.
#else
#define START_BLOCK(x) if(0){
#define END_BLOCK() }
#endif
그리고 블록을 완전히 컴파일하는 것으로 믿으십시오. 다른 해결책이 있습니까?
'if (0)'괜찮습니다. –