Ты можешь иметь
#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