14

我的 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

据我所知,在编译翻译单元时,gcc 会简单地删除未使用的static函数(就像static inline),因此它们根本不会造成二进制大小或链接时间开销。

我在这里错过了什么吗?是否有充分的理由认为未使用static的功能比 更成问题static inline


1是的,我知道这只是一个提示,但 gcc 实际上在许多情况下都会提示。

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

4

2 回答 2

10

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

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

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


有人问:“你为什么要使用static inline呢?”。好吧,在新的 C++ 中,您大多不会使用它。但是,在 C 中,这样做是合理的。(这是因为static inlineISO C 和 GNU C 中的含义相同;但是ISO C 中的inlinewithoutstatic行为与 GNU C 不同,因此默认为static inline避免所有这些问题而没有缺点)。

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

于 2017-11-28T23:46:53.320 回答
-1

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

于 2020-01-07T00:43:49.840 回答