3

我正在处理定义如下的日志宏:

#define LOGD(...)         rtt_printf(TERMINAL_DEBUG, ##__VA_ARGS__)
#define LOGV(...)         rtt_printf(TERMINAL_NORMAL, ##__VA_ARGS__)

一切都很好,但我想禁用发布版本的调试日志。但是由于我正在使用-Werror并且在没有rtt_printf()的情况下定义LOGD-Wall时我只是得到错误。除了显式声明(void)var;之外,还有什么方法(更动态的方法)吗?在 LOG 调用之前抑制未使用的参数警告?

4

1 回答 1

0

你可能有

#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)

于 2016-06-22T06:42:08.990 回答