我正在使用“__FUNCTION__”预定义宏(在gcc和clang中)通过打印出函数名来进入函数。然而,如果我使用-Wpedantic,我会收到以下警告:
警告:ISO C不支持“__FUNCTION__”预定义标识符[-Wpedantic]
我该如何消除这个警告?
我正在使用“__FUNCTION__”预定义宏(在gcc和clang中)通过打印出函数名来进入函数。然而,如果我使用-Wpedantic,我会收到以下警告:
警告:ISO C不支持“__FUNCTION__”预定义标识符[-Wpedantic]
我该如何消除这个警告?
没有理由使用__FUNCTION__
。
__func__
是标准用法(C99,C11,C17)。C11 6.4.2.2p1:
标识符
__func__
应被编译器隐式声明,就像每个函数定义的左花括号后面立即声明一样:从GCC文档中:
static const char __func__[] = "function-name";
__FUNCTION__
是__func__
的另一个名称,用于向后兼容旧版本的GCC。如果您想知道多久之前,
__func__
出现在GCC 2.95中,于1999年7月31日发布。请注意,您不需要__FUNCTION__
来做任何其他事情,只需要支持GCC 2.94或更早版本。如果您这样做了,那么警告可能是您最不担心的事情。
然而,在C89/90模式下也无法使用
__func__
,因此您会收到警告。如果您关心ISO诊断信息,则需要使用更新的修订版。现代GCC已经默认为GNU C11或C17。
__func__
。编译器应隐式声明标识符__func__
,就好像在每个函数定义的左花括号之后,出现了声明
static const char __func__[] = "function-name";
其中function-name是词法上封闭函数的名称。
__func__
是在C99中添加的。-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 Predefined identifiers
Semantics
1. The identifier__func__
shall be implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declarationstatic const char _ _func_ _[] = "function-name";
appeared, where function-name is the name of the lexically-enclosing function.
除非您尝试遵守 ANSI C 标准,否则不要使用 -Wpedantic
,该标准显然不支持 __FUNCTION__ 关键字。
请改用 -Wall -Wextra
。
__func__
表示当前函数的名称。 - user3386109-Wno-pedantic
? - DaBler__func__
就是这个技巧!你应该把它放在一个答案中,我会接受它。 - Scooter