2016-06-22 30 views
3

我处理被定义类似日志宏:如何声明省略号定义va_list的未使用的

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

这是一切都很好,但我想禁用调试日志发布版本。但由于我使用的是-Werror-Wall,我只是在定义LOGD而没有使用rtt_printf()时发生错误。除了明确声明(void)var以外,是否有任何方法(更动态的方式)在LOG调用之前使用来抑制未使用的参数警告?

+0

对我来说不清楚:你想要定义一个空的宏吗? – LPs

+1

你能展示产生错误的代码和宏定义,以及确切的错误文本吗? – Angew

回答

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不会散发到01的任何调用(如果使用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)。然后,如果您为类Foo定义了合适的std::ostream& operator << (std::ostream&, const Foo&),则可以让x为它的一个实例。

PS。关于do{ ... }while(0)宏的说明,请参见this