Подтвердить что ты не робот

#define DEBUG 1

Я пытаюсь включить режим отладки, если

#define DEBUG 1

Я хочу напечатать некоторые значения переменных, и если

#define DEBUG 0

Я хочу, чтобы они отключились.

Проблема в том, что у меня много файлов реализации, и я хочу, чтобы эта переменная DEBUG была доступна для всего проекта. Сейчас мне нужно отредактировать переменную DEBUG в foo1.c, foo2.c, foo3.c, которая кажется утомительной и подверженной ошибкам, и должен быть лучший способ. Любые предложения?

4b9b3361

Ответ 1

При компиляции вы должны указать опцию для своего компилятора. Например, вы можете вызвать GCC с опцией -DDEBUG.

В этом случае вам лучше использовать:

#ifdef DEBUG
#endif

или

#if defined(DEBUG)
#endif

если это не так, как вы это делаете сейчас. Я удивлен, что у вас нет глобального заголовочного файла для вашего проекта. Что-то вроде:

#ifdef DEBUG
#undef DEBUG
#endif
#define DEBUG 1

в файле с именем debug.h. В ваших программах на C вы можете включить это, используя #include "debug.h"

Ответ 2

Попробуйте что-то вроде Стива Макконнела в разделе 6 "Глава 8: Оборонительное программирование" из Code Complete 2... Добавьте это в свой код:

#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

Или, у вас есть глобальный заголовок, который определяет такие вещи, как это предлагали другие.

Ответ 3

В качестве ответа на вашу проблему вы также можете просто вызвать компилятор, например:

cc -c -DDEBUG=1 

или

 cc -c -DDEBUG=0

Вы должны удалить "define 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 является переменной, которая может быть глобальной (целая программа) или локальной/статической и должна быть инициализирована началом. Вы можете определить несколько параметров для всей программы или для каждого модуля. Это лучше и гибче, чем версия с переменной уровня.

Ex. module1.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() {}
...

foo3.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 в текстовом файле конфигурации, который читается при запуске программы.

Ответ 4

Поместите "#define DEBUG" в "debug.h" и #include этот заголовочный файл в каждом файле *.c.

Ответ 5

Как говорит @person-b, укажите это определение как параметр компилятора, например. -D DEBUG

Обратите внимание, что для упрощения этого теста вы должны изменить тест в своем коде:

#if DEBUG

в

#ifdef DEBUG

Таким образом вам не нужно беспокоиться о том, чтобы указать значение 0 или 1, но вместо этого можете полагаться на его определение или нет.

Ответ 6

Предложение от samoz и Stephen Doyle, чтобы проверить наличие определения DEBUG, а не его ценность, является хорошим. Однако, если вы действительно хотите использовать DEBUG = 0, так вы можете это сделать: каждый раз, когда вы определяете флаг DEBUG (т.е. В каждом файле), проверьте существующее определение:

#ifndef DEBUG
#define DEBUG 1
#endif

Затем, когда вы используете параметр -DDEBUG = 0 с вашим компилятором, строка #define никогда не будет выполнена.

Ответ 7

Попробуйте это вместо.

В первом файле, который у вас есть, будет включен:

#define DEBUG

Затем, когда вы хотите получить код отладки, сделайте следующее:

#ifdef DEBUG
do some stuff
#endif

Это также предотвратит создание кода отладки в коде выпуска.

Ответ 8

Мне лично нравится

#ifdef DEBUG
#define IFDEBUG if(0)else
#else
#define IFDEBUG if(1)else
#endif