我的 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 实际上在许多情况下会接受提示。
2或者更好的是,仅在头文件中声明并在.cpp
文件中的其他地方定义 - 但这会禁止仅标头的使用,这有时很方便。
警告是因为未使用的static
函数可能表示逻辑错误:如果从未调用过,为什么要编写这样的函数?
但是,在头文件中具有static inline
函数是一种常见的习惯用法。 这些函数可能仅由包含标头的某些翻译单元使用。如果编译器对未碰巧使用其中一个函数的翻译单元发出警告,那将很烦人。
如果您有意使用未使用的static
非inline
函数,则可能需要完全禁用警告,或使用特定于编译器的功能来禁止显示该函数的警告。
有人问:"你为什么要用static inline
? 好吧,在新C++中,您大多不会使用它。(这是因为static inline
在ISO C和GNU C中意味着同样的事情; 然而,没有static
inline
在ISO C中的行为与GNU C不同,因此默认为static inline
只是避免了所有这些问题,没有缺点)。
人们可能会在要包含在.c
和.cpp
文件中的标头中使用static inline
; 或者他们只是把这种习惯从C延续到C++。在后一种情况下,恕我直言,编译器警告一些虽然不必要但也不是错误或问题的事情会很烦人。
对于此类函数,您需要设置属性__attribute__((unused))
。