你可能有
#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)
所以优化编译器不会发出任何调用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&)
您的 class Foo
,您可能会x
成为它的一个实例。
PS。有关宏中...的解释,请参见this 。do{
}while(0)