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