2009-06-17 4 views
1

Из того, что я понимаю, утверждается, что это макрос в C и предположительно, если вы используете его во время компиляции, но оставьте его отключенным, тогда не будет накладных расходов (что может быть неверно, я не знаю). Проблема для меня заключается в том, что то, что я хотел бы сделать, это получить все переменные, переданные моей функции, и распечатать этот вывод, но только если я хочу, чтобы отладка была включена. Вот то, что я до сих пор:Есть ли более простой способ, чем использование #ifdef в C?

int exampleFunction (int a, int b) 
{ 
    #ifdef debugmode 
    printf("a = %i, b = %i", a, b); 
    #endif 
} 

мне интересно, если есть какой-либо проще (и менее уродливый) способ сделать что-то вроде этого. xdebug для php имеет эту функцию, и я нашел, это экономит мне огромное количество времени при отладке, поэтому я хочу сделать это для каждой функции.

Благодаря

+1

в Assert() макрос отключен полностью, если NDEBUG определен, поэтому, если это определено в режиме деблокирования, накладных расходов не будет. –

ответ

11

попробовать это:

#ifdef debugmode 
#define DEBUG(cmd) cmd 
#else 
#define DEBUG(cmd) 
#endif 


DEBUG(printf("a = %i, b = %i", a, b)); 

сейчас, если у вас есть debugmode определены, вы получите ваше заявление для печати. в противном случае он никогда не появляется в двоичном формате.

+0

К сожалению, у вас остался бесполезный вызов функции на своем месте, но я в этой борьбе стараюсь быть менее пуристом. – Kai

+0

+1 Мой выбор, а – Tom

+0

Мда это оставило меня с ошибкой составитель: 'B» необъявленной (первое использование этой функции) Не знаю, почему –

0

Вы можете определить PRINTF_IF_DEBUGGING, как

#ifndef NDEBUG 
#define PRINTF_IF_DEBUGGING(X) printf(X) 
#else 
#define PRINTF_IF_DEBUGGING(X) 
#endif 

Это позволит централизовать #ifdefs только в одном месте.

+0

Это не сработает, если printf требуется более одного аргумента. – eduffy

+0

Справа. Если вы не используете переменные макросы, решение должно быть больше похоже на '#define FOO (X) printf X', который будет использоваться как' FOO ((«% some», args)); ' – ephemient

1
if (MY_DEBUG_DEFINE) { 
     do_debug_stuff(); 
} 

Любая половина достойного компилятора оптимизирует блок. Обратите внимание, что вам нужно определить MY_DEBUG_DEFINE как булево (то есть 0 или нет 0).

#define MY_DEBUG_DEFINE defined(NDEBUG) 

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

3

Использование GCC, мне очень нравится добавлять, в файл:

#if 0 
#define TRACE(pattern,args...) fprintf(stderr,"%s:%s/%u" pattern "\n",__FILE__,__FUNCTION__,__LINE__,##args) 
#else 
#define TRACE(dummy,args...) 
#endif 

, а затем в коде:

i++; 
TRACE("i=%d",i); 

i будет распечатан только тогда, когда я активировать TRACE() макрос в верхней части файла. Работает очень хорошо, плюс он печатает исходный файл, строку и функцию, которые произошли.

0

Ну, проблема с макросами типа PRINT_DEBUG, приведенными здесь, заключается в том, что они разрешают только один параметр. Для правильного printf() нам понадобятся несколько, но макросы C не (в настоящее время) допускают переменные аргументы.

Итак, чтобы снять это, нам нужно проявить творческий подход.

#ifdef debugmode 
    #define PRINTF printf 
#else 
    #define PRINTF 1 ? NULL : printf 
#endif 

Затем, когда вы пишете PRINTF("a = %i, b = %i", a, b);, в режиме без отладки, он будет отображается, как (эффективно):

if (true) NULL; 
else printf("a = %i, b = %i", a, b); 

Компилятор счастлив, но Printf никогда не выполнить, и если компилятор, если он яркий (т. е. любой современный компилятор C), код для printf() никогда не будет сгенерирован, поскольку компилятор распознает, что этот путь никогда не может быть принят.

Однако следует отметить, что параметры все равно будут оценены, поэтому, если у них есть какие-либо побочные эффекты (например, ++ х или вызов функции), они код может быть сгенерирован (но не выполняется)

+2

Gcc разрешает multi-args, см. Мой ответ по этому вопросу. – 0x6adb015

+1

Я верю, что что-то подобное на C99. –

+0

Я не знаю, почему люди отмечают это. Насколько я вижу, это единственный ответ, который предусматривает: a) стандартное решение, которое b) не требует ни конкретного компилятора, ни специального синтаксиса. Это ТОЧНО, о чем попросил ОП. –

1

Обход чтобы получить vararg с препроцессора, которые не поддерживают его

#define DEBUG 

#ifdef DEBUG 
#define trace(args) printf args 
#else 
#define trace(args) 
#endif 


int dostuff(int value) 
{ 


    trace(("%d", value)); 

} 
0

Я также хотел бы напечатать некоторые другие флаги препроцессора C, которые могут помочь вам отслеживать проблемы вниз

printf("%s:%d {a=%i, b=%i}\n", __FILE__, __LINE__, a, b); 

 Смежные вопросы

  • Нет связанных вопросов^_^