如何使有关__FUNCTION__的GCC pedantic(-Wpedantic)警告静音

时间:2018-10-24 07:04:48

标签: c gcc-warning

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

  

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

我如何使该警告静音?

4 个答案:

答案 0 :(得分:5)

没有理由使用__FUNCTION__

__func__是标准名称(C99,C11,C17)。 C11 6.4.2.2p1:

  
      
  1. 标识符__func__应该由翻译器隐式声明,就像在每个函数定义的大括号后面紧接着声明一样。

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

来自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__

答案 1 :(得分:3)

符合标准的功能标识符为__func__

根据C11规范的第6.4.2.2节

  

标识符__func__应由翻译器隐式声明   好像紧接每个功能的左括号一样   定义,声明
  static const char __func__[] = "function-name";
  出现,其中function-name是词法包围的名称   功能。

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

答案 2 :(得分:2)

Route.get()选项用于:

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

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

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

  

6.4.2.2预定义标识符
  语义学
  1.标识符__func__应该由翻译者隐式声明,就像,   在每个函数定义的开头大括号之后,立即声明

__func__
     

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

答案 3 :(得分:0)

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

改为使用-Wall -Wextra