如何消除GCC对__FUNCTION__的警告 (-Wpedantic)?

9

我正在使用“__FUNCTION__”预定义宏(在gcc和clang中)通过打印出函数名来进入函数。然而,如果我使用-Wpedantic,我会收到以下警告:

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

我该如何消除这个警告?


6
在 C11 中,__func__ 表示当前函数的名称。 - user3386109
-Wno-pedantic - DaBler
@user3386109 __func__就是这个技巧!你应该把它放在一个答案中,我会接受它。 - Scooter
@Scooter在注释中(以及一般的帖子中)使用反引号 来引用代码摘录。 - Antti Haapala -- Слава Україні
@Scooter 好的,让我查一下 C11 规范中的那个部分。 - user3386109
@AnttiHaapala 我明白了,谢谢。 - Scooter
4个回答

12

没有理由使用__FUNCTION__

__func__是标准用法(C99,C11,C17)。C11 6.4.2.2p1:

  1. 标识符__func__应被编译器隐式声明,就像每个函数定义的左花括号后面立即声明一样:

    static const char __func__[] = "function-name";
    
    GCC文档中:

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

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


    然而,在C89/90模式下也无法使用__func__,因此您会收到警告。如果您关心ISO诊断信息,则需要使用更新的修订版。现代GCC已经默认为GNU C11或C17。


    另请参见:__PRETTY_FUNCTION__、__FUNCTION__、__func__之间有什么区别


8
标准兼容的函数标识符是__func__
来自C11规范的§6.4.2.2:
引用:

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

我认为__func__是在C99中添加的。

2

-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 declaration

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

appeared, where function-name is the name of the lexically-enclosing function.


0

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

请改用 -Wall -Wextra


谢谢,我错误地认为pedantic有一些除了ANSI C兼容性之外的功能。 - Scooter
2
它确实具有除 ANSI C 兼容性之外的功能,您最好将其保留在编译字符串中,并使用预处理条件来解决错误,以提供“_FUNCTION_”(如果编译器未提供)(您可能还想添加“-Wshadow”)。 - David C. Rankin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接