我正在处理定义类似的日志宏:
#define LOGD(...) rtt_printf(TERMINAL_DEBUG, ##__VA_ARGS__)
#define LOGV(...) rtt_printf(TERMINAL_NORMAL, ##__VA_ARGS__)
一切都很好,但我想禁用发布版本的调试日志。但是,由于我使用的是-Werror
和-Wall
,因此当我在没有 rtt_printf()的情况下定义 LOGD 时,我只会遇到错误。除了在LOG调用之前明确声明(void)var; 以抑制未使用的参数警告之外,还有什么方法(更动态的方式)?
答案 0 :(得分:0)
你可能有
#ifdef NDEBUG
#define LOGD(...) do {} while(0)
#else
#define LOGD(...) do {rtt_printf(TERMINAL_DEBUG, ##__VA_ARGS__); \
} while(0)
#endif
使用的NDEBUG
惯例
如果你想使用参数使你的编译器满意并让它检查参数,你可以尝试(在NDEBUG
情况下)
#define LOGD(...) do { if (false) printf(__VA_ARGS__); }while(0)
因此optimizing compiler不会发出对printf
的任何调用(如果使用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)
。然后,如果您为班级std::ostream& operator << (std::ostream&, const Foo&)
定义了适当的Foo
,则可以x
作为其实例。
PS。有关do{
... }while(0)
在宏中的说明,请参阅this。