#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
'sourcecode' 카테고리의 다른 글
mysql java 프로그램에서 works를 선택, 삽입 및 삭제하지만 업데이트가 작동하지 않습니다. (0) | 2023.10.05 |
---|---|
워드프레스 테마를 위한 옵션 트리를 통합하는 방법 (0) | 2023.10.05 |
각도가 문서를 업데이트하기 전에 이미지를 찾을 수 없습니다. (0) | 2023.10.05 |
$exceptionHandler에서 $location - 종속성 충돌 (0) | 2023.10.05 |
mysql 루트 사용자 권한 손실 (0) | 2023.10.05 |