2016-12-25 3 views
1

Мне нужно распечатать msg1 и msg2 для той же ошибки при компиляции с флагом DEBUG и без него. Например.Правильный способ печати различных отладочных сообщений в C?

 fprintf(stderr, 
#ifdef DEBUG 
         "error msg1 %s",__FILE__ 
#else 
         "error msg2" 
#endif 
      ); 

или другой способ может быть, чтобы пройти эти msg1 и msg2 функцию и распечатать его с помощью vfprintf(). Возможно, второй способ имел бы накладные расходы. Итак, мне просто интересно, что может быть лучшим способом сделать это?

E.g. Вариант использования может заключаться в том, что код необходимо скомпилировать с помощью флагов info и debug. info могут быть сообщениями пользователя и debug для цели отладки. Любые предложения?

+0

Просто спрашивайте: вы уверены, что хотите зарегистрировать сообщение _error_? –

+0

Да, я хочу иметь разные сообщения об ошибках. Такие вещи, как информация, подробная информация и т. Д. –

+0

Просьба дать более подробную информацию о вашем брэнде и его фоном. – alk

ответ

2

Обычно в этом коде используются трассировки, чтобы помочь отладить его, например, в ваших тестах указателей NULL вы можете добавить smth, например if (ptr==NULL) DEBUG("Entering Null pointer");. Я просто говорю вам, что, потому что я не udrestand, почему вы хотите использовать как msg1, так и msg2.

Для меня я обычно использую макрос DEBUG и глобальную переменную verbose:

#define DEBUG(...)\ 
if(verbose && SHOW_ERROR) {\ 
printf("Error : %s, %d",__FUNCTION__, __LINE__);\ 
printf(__VA_ARGS__);\ 
}\ 
else if (verbose && SHOW_WARNING) {\ 
printf("Warning : %s, %d",__FUNCTION__, __LINE__);\ 
printf(__VA_ARGS__);\ 
} 

Пример:

#include <stdio.h> 

#define SHOW_ERROR 1 
#define SHOW_WARNING 2 

int verbose = 1; 
int main() 
{ 
    DEBUG("THIS WILL SHOW ERROR MSG"); 
    verbose = 2; 
    DEBUG("THIS WILL SHOW WARNING MSG"); 
} 

Надежда я помочь.

+0

Не будет ли это проблемой чтения.? Когда я где-то читал, макросы предназначены для одного кода линейки. –

+0

@ShivendraMishra, я так не думаю, макрос по определению является chunck кода, который имеет имя. поэтому в случае, если у нас есть код на несколько строк, и мы хотим заменить его на Макро, то почему бы не – Mouin

+0

Я считаю, что __VA_ARGS__ отличается для разных компиляторов, например. с gnu99 и окнами. –

1

Безусловный вызов vfprintf имеет дополнительные дополнительные накладные расходы для упаковки дополнительного параметра, a, для использования с функцией списка переменных. Кроме того, условная компиляция позволяет компилятору заметить, что вызов fprintf в режиме DEBUG не проходит, кроме строки формата параметров, и заменить его fputs("error msg1", stderr)*

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

* Это редкость для DEBUG выхода обеспечить меньше деталей, чем неотладочные один; обычно, это наоборот.

+0

Меня беспокоит, что эта функция называется очень часто, и эта крошечная надстройка создаст эффект в долгосрочной перспективе. –

+0

@ShivendraMishra Наблюдение за длительным прогоном просто неверно: накладные расходы 0,01% не будут заметны, независимо от того, как долго ваш пробег. Учитывая, что функция делает I/O, на 'stderr', влияние передачи параметров будет на том уровне, потому что I/O на' stderr' в тысячи раз дороже, чем упаковка дополнительного параметра в список VA. – dasblinkenlight

+0

Согласен, спасибо за ввод. –

1

Ваш флаг отладки является макросом препроцессора, поэтому сообщение об ошибке будет выбрано во время компиляции, является ли это поведением, которое вы хотите?

Я хотел бы предложить несколько иной подход:

#define PRINT_INFO(msg1,msg2) if(dbg){fprintf(stderr,msg1);}\ 
           else{fprintf(stderr,msg2);} 

где dbg флаг может быть включен и выключен во время выполнения

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

#define PRINT_INFO_VAR(msg1,msg2...) if(dbg){fprintf(stderr,msg1);}\ 
            else{fprintf(stderr,msg2);} 

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

PRINT_INFO_VAR(msg1,msg2,a) 
+0

Обратите внимание, что msg2 имеет. –

+0

@ShivendraMishra добавил поддержку вариационного аргумента , если вы можете дать больше фона, я, вероятно, смогу точно настроить ответ. –

+0

Объяснение варианта использования в вопросах. –

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

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