2013-08-19 3 views
0

안녕하세요 누구든지 나에게 DEBUG, NDEBUG ... 정의를 사용하는 것이 무엇인지 설명 할 수 있습니다. 예제를 제공 할 수 있습니다. 모든 아이디어 아이디어, 도움, suggetion 주셔서 감사합니다.Visual C++ CRT 디버깅

지금의 시점 무엇 : #define DEBUG 또는 #define NDEBUG

답변

1

당신이 그것을 사용하는이 처리기 정의는 일반적으로, 디버그 빌드에서 컴파일러에 의해 삽입됩니다. 예를 들어 디버그 문을 디버그 빌드에만 인쇄하고 릴리스 빌드에 포함하지 않을 수 있습니다. 당신은 프리 프로세서를 사용하여 해당를 얻을 수 있습니다

#ifdef _DEBUG 
    printf("Debug statement here, or other piece of code"); 
#endif 

printf 명령문은 디버그 빌드에 포함됩니다.

this question을 참조하십시오.

추가 설명 : cpp 파일을 실제로 컴파일하기 전에 전처리 기라는 프로그램에 전달됩니다. 이 작업은 예를 들어 #include 지시문을 적절한 파일의 내용으로 바꾸거나 코드의 매크로를 바꾸는 등의 방법으로 컴파일 할 파일을 준비하는 것입니다. 전처리 할 수있는 것들의

하나는 의지를 결정하는 것입니다 아니면 (참고 #if(def) #else #endif# 블록 사이에 감싸 코드의 블록을 포함하지 않을 것이다 -이 if/else C++ 문이 아닌 -.이 전 처리기 지시어

을 의 예를 들어, 당신이해야 할 디버깅 출력을 많이 가지고있는 프로그램이 있다고 가정 해 봅시다 :.

int foo() 
{ 
    cout << "Before doing something" << endl; 
    do_something(); 
    cout << "After doing something" << endl; 
} 

을 지금, 당신이 인쇄 생산 실행에 표시하지 않으을 먼저 당신이 갈 수 있다는 것입니다 이 모든 줄을 수동으로 주석 처리하십시오. 두 번째 방법은 전 처리기를 사용하여 당신을 위해 자동으로 수행 :

#define PRODUCTION_BUILD 

int foo() 
{ 
    #ifndef PRODUCTION_BUILD 
     cout << "Before doing something" << endl; 
    #endif 

    do_something(); 

    #ifndef PRODUCTION_BUILD 
     cout << "After doing something" << endl; 
    #endif 
} 

참고 :#ifndef 스탠드 "를 정의하지 않을 경우"를 참조하십시오.

이제 디버그 빌드에서 #define PRODUCTION_BUILD 만 제거하면 해당 줄이 컴파일러에 전달 될 파일에 포함됩니다. 프로덕션 빌드에서는이 정의를 그대로두면됩니다. 그러면 큐가 최종 exe에 포함되지 않습니다.

이제 컴파일러에서 생성 할 수있는 미리 정의 된 기호가 많이 있습니다. 하나는 Windows 버전이 될 수 있으며 디버깅 기호로 코드를 컴파일하거나 컴파일하지 않을 수 있습니다 (디버그 대 릴리스 버전). 이 기호의 이름은 _DEBUG입니다 (또는 NDEBUG, 내가 남긴 링크를 참조하십시오).

이제 코드는 다음처럼 간단 할 수있다 :

int foo() 
{ 
    #ifdef _DEBUG 
     cout << "Before doing something" << endl; 
    #endif 

    do_something(); 

    #ifdef _DEBUG 
     cout << "After doing something" << endl; 
    #endif 
} 

참고 : 우리는 지금 #ifdef하지 #ifndef을 사용하고 있습니다.

이제 귀하의 주문은 자동으로 디버그 버전에만 포함됩니다 (저희는 스스로 #define 기호를 사용할 필요가 없습니다).

참고 : 이것은 설명 목적으로 만 사용됩니다. 몇 줄마다 #ifdefs을 넣지는 않겠지 만, 예를 들어 릴리스 빌드에서 아무것도하지 않을 함수를 제공하고 (빈 몸체를 가질 것입니다) 디버그 버전으로 로그인 할 수 있습니다 .

+0

시험판 제공에 대해 자세히 설명해 주시겠습니까? – ProDev7

+0

나는 고마워한다. –

+1

추가적으로,'assert'는 이들 정의에 반응합니다. NDEBUG가 정의되면() 안의 표현식은 실행되지 않습니다. –