Я имею дело с макросами журнала, которые определены примерно так:
#define LOGD(...) rtt_printf(TERMINAL_DEBUG, ##__VA_ARGS__)
#define LOGV(...) rtt_printf(TERMINAL_NORMAL, ##__VA_ARGS__)
Это все хорошо, но я хотел бы отключить отладочные журналы для сборки выпуска. Но так как я использую -Werror
а также -Wall
Я просто получаю ошибки, когда я определяю LOGD без rtt_printf (). Есть ли какой-либо способ (более динамичный способ), кроме явного объявления (Пустоты) вар; перед вызовом LOG для подавления предупреждений о неиспользованных параметрах?
Ты можешь иметь
#ifdef NDEBUG
#define LOGD(...) do {} while(0)
#else
#define LOGD(...) do {rtt_printf(TERMINAL_DEBUG, ##__VA_ARGS__); \
} while(0)
#endif
следуя конвенции о NDEBUG
использован утверждают, (3)
Если вы хотите использовать аргументы, чтобы сделать ваш компилятор счастливым и заставить его проверять аргументы, вы можете попробовать (в NDEBUG
дело)
#define LOGD(...) do { if (false) printf(__VA_ARGS__); }while(0)
Итак оптимизирующий компилятор не будет издавать никаких звонков printf
(при использовании НКУ, обязательно пройти -Wall -O2
по крайней мере, g++
)
Кстати, я бы предложил вместо этого (для случая отладки без NDEBUG
):
#define LOGD(Fmt,...) do { rtt_printf(TERMINAL_DEBUG, "%s:%d " Fmt "\n", \
__FILE__, __LINE__, ##_VA_ARGS); } while(0)
затем используйте LOGD("x=%d", x)
в вашем коде. Это покажет положение строки источника.
Наконец, в подлинном C ++ 11 вам лучше использовать выходные потоки из <ostream>
и код (для случая отладки):
#define LOGOUTD(Out) do {std::clog << __FILE__ << ":" << __LINE__ \
<< " " << Out << std::endl;}while(0)
и позже использовать LOGOUTD("x="<<x)
, Затем, если вы определили соответствующие std::ostream& operator << (std::ostream&, const Foo&)
для вашего класса Foo
Вы могли бы иметь x
быть примером этого.
PS. Увидеть этот для объяснения о do{
…}while(0)
в макросах.
Других решений пока нет …