Несмотря на то, что это закончилось какое-то время, я все еще хотел бы испытать эти вызовы игры в гольф кода ...
Лучшее, что я мог сделать с MATLAB: 383 символов (после удаления пробелов и символов продолжения строки)
a = {'twelve drummers drumming';...
'eleven pipers piping';...
'ten lords a-leaping';...
'nine ladies dancing';...
'eight maids a-milking';...
'seven swans a-swimming';...
'six geese a-laying';...
'five gold rings';...
'four calling birds';...
'three french hens';...
'two turtle doves and';...
'a partridge in a pear tree.';’’};
b = {'st','nd','rd','th'};
for i = 1:12,...
disp(char(['On the ',num2str(i),b{min(i,4)},...
' day of Christmas my true love gave to me'],...
a{13-i:13}));...
end
При компиляции вы должны иметь возможность указать параметр для вашего компилятора. Например, вы можете вызвать GCC с опцией -DDEBUG
.
В этом случае вам лучше использовать:
#ifdef DEBUG
#endif
или:
#if defined(DEBUG)
#endif
, если это не так, как вы сейчас делаете. Я удивлен, что у вас нет глобального файла заголовка для вашего проекта. Что-то вроде:
#ifdef DEBUG
#undef DEBUG
#endif
#define DEBUG 1
в файле с именем «debug.h». В свои программы на C это можно включить, используя #include "debug.h"
Try something like Steve McConnel suggests in section 6 of "Chapter 8: Defensive Programming" from Code Complete 2... Add this to your code:
#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
Then when you compile, add this flag (warning: This might be compiler-dependent):
-DDEBUG=m
Or, have a global header that defines these sorts of things, as others have suggested.
В ответ на вашу проблему вы также можете просто вызвать компилятор, например:
cc -c -DDEBUG=1
или
cc -c -DDEBUG=0
. Вы должны удалить «define DEBUG 1/0» в своих файлах - или заменить его с:
#ifndef DEBUG
#define DEBUG 0
#endif
Вот что я использую (синтаксис GCC):
создайте файл debug.h со следующим содержанием и включите его в каждый файл c:
#ifdef DEBUG
внешний ФАЙЛ * dbgf;
#define D_MIN 0x00010000 // Минимальный уровень
#define D_MED 0x00020000 // Средний уровень
#define D_MAX 0x00040000 // Максимальный уровень
#define D_FLUSH 0x00080000 // Полезно при сбое программы
#define D_TRACE 0x00100000
#define D_1 0x00000001
...
#define D (msk, fmt, args ...) if (msk & dbgmsk) {fprintf (dbgf, "% s:", __ FUNCTION__); fprintf (dbgf, fmt, ## args); если (msk & D_FLUSH) fflush (dbgf); }
# определить P (msk, fmt, args ...) if (msk & dbgmsk) {fprintf (dbgf, fmt, ## args); если (msk & D_FLUSH) fflush (dbgf); }
#else
# определить D (msk, fmt, args ...)
# определить P (msk, fmt, args ...)
#endif
dbgmsk - это переменная, которая может быть глобальной (вся программа) или локальной / статической и должна быть инициализирована при запуске. Вы можете определить несколько опций для всей программы или для каждого модуля. Это лучше и гибче, чем версия с переменной уровня.
Пример. 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
Пример. main:
#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
to:
#ifdef DEBUG
Таким образом, вам не нужно беспокоиться об указании значения 0 или 1, а вместо этого можно полагаться на его определение или нет.
Поместите "#define DEBUG" в "debug.h" и #include этот файл заголовка в каждом файле * .c.
Предложение Samoz и Стивена Дойла проверить наличие определения для DEBUG, а не его значение, является хорошим. Однако, если вы действительно хотите использовать DEBUG = 0, вы можете это сделать следующим образом: каждый раз, когда вы определяете флаг DEBUG (то есть в каждом файле), проверяйте существующее определение:
#ifndef DEBUG
#define DEBUG 1
#endif
Затем, когда вы используете параметр -DDEBUG = 0 с вашим компилятором, строка #define никогда не будет выполнена.
Попробуйте вместо этого.
В первый файл, который у вас есть, будет включен:
#define DEBUG
Затем, когда вы захотите получить код отладки, сделайте следующее:
#ifdef DEBUG
do some stuff
#endif
Это также предотвратит ваш код отладки не превратился в код выпуска.
Мне лично нравится
#ifdef DEBUG #define IFDEBUG if(0)else #else #define IFDEBUG if(1)else #endif