【发布时间】:2021-11-22 21:46:42
【问题描述】:
我的 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 实际上在 many cases 中得到了提示。
2 或者更好,只在头文件中声明并在 .cpp 文件中的其他位置定义 - 但这会禁止仅使用头文件,这有时很方便。
【问题讨论】:
-
您是否有一个示例标头,我们可以使用它来重现此问题并测试可能的解决方案?
-
@tadman - 更新了问题。
-
实现必须在头文件中有什么原因吗?你不能有一个单独的存根
.cpp文件和必要的实现吗?优化器可以决定如何处理它们。目前尚不清楚为什么将其标记为static。它是否在头文件的其他地方使用了一些方法和重要性,以至于它保持在文件的本地? -
如果您不想看到“未使用的功能”警告,我建议您禁用它
-
更重要的是,您声称编译器只是忽略了
inline,而我在最新版本的gcc上展示了主流、最常用的优化级别,它显然没有.这就是我所要做的。表明inline在其他一些情况下可能没有什么不同,与其他一些编译标志完全无关。对于我的用例,它有所不同,我向您展示了实际代码,故事结束。
标签: c++ gcc compiler-warnings static-functions