【问题标题】:How to silence GCC pedantic (-Wpedantic) warning regarding __FUNCTION__如何消除关于 __FUNCTION__ 的 GCC 迂腐(-Wpedantic)警告
【发布时间】:2018-10-24 07:04:48
【问题描述】:

当我使用“__FUNCTION__”输入函数时,我正在打印 (printf) 函数的名称预定义的宏(在 gcc 和 clang 中)。但是,如果我使用 -Wpedantic,我会收到以下警告:

警告:ISO C 不支持“__FUNCTION__”预定义标识符 [-Wpedantic]

如何使该警告静音?

【问题讨论】:

  • 在 C11 中,它是 __func__
  • -Wno-pedantic?
  • @user3386109 __func__ 成功了!你应该把它放在一个答案中,我会接受它。
  • @Scooter 使用反引号 ` ` 引用 cmets 中的代码摘录(以及一般的帖子)
  • @Scooter 好的,让我查一下 C11 规范中的部分。

标签: c gcc-warning


【解决方案1】:

没有理由使用__FUNCTION__

__func__ 是标准的(C99、C11、C17)。 C11 6.4.2.2p1:

  1. 标识符__func__应由翻译器隐式声明,就好像紧跟在每个函数定义的左大括号之后,声明

    static const char __func__[] = "function-name";
    

来自GCC documentation

__FUNCTION____func__ 的另一个名称,用于向后兼容旧版本的 GCC。

如果你想知道几岁,__func__ 出现在GCC 2.95,发布于 1999 年 7 月 31 日。请注意,您不需要__FUNCTION__ 来处理其他任何事情,但支持 GCC 2.94 或更早版本。如果你这样做了,那么这个警告可能是你最不担心的。


但是,__func__ 在 C89/90 模式下也不可用,因此您会在此处收到警告。如果您关心 ISO 诊断,那么您需要使用更新的版本。现代 GCC 已经默认使用 GNU C11 或 C17。


另请参阅: What's the difference between __PRETTY_FUNCTION__, __FUNCTION__, __func__

【讨论】:

    【解决方案2】:

    符合标准的函数标识符是__func__

    来自 C11 规范的 §6.4.2.2

    标识符__func__应由翻译器隐式声明 好像,紧跟在每个函数的左大括号之后 定义、声明
    static const char __func__[] = "function-name";
    出现,其中 function-name 是词法封闭的名称 函数。

    我相信__func__ 是在 C99 中添加的。

    【讨论】:

      【解决方案3】:

      -Wpedantic 选项用于:

      发出严格的 ISO C 和 ISO C++ 要求的所有警告;拒绝所有使用禁止扩展的程序,以及其他一些不遵循 ISO C 和 ISO C++ 的程序。对于 ISO C,遵循使用的任何 -std 选项指定的 ISO C 标准版本。

      __FUNCTION__ 是 GCC 扩展。但是__func__ 是 C11 中的预定义标识符。我知道这也是 C99 的一部分。

      C11 (N1570) 委员会草案指出:

      6.4.2.2 预定义标识符
      语义
      1. 标识符__func__ 应由翻译器隐式声明,就好像, 紧跟在每个函数定义的左大括号之后,是声明

      static const char _ _func_ _[] = "function-name";
      

      出现,其中 function-name 是词法封闭函数的名称。

      【讨论】:

        【解决方案4】:

        除非您尝试遵守 ANSI C 标准,否则不要使用 -Wpedantic,该标准显然不支持 __FUNCTION__ 关键字。

        请改用-Wall -Wextra

        【讨论】:

        • 谢谢,我误以为pedantic除了ANSI C兼容性之外还有其他功能。
        • 它确实具有 ANSI C 兼容性以外的功能,您最好将其留在编译字符串中并使用预处理器条件解决错误,如果它不是由您的编译器(您可能还想添加-Wshadow
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-22
        • 1970-01-01
        • 2012-04-30
        • 2020-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多