你可能有
#ifdef NDEBUG
#define LOGD(...) do {} while(0)
#else
#define LOGD(...) do {rtt_printf(TERMINAL_DEBUG, ##__VA_ARGS__); \
} while(0)
#endif
通过assert(3)
使用。如果你想使用的参数,使编译器高兴,并让它检查参数上NDEBUG
公约之后,你可以尝试(在在NDEBUG
情况)
#define LOGD(...) do { if (false) printf(__VA_ARGS__); }while(0)
所以optimizing compiler不会散发到01的任何调用(如果使用GCC,一定要通过-Wall -O2
至少g++
)
BTW,我反而建议(用于调试情况下不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)
。然后,如果您为类Foo
定义了合适的std::ostream& operator << (std::ostream&, const Foo&)
,则可以让x
为它的一个实例。
PS。关于do{
... }while(0)
宏的说明,请参见this。
对我来说不清楚:你想要定义一个空的宏吗? – LPs
你能展示产生错误的代码和宏定义,以及确切的错误文本吗? – Angew