【问题标题】:how to declare ellipsis defined va_list unused如何声明省略号定义的 va_list 未使用
【发布时间】:2016-10-23 22:32:43
【问题描述】:

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

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

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

【问题讨论】:

  • 我不清楚:你想定义一个空宏吗?
  • 你能显示产生错误的代码和宏定义,以及确切的错误文本吗?

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


【解决方案1】:

你可能有

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

顺便说一句,我建议改为(对于没有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="&lt;&lt;x)。然后,如果您为您的类Foo 定义了适当的std::ostream&amp; operator &lt;&lt; (std::ostream&amp;, const Foo&amp;),您可以将x 作为它的一个实例。

PS。关于宏中do{...}while(0)的解释见this

【讨论】:

    猜你喜欢
    • 2011-01-22
    • 2011-07-04
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    相关资源
    最近更新 更多