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中受益的大型实用函数更符合逻辑地声明为static
2。
据我所知,未使用的static
函数(就像static inline
)只是在编译翻译单元时被GCC丢弃,所以它们根本不会造成二进制大小或链接时间开销。
我是不是漏掉了什么?是否有充分的理由说明未使用的static
函数比static inline
更有问题?
1是的,我知道这只是提示,但GCC实际上理解了many cases中的提示。
2或可能更好,仅在头文件中声明,并在.cpp
文件中的其他位置定义-但这禁止仅使用头文件,这有时很方便。
解决方案
警告是因为未使用的static
函数可能指示逻辑错误:如果从未调用过该函数,为什么还要编写这样的函数?
static inline
函数是一种常见的习惯用法。这些函数可能仅由包括报头的一些翻译单元使用。如果编译器为恰好未使用其中某个函数的翻译单元发出警告,则会很烦人。
如果您有意使用一个未使用的static
非inline
函数,您可能希望完全禁用警告,或者使用编译器特定的功能来抑制该函数的警告。
有人问:"您为什么要使用static inline
?"嗯,在新的C++中,你通常不会使用它。然而,在C语言中,这样做是合理的。(这是因为static inline
在ISO C和GNU C中的意思相同;但是,没有static
的inline
在ISO C和GNU C中的行为不同,因此默认为static inline
只是避免了所有这些问题,没有负面影响)。
人们可能会在要从.c
和.cpp
文件中包含的头文件中使用static inline
;或者他们可能只是将该习惯从C语言延续到C++。在后一种情况下,对于编译器来说,警告一些虽然不必要但也不是错误或问题的东西会很烦人。
相关文章