如何声明省略号已定义va_list未使用

时间:2016-06-22 06:36:13

标签: c++ c ellipsis variadic-functions unused-variables

我正在处理定义类似的日志宏:

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

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

1 个答案:

答案 0 :(得分: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)

因此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