gpt4 book ai didi

c++ - 如何声明省略号定义的 va_list 未使用

转载 作者:太空狗 更新时间:2023-10-29 23:13:37 24 4
gpt4 key购买 nike

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

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

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

最佳答案

你可能有

#ifdef NDEBUG
#define LOGD(...) do {} while(0)
#else
#define LOGD(...) do {rtt_printf(TERMINAL_DEBUG, ##__VA_ARGS__); \
} while(0)
#endif

遵循 NDEBUG 上的惯例被 assert(3) 使用

如果你想使用参数让你的编译器满意并让它检查参数,你可以尝试(在 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="<<x) .然后,如果您定义了合适的 std::ostream& operator << (std::ostream&, const Foo&)为你的类(class)Foo , 你可以有 x是它的一个实例。

附言。参见 this有关 do{ 的解释... }while(0)在宏中。

关于c++ - 如何声明省略号定义的 va_list 未使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37960305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com