как объявить многоточие определенным va_list неиспользованным

Я имею дело с макросами журнала, которые определены примерно так:

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

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

3

Решение

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector