2011-09-10 5 views
4

매크로를 기반으로 조건부로 코드를 컴파일하려고합니다.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 

그리고 블록을 완전히 컴파일하는 것으로 믿으십시오. 다른 해결책이 있습니까?

+2

'if (0)'괜찮습니다. –

답변

5

그래서 조건부 블록을 자신의 범위로 만들고 싶습니까?

는 여기를 멀리 최적화 컴파일러에 의존하는 매우 읽기 해결책 :

#define DEBUG 1 

if (DEBUG) { 
    // ... 
} 

을 그리고 여기 전처리 전용 하나입니다 : 수동

#define DEBUG 1 

#ifdef DEBUG 
    #define IFDEBUG(x) {x} 
#else 
    #define IFDEBUG(x) 
#endif 

IFDEBUG(
    // ... 
) 

또는 :

#define DEBUG 1 

#ifdef DEBUG 
{ 
    // ... 
} 
#endif 
+0

나는 원래 원래 중간에 하나의 문제가 있었는데 문제는 gcc와 Visual Studio가 var args를 0 또는 1 arg로 처리하는 방법이었습니다. 간소화 된 예제에서는 다루지 않았습니다. –

+0

@ Doug-W : 누가 varargs에 대해 이야기하고 있습니까? – orlp

+0

글쎄, 표현에 쉼표가 있으면 중간 문장이 작동하지 않습니다. 그리고 쉼표를 포함하는 코드 블록이 꽤 일반적입니다. 그 주위의 한 가지 방법은 varargs (모든 것은 쉼표와 모든 것을 포함합니다)이지만 varargs는 인수가 적은 경우를 잘 처리하지 않습니다. – AHelps

1

겠습니까 :

#if DEBUG 
    #define START_BLOCK(x) if(DebugVar(#x) \ 
     { char debugBuf[8192]; 
    #define END_BLOCK() printf("%s\n", debugBuf); } 
#else 
    #define START_BLOCK(x) { 
    #define END_BLOCK() } 
#endif 

합니까?

관련 문제