#define DEBUG 1 - PullRequest
       30

#define DEBUG 1

26 голосов
/ 12 июня 2009

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

#define DEBUG 1

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

#define DEBUG 0

Я хочу их снять.

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

Ответы [ 8 ]

77 голосов
/ 12 июня 2009

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

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

#ifdef DEBUG
#endif

или

#if defined(DEBUG)
#endif

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

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

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

15 голосов
/ 12 июня 2009

Попробуйте что-нибудь подобное, предложенное Стивом МакКоннелом в разделе 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

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

5 голосов
/ 13 июня 2009

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

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 голосов
/ 12 июня 2009

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

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

#if DEBUG

до:

#ifdef DEBUG

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

4 голосов
/ 12 июня 2009

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

2 голосов
/ 12 июня 2009

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

#ifndef DEBUG
#define DEBUG 1
#endif

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

1 голос
/ 12 июня 2009

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

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

#define DEBUG

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

#ifdef DEBUG
do some stuff
#endif

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

0 голосов
/ 12 июня 2009

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

#ifdef DEBUG
#define IFDEBUG if(0)else
#else
#define IFDEBUG if(1)else
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...