GCC 警告未使用的静态函数,但不警告静态内联:是否有实际区别?
gcc warns about unused static functions, but not static inline: is there a practical distinction?
我的 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))
。
- 关于std::move的使用,是否有编译警告
- 隐式转换:以下警告是否有效?
- 是否可以将移动的变量标记为不再可用,并在使用它时收到编译器警告?
- 是否有将引用返回到临时引用的C++警告?
- 是否有任何编译器标志可以在下面的代码中用于报告有关 UB 的警告?
- 是否有 GCC 警告,用于使用 C 库中的符号而不是通过命名空间 std?
- 是否有跨平台的方法可以在C++中禁用已弃用的警告?
- 是否有 GCC 标志来发出有关作用域内相同变量重定义的警告?
- 编译器在 const ref 类型参数上使用临时对象时是否应该警告不安全的行为?
- 是否有任何C++编译器可以发出悬而未决的引用警告?
- 自 Visual Studio 15.6.2 编译器更新以来的新 C++17 [[nodiscard]] 警告是否符合标
- clang++ 是否忽略了某些弃用警告的外部"C"?
- 如果对象在同一层次结构中,-Wreturn-std-move clang 警告是否正确
- 警告绑定到临时值的 clang 是否正确
- 是否有一种方法可以找到导致警告出现在QT中的线路
- MSVC 的 C4138 警告 ( "'*/' found outside of comment" ) 是否应该被禁用?
- GCC 警告未使用的静态函数,但不警告静态内联:是否有实际区别?
- 是否有GCC选项来警告编写"this-field"而不是"this->field"?
- 忽略 gcc/clang 的"-Wmissing-braces"警告是否明智?
- 此警告是否与枚举类大小有关