gpt4 book ai didi

c++ - gcc 警告未使用的静态函数,但不是静态内联 : is there a practical distinction?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:34 41 4
gpt4 key购买 nike

我的 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() {}
^

据我所知,通常的做法是包含带有许多实用函数的 header ,但在任何给定的源文件中可能只使用其中的一小部分。此行为意味着我会收到关于我不使用的任何仅声明为 static 的函数的警告。

作为一个实际问题,我可以简单地将它们更改为 static inline 以消除警告(或完全关闭特定警告,但我确实发现它有时很有用),但是似乎不会从内联1 中获益的大型实用函数更合乎逻辑地声明为static2

据我所知,未使用的 static 函数(就像 static inline 一样)在编译翻译单元时被 gcc 简单地删除,所以它们没有二进制大小或根本没有链接时间开销。

我是不是漏掉了什么?未使用的 static 函数比 static inline 问题更多是否有充分的理由?


1 是的,我知道这只是一个提示,但 gcc 实际上在 many cases 中接受了提示.

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

最佳答案

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

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

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


有人问,“你为什么要使用 static inline 呢?”。好吧,在新的 C++ 中,您通常不会使用它。但是,在 C 语言中,这样做是合理的。 (这是因为 static inline 在 ISO C 和 GNU C 中意味着相同的东西;但是没有 staticinline 在 ISO C 和 GNU C 中表现不同,所以默认为 static inline 只是避免了所有这些问题,没有任何缺点)。

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

关于c++ - gcc 警告未使用的静态函数,但不是静态内联 : is there a practical distinction?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47542751/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com