2016-06-22 7 views
3

Я имею дело с лог макросами, которые определены что-то вроде:как объявить многоточие определенного va_list неиспользованной

#define LOGD(...)   rtt_printf(TERMINAL_DEBUG, ##__VA_ARGS__) 
#define LOGV(...)   rtt_printf(TERMINAL_NORMAL, ##__VA_ARGS__) 

Это все хорошо, но я хотел бы, чтобы отключить журналы отладки для сборки релиза. Но поскольку я использую -Werror и -Wall, я просто получаю ошибки, когда определяю LOGD без rtt_printf(). Есть ли вообще какой-либо способ (более динамичный), кроме явного объявления (void) var; перед вызовом LOG для подавления предупреждений о неиспользуемых параметрах?

+0

Нечеткий для меня: вы пытаетесь определить пустой макрос? – LPs

+1

Можете ли вы показать определение кода и макроса, создающее ошибку, а также точный текст ошибки? – Angew

ответ

0

Вы могли бы иметь

#ifdef NDEBUG 
#define LOGD(...) do {} while(0) 
#else 
#define LOGD(...) do {rtt_printf(TERMINAL_DEBUG, ##__VA_ARGS__); \ 
         } while(0) 
#endif 

после конвенции о NDEBUG используется assert(3)

Если вы хотите использовать аргументы, чтобы сделать ваш компилятор счастливым и иметь его проверить аргументы, вы могли бы попробовать (в NDEBUG случай)

#define LOGD(...) do { if (false) printf(__VA_ARGS__); }while(0) 

Так optimizing compiler не издаст ни одного звонка на printf (при использовании GCC, обязательно пройти -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. См. this для получения информации о do{ ... }while(0) в макросах.