как объявить многоточие, определенное 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 для подавления предупреждений о неиспользуемых параметрах?


person arapEST    schedule 22.06.2016    source источник
comment
Мне непонятно: вы пытаетесь определить пустой макрос?   -  person LPs    schedule 22.06.2016
comment
Можете ли вы показать код и определение макроса, вызывающие ошибку, а также точный текст ошибки?   -  person Angew is no longer proud of SO    schedule 22.06.2016


Ответы (1)


Ты можешь иметь

#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)

Таким образом, оптимизирующий компилятор не будет вызывать 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>< /a> и код (для случая отладки):

#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) в макросах.

person Basile Starynkevitch    schedule 22.06.2016