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

Posted

技术标签:

【中文标题】有没有办法让 gcc 禁用特定警告【英文标题】:Is there a way for gcc to disable specific warning 【发布时间】: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

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

注意事项:

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

【问题讨论】:

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

【讨论】:

以上是关于有没有办法让 gcc 禁用特定警告的主要内容,如果未能解决你的问题,请参考以下文章

在源代码中部分禁用 gcc 中的迂腐警告

在特定变量上禁用 GCC“可能未初始化”

如何消除 GCC 中的外部库/第三方警告 [重复]

您可以关闭特定位置包含的任何标头的(特定)编译器警告吗?

msvc/gcc:中用#pragma指令关闭特定警告(warning)

无法禁用特定编译器警告 (4100)