我定义了如下所示的PRINTF MACRO:
#if(PRINTF_VERSION & PRINTF_DISABLE)
#define CYPRINTF
#else
#define CYPRINTF printf
#endif
但是当禁用打印时,我收到了以下警告:
warning: statement with no effect
我尝试过以下解决方案,它适用于GCC编译器,但不适用于不支持可变参数MACRO的编译器。
#if(PRINTF_VERSION & PRINTF_DISABLE)
#define CYPRINTF(format, ...)
#else
#define CYPRINTF printf
#endif
如何更改非日志记录宏,以便不发出警告?
注意:
-Wunused-value
。答案 0 :(得分:1)
您可以使用gcc的diagnostic pragmas.和this
答案 1 :(得分:1)
解决方案很简单:不要使用宏。
#if(PRINTF_VERSION & PRINTF_DISABLE)
int CYPRINTF(const char*, ...)
{ return 0; }
#else
#include <cstdarg>
int CYPRINTF(const char* format, ...)
{
va_list args;
va_start(args, format);
int ret = vprintf(format, args);
va_end(args);
return ret;
}
#endif
您还可以指示GCC使用“format”__attribute __来查看格式字符串(请参阅http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)。
答案 2 :(得分:0)
我知道这篇文章真的很旧,但试试这个:
#if(PRINTF_VERSION & PRINTF_DISABLE)
#define CYPRINTF (void)
#else
#define CYPRINTF printf
#endif
void cast应告诉编译器该语句没有值。我没有测试过,但过去尝试过类似的东西。应该工作。
答案 3 :(得分:0)
我今天用过的只是添加另一个选项。 @Fëamarto的答案很好,但对我不起作用,因为我使用了复杂的打印功能,并且对打印宏进行了多级包装。
但是lambdas有魔力:
#if(PRINTF_VERSION & PRINTF_DISABLE)
#define CYPRINTF [](){return 0;}()
#else
#define CYPRINTF printf
#endif