我通过使用预定义的“ __FUNCTION__”宏(在gcc和clang中)输入(打印)该函数的名称。但是,如果我使用-Wpedantic,则会收到以下警告:
警告:ISO C不支持“ __FUNCTION__”预定义标识符 [-Wpedantic]
我如何使该警告静音?
答案 0 :(得分:5)
没有理由使用__FUNCTION__
。
__func__
是标准名称(C99,C11,C17)。 C11 6.4.2.2p1:
标识符
__func__
应该由翻译器隐式声明,就像在每个函数定义的大括号后面紧接着声明一样。static const char __func__[] = "function-name";
__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
。