#define ОТЛАЖИВАЮТ 1

Несмотря на то, что это закончилось какое-то время, я все еще хотел бы испытать эти вызовы игры в гольф кода ...

Лучшее, что я мог сделать с 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
27
задан Stu 12 June 2009 в 16:26
поделиться

8 ответов

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

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

#ifdef DEBUG
#endif

или:

#if defined(DEBUG)
#endif

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

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

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

78
ответ дан 28 November 2019 в 04:04
поделиться

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.

15
ответ дан 28 November 2019 в 04:04
поделиться

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

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

6
ответ дан 28 November 2019 в 04:04
поделиться

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

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

#if DEBUG

to:

#ifdef DEBUG

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

4
ответ дан 28 November 2019 в 04:04
поделиться

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

4
ответ дан 28 November 2019 в 04:04
поделиться

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

#ifndef DEBUG
#define DEBUG 1
#endif

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

2
ответ дан 28 November 2019 в 04:04
поделиться

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

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

#define DEBUG

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

#ifdef DEBUG
do some stuff
#endif

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

1
ответ дан 28 November 2019 в 04:04
поделиться

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

#ifdef DEBUG
#define IFDEBUG if(0)else
#else
#define IFDEBUG if(1)else
#endif
0
ответ дан 28 November 2019 в 04:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: