Bee*_*ope 6 c++ gcc compiler-warnings static-functions
我的gcc版本(5.4)警告未使用的static函数,即使在使用时的头文件中-Wall也是如此.如果定义相同的功能static inline或简单,它不会抱怨inline.
例如,文件中的以下函数unused.h:
static void foo() {}
Run Code Online (Sandbox Code Playgroud)
...当包含在test.cpp文件中时如下:
#include "unused.h"
Run Code Online (Sandbox Code Playgroud)
编译时使用以下命令生成以下编译器诊断-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() {}
^
Run Code Online (Sandbox Code Playgroud)
据我所知,通常的做法是包含具有许多实用程序功能的标头,在任何给定的源文件中只能使用少数几个.这种行为意味着我得到了我不使用的任何仅声明的函数的警告static.
作为一个实际问题,我可以简单地改变这些以static inline消除警告(或完全关闭特定警告,但我确实发现它不时有用),但似乎大型实用功能不会从中受益内联1更逻辑地声明为static2.
据我所知,在编译翻译单元时,gcc会简单地删除未使用的static函数(就像static inline),因此它们根本不会产生二进制大小或链接时间开销.
我在这里错过了什么吗?是否有充分的理由认为未使用的static功能比问题更多static inline?
1是的,我知道这只是一个暗示,但gcc在很多情况下实际上都是暗示.
2或者更好,只在头文件中声明并在文件中的其他位置定义.cpp- 但这会禁止仅使用标头,这有时很方便.
警告是因为未使用的static函数可能表示存在逻辑错误:如果从未调用过函数,为什么要编写这样的函数?
但是,static inline在头文件中使用函数是一种常见的习惯用法.这些函数可能仅由包含标题的某些翻译单元使用.如果编译器对没有碰巧使用其中一个函数的翻译单元发出警告,那将会很烦人.
如果您故意使用未使用的static非inline函数,则可能需要完全禁用警告,或使用特定于编译器的功能来禁止该函数的警告.
有人问道,"你为什么还要用static inline?" 好吧,在新的C++中,你几乎不会使用它.但是,在C中这是合理的事情.(这是因为static inline在ISO C和GNU C中的含义相同;但是在ISO C中inline没有与GNU C相同的static行为,因此默认static inline只是避免所有那些没有下行的问题).
人们可能会static inline在两个.c和.cpp文件中包含的标题中使用; 或者他们只是将这种习惯从C转换为C++.在后一种情况下,恕我直言,如果编译器警告某些东西,尽管不必要,也不是一个错误或问题,这将是令人讨厌的.
| 归档时间: |
|
| 查看次数: |
2806 次 |
| 最近记录: |