GCC告诫未使用的静态函数,但不是静态内联:有实际区别吗?

我的GCC版本(5.4)警告未使用的static函数,即使在使用-Wall时在头文件中也是如此。如果定义了相同的函数static inline或简单地定义了inline,则不会出现错误。

例如,文件中的以下函数unused.h

static void foo() {}

.包括在test.cpp文件中时,如下所示:

#include "unused.h"

使用-Wall编译时生成以下编译器诊断:

In file included from test.cpp:11:0:
unused.h: At global scope:
unused.h:9:13: warning: ‘void foo()’ defined but not used [-Wunused-function]
 static void foo() {}
             ^
据我所知,包含具有许多实用程序函数的头文件是一种常见的做法,但在任何给定源文件中可能只使用少数几个实用程序函数。此行为意味着我收到的任何不使用的、仅声明为static的函数都会收到警告。

实际上,我可以简单地将它们更改为static inline以消除警告(或者完全关闭特定的警告,但我确实发现它有时很有用),但似乎不会从内联1中受益的大型实用函数更符合逻辑地声明为static2

据我所知,未使用的static函数(就像static inline)只是在编译翻译单元时被GCC丢弃,所以它们根本不会造成二进制大小或链接时间开销。

我是不是漏掉了什么?是否有充分的理由说明未使用的static函数比static inline更有问题?


1是的,我知道这只是提示,但GCC实际上理解了many cases中的提示。

2或可能更好,仅在头文件中声明,并在.cpp文件中的其他位置定义-但这禁止仅使用头文件,这有时很方便。


解决方案

警告是因为未使用的static函数可能指示逻辑错误:如果从未调用过该函数,为什么还要编写这样的函数?

但是,在头文件中有static inline函数是一种常见的习惯用法。这些函数可能仅由包括报头的一些翻译单元使用。如果编译器为恰好未使用其中某个函数的翻译单元发出警告,则会很烦人。

如果您有意使用一个未使用的staticinline函数,您可能希望完全禁用警告,或者使用编译器特定的功能来抑制该函数的警告。


有人问:"您为什么要使用static inline?"嗯,在新的C++中,你通常不会使用它。然而,在C语言中,这样做是合理的。(这是因为static inline在ISO C和GNU C中的意思相同;但是,没有staticinline在ISO C和GNU C中的行为不同,因此默认为static inline只是避免了所有这些问题,没有负面影响)。

人们可能会在要从.c.cpp文件中包含的头文件中使用static inline;或者他们可能只是将该习惯从C语言延续到C++。在后一种情况下,对于编译器来说,警告一些虽然不必要但也不是错误或问题的东西会很烦人。

相关文章