Вы могли бы иметь
#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)
в макросах.
Нечеткий для меня: вы пытаетесь определить пустой макрос? – LPs
Можете ли вы показать определение кода и макроса, создающее ошибку, а также точный текст ошибки? – Angew