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 实际上在许多情况下会接受提示

2或者更好的是,仅在头文件中声明并在.cpp文件中的其他地方定义 - 但这会禁止仅标头的使用,这有时很方便。

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

但是,在头文件中具有static inline函数是一种常见的习惯用法。 这些函数可能仅由包含标头的某些翻译单元使用。如果编译器对未碰巧使用其中一个函数的翻译单元发出警告,那将很烦人。

如果您有意使用未使用的staticinline函数,则可能需要完全禁用警告,或使用特定于编译器的功能来禁止显示该函数的警告。


有人问:"你为什么要用static inline? 好吧,在新C++中,您大多不会使用它。(这是因为static inline在ISO C和GNU C中意味着同样的事情; 然而,没有staticinline在ISO C中的行为与GNU C不同,因此默认为static inline只是避免了所有这些问题,没有缺点)。

人们可能会在要包含在.c.cpp文件中的标头中使用static inline; 或者他们只是把这种习惯从C延续到C++。在后一种情况下,恕我直言,编译器警告一些虽然不必要但也不是错误或问题的事情会很烦人。

对于此类函数,您需要设置属性__attribute__((unused))

最新更新