有没有办法让gcc禁用特定警告

时间:2012-12-22 07:36:49

标签: gcc warnings

我定义了如下所示的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

如何更改非日志记录宏,以便不发出警告?

注意:

  1. 我不想添加编译标记-Wunused-value
  2. 我不想使用可变参数MACRO。
  3. 禁用printf时,应删除所有代码以避免影响系统性能。

4 个答案:

答案 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