2011-12-30 3 views
4

명령 행에서 자세한 정보 수준을 지정하는 시스템이 있습니다.전처리 기가 코드 블록을 처리하도록하기

#ifdef DEBUG 
if (verbose_get_bit(verbose_level_1)) { 
    // arbitrary debugging/printing style code generally goes in here, e.g.: 
    printf("I am printing this because it was specified and I am compiling debug build\n"); 
} 
#endif 

내가 그래서 여기까지 설정이 덜 지루한하고 싶습니다 지금까지이 작업은 다음과 같습니다 : 내 기능에서 나는 코드 블록 여부를 입력하면 결정하기 위해 지정된 있었는지에 대해 확인

이제
// from "Verbose.h" 
bool verbose_get_bit(verbose_group_name name); // verbose_group_name is an enum 
#ifdef DEBUG 
#define IF_VERBOSE_BIT_D(x) if (verbose_get_bit(x)) 
#else // not debug: desired behavior is the entire block that follows gets optimized out 
#define IF_VERBOSE_BIT_D(x) if (0) 
#endif // not debug 

,이 작업을 수행 할 수 있습니다 : 그것은 경우 문처럼, 그것은, 그것은 매크로의 것이 분명는 IF 문으로 기능하고, 그렇지 않은 보이기 때문에

IF_VERBOSE_BIT_D(verbose_GL_debug) { 
    printf("I don't want the release build to execute any of this code"); 
    glBegin(GL_LINES); 
    // ... and so on 
} 

좋아요 릴리스 빌드에서 실행하십시오.

if(false) 블록으로 래핑 될 것이므로 코드가 최적화 될 것이라고 확신 할 수 있지만 실제로는 전체 블록을 버리는 전처리기를 얻을 수있는 방법이 있다면 선호합니다. 할 수 있습니까?

+0

'verbose_get_bit'에 대한 인수를 넘어 명세서에서 달라질 수있는 내용이 있는지 확인하십시오. – outis

+0

@ BrianTompsett- 汤 莱恩 : C++에서 작동하지 않습니까? – usr2564301

답변

2

매크로에서 전체 블록을 래핑하지 않으면 어떻게 할 수 있을지 생각할 수 없습니다.

그러나 이것은 당신을 위해 작동 할 수 있습니다 :

실제로
#if DEBUG 
#define IF_VERBOSE_BIT_D(x) {x} 
#else 
#define IF_VERBOSE_BIT_D(x) 
#endif 

IF_VERBOSE_BIT_D(
    cout << "this is" << endl; 
    cout << "in verbose" << endl; 
    printf("Code = %d\n", 1); 
) 

컴파일러가 if (0)을 최적화 할 수 있어야하지만, 블록 내부의 코드를 모두 컴파일되지 않습니다 때 나는 종종 이와 비슷한 일을 할 디버그 모드가 아닐 때.

+0

전체 블록이 매크로 인수로 사용될 수 있다는 것을 알지 못했습니다. 다중 인수가있는 매크로가 정의되어 있고 해당 매크로로 전송 된 블록 중간에 쉼표가 있으면 어떻게됩니까? 비용을 불문하고, 이것은 확실히 이상한보고 있지만 확실히 옵션입니다. –

+0

블록의 쉼표로도 어딘가에 실제로 작동합니다. 어느 쪽이든, 하나 이상의 문장을 원한다면'{}'로 묶어야합니다. – Mysticial

+0

그래서 전처리 기는'{}'에 따라 범위를 추적 할 것입니까? 알아 둘만한. –

1

방금 ​​전에했던 것처럼 깔끔하게 보이지 않습니다. 걱정하지 마세요. 컴파일러는 if(0) 블록을 완전히 최적화합니다.

당신이 원한다면 설명하고 컴파일하면서 프로그램을 작성하여 이것을 점검 할 수 있습니다. 그런 다음 if(false) 블록을 제거하면 MD5 해시로 표시된 것과 똑같은 2 진수로 컴파일해야합니다. 하지만 그건 필요하지 않습니다, 당신의 컴파일러가 알아낼 수 있다고 약속드립니다!

+0

확인하는 것이 좋은 방법입니다. 감사! –

+0

많은 컴파일러 (VC++ 포함)는 컴파일이 반복되면 동일한 소스의 바이트 단위로 동일한 바이너리를 _not_ 생성하지 않습니다. – ildjarn

+0

사실,하지만 프로그램을 가능한 단순하게 만들면 더 많이 할 수 있습니다. – Dan

-1

if 문에서 "false & &"으로 시작하는 조건을 만들면 완전히 비활성화 할 수 있습니다. 최적화없이 컴파일하지 않으면 컴파일러는 일반적으로 불량 코드를 제거합니다.

+0

빠른 방법으로 여러 가지 경우에이 작업을 확실히 수행했습니다. " 밖으로 "어떤 코드. –

관련 문제