sourcecode

#DEBUG 정의 1

codebag 2023. 10. 5. 21:34
반응형

#DEBUG 정의 1

디버깅 모드를 켜려고 하는데 만약에

#define DEBUG 1

나는 몇가지 변수 값을 출력하고 싶습니다. 그리고 만약

#define DEBUG 0

저는 그들을 떼어내길 원합니다.

문제는 제가 구현 파일을 많이 가지고 있는데 이 DEBUG 변수를 전체 프로젝트에 사용할 수 있기를 원한다는 것입니다.지금 당장 지루하고 오류가 많은 것처럼 보이는 foo1.c, foo2.c, foo3.c의 DEBUG 변수를 편집해야 하는데 더 좋은 방법이 있을 것입니다.좋은 의견이라도 있나?

컴파일할 때 컴파일러에 옵션을 지정할 수 있어야 합니다.예를 들어, GCC에 전화를 걸 수 있습니다.-DDEBUG선택.

이 경우 다음을 사용하는 것이 좋습니다.

#ifdef DEBUG
#endif

또는:

#if defined(DEBUG)
#endif

당신이 지금 하는 방식이 아니라면요프로젝트의 글로벌 헤더 파일이 없다는 것이 놀랍습니다.다음과 같은 것들이 있습니다.

#undef DEBUG
#define DEBUG 1

debug라는 파일에 저장되어 있습니다.h). 당신의 C 프로그램에서 당신은 다음을 사용하여 이것을 포함할 수 있습니다.#include "debug.h"

스티브 맥코넬이 코드 컴플리트 2의 "제8장: 방어적 프로그래밍" 섹션 6에서 제안한 것과 같은 것을 시도해 보세요.코드에 추가합니다.

#ifdef DEBUG
#if (DEBUG > 0) && (DEBUG < 2)
printf("Debugging level 1");
#endif

#if (DEBUG > 1) && (DEBUG < 3)
printf("Debugging level 2");
#endif

#if (DEBUG > n-1) && (DEBUG < n)
printf("Debugging level n");
#endif
#endif

그런 다음 컴파일할 때 이 플래그를 추가합니다(경고:컴파일러 의존적일 수 있음):

-DDEBUG=m

또는 다른 사람들이 제안한 것처럼 이러한 종류의 것들을 정의하는 글로벌 헤더를 갖습니다.

당신의 문제에 대한 대응으로 간단히 다음과 같이 컴파일러를 호출할 수도 있습니다.

cc -c -DDEBUG=1 

아니면

 cc -c -DDEBUG=0

파일에서 "정의 DEBUG 1/0"을 삭제하거나 다음 항목으로 대체해야 합니다.

#ifndef DEBUG
#define DEBUG 0
#endif

제가 사용하고 있는 것(GCC 구문)은 다음과 같습니다.

  • 다음 내용으로 debug.h 파일을 만들어 각 c 파일에 포함합니다.

    #ifdef DEBUG
    extern FILE *dbgf;
    #define D_MIN   0x00010000  // Minimum level
    #define D_MED   0x00020000  // Medium level
    #define D_MAX   0x00040000  // Maximum level 
    #define D_FLUSH 0x00080000  // Usefull by a program crash
    #define D_TRACE 0x00100000  
    #define D_1     0x00000001  
    ...
    
    #define D(msk, fmt, args...) if(msk & dbgmsk) { fprintf(dbgf, "%s:",__FUNCTION__); fprintf(dbgf, fmt, ## args ); if(msk & D_FLUSH) fflush(dbgf); }
    #define P(msk, fmt, args...) if(msk & dbgmsk) { fprintf(dbgf, fmt, ## args ); if(msk & D_FLUSH) fflush(dbgf); }
    
    #else
    #define D(msk, fmt, args...)
    #define P(msk, fmt, args...)
    #endif
    

dbgmsk는 변수이며, 이 변수는 글로벌(whole 프로그램)이거나 로컬/정적일 수 있으며 시작을 초기화해야 합니다.전체 프로그램 또는 각 모듈에 대한 여러 옵션을 정의할 수 있습니다.레벨 변수가 있는 버전보다 더 우수하고 유연합니다.

Ex. 모듈 1.c:

#include "debug.h"

static int dbgmsk;  // using local dbgmsk
module1_setdbg(int msk) { dbgmsk = msk; D(D_TRACE,"dbgmsk1=%x\n", dbgmsk); }

foo1() {  P(D_1, "foo1 function\n" ); 
  ....
}
foo2() {}
...

fo3.c

#include "debug.h"
extern int dbgmsk; // using global dbgmsk

Ex. 주:

#include "debug.h"
FILE *dbgf;
int dbgmsk = 0; // this is the global dbgmsk

int main() { 
  dbgf = stderr; // or your logfile
  dbgmsk = D_MIN;
  module1_setdbg(D_MIN|D_MED|D_TRACE|D_1);
  ....
}

또한 프로그램 시작 시 읽혀지는 구성 텍스트 파일에 모든 dbgmsk 변수를 저장하고 있습니다.

@person-b가 말하는 대로 컴파일러 옵션으로 이 정의를 지정합니다. 예: -D DEBUG

이를 단순화하려면 코드의 테스트를 다음과 같이 변경해야 합니다.

#if DEBUG

대상:

#ifdef DEBUG

이렇게 하면 0 또는 1 값을 지정할 필요가 없으며 대신 정의 여부에 의존할 수 있습니다.

"디버그"에 "#defin DEBUG"를 넣습니다.h" 및 #는 각 *.c 파일에 해당 헤더 파일을 include합니다.

samoz와 Stephen Doyle이 DEBUG의 가치보다는 정의의 존재 여부를 확인해 보라고 제안한 것은 좋은 것입니다.그러나 DEBUG=0을 정말로 사용하고 싶다면 다음과 같이 할 수 있습니다. DEBUG 플래그를 정의할 때마다(즉, 각 파일에서) 기존 정의를 확인하십시오.

#ifndef DEBUG
#define DEBUG 1
#endif

그런 다음 컴파일러에서 -DEBUG=0 옵션을 사용하면 # define 라인이 실행되지 않습니다.

대신에 이걸 먹어보세요.

사용자가 가지고 있는 첫 번째 파일에는 다음과 같은 내용이 포함됩니다.

#define DEBUG

그런 다음 디버그 코드를 갖고 싶을 때마다 다음 작업을 수행합니다.

#ifdef DEBUG
do some stuff
#endif

이렇게 하면 디버깅 코드가 릴리스 코드로 변환되지 않게 됩니다.

저는 개인적으로 좋아하는.

#ifdef DEBUG#만약 (0)다른 경우 IFDEBUG 정의# ##만약 (1)다른 경우 IFDEBUG 정의#엔디프

언급URL : https://stackoverflow.com/questions/987637/define-debug-1

반응형