【问题标题】:Is there a way for gcc to disable specific warning有没有办法让 gcc 禁用特定警告
【发布时间】:2012-12-22 07:36:49
【问题描述】:

我定义了一个 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 被禁用时,应删除所有代码以避免影响系统性能。

【问题讨论】:

  • 由于 GCC 支持可变参数宏,您可以轻松避免使用 GCC 的警告。哪个其他编译器会产生您担心的警告——也就是说,哪个其他编译器不支持可变参数宏? (我可以猜到,但你应该说明是哪个。)

标签: gcc warnings


【解决方案1】:

你可以使用gcc的diagnostic pragmas.this

【讨论】:

    【解决方案2】:

    解决方法很简单:不要使用宏。

    #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 使用“格式”__attribute__ 对格式字符串进行类型检查(请参阅http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)。

    【讨论】:

    • 但是,这会影响系统性能,尤其是嵌入式系统。
    • 你确定会影响性能吗?您可能会对 GCC 的优化能力感到惊讶。
    • @Vincent I/O 很慢。即使函数没有被内联,与使用 (v)printf() 进行 I/O 相比,函数调用的成本也不算什么。在选择空函数的情况下,编译器根本不会生成函数调用,因为在这种情况下它可以很容易地推断出该函数什么都不做。而且我非常怀疑你是否在一个紧密的循环中调用 CYPRINTF。你呢?
    • 感谢回复,但是我的应用是针对消费类应用的,我的MCU只有8KB flash和1KB RAM;所以我不希望在发布版本@Nikos C 中有任何未使用的代码。而且我不希望依赖于编译器优化。
    【解决方案3】:

    我知道这篇文章很老了,但试试这个:

    #if(PRINTF_VERSION & PRINTF_DISABLE)
      #define CYPRINTF    (void)
    #else
      #define CYPRINTF    printf
    #endif
    

    void 强制转换应该告诉编译器该语句没有价值。我没有测试过它,但过去曾尝试过类似的东西。应该可以。

    【讨论】:

      【解决方案4】:

      只是为了添加另一个选项,我今天使用过。 @Fëamarto 的回答很好,但对我不起作用,因为我使用复杂的打印和打印宏的多级包装。

      但是 lambdas 有魔力:

      #if(PRINTF_VERSION & PRINTF_DISABLE)
          #define CYPRINTF [](){return 0;}()
      #else
          #define CYPRINTF    printf
      #endif
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-29
        • 2012-05-06
        • 2010-10-06
        • 2010-11-07
        • 2014-09-25
        • 1970-01-01
        相关资源
        最近更新 更多