the*_*tna 16 c gcc compiler-warnings
我收到了警告:function used but not defined.我static
__inline__在头文件中说a.h.头文件包含在a.c.我想将头文件中的所有内联函数放入.c文件中.以下代码给出了我的问题的想法.
原始代码:
啊:
static __inline__ function1(){
function definition;
}
Run Code Online (Sandbox Code Playgroud)
我换了:
啊:
static function1();
Run Code Online (Sandbox Code Playgroud)
AC:
#include "a.h"
static function1(){
function definition;
}
Run Code Online (Sandbox Code Playgroud)
在做上面我得到了警告:
warning: function function1 is used but not defined.
Run Code Online (Sandbox Code Playgroud)
能不能让我知道为什么我会收到这样的警告?我想把所有的__inline__功能都转移到这里,.c这样我就不会收到警告了:
warning: function1 is could not be inlined, code size may grow.
Run Code Online (Sandbox Code Playgroud)
提前致谢
Dar*_*ust 44
您已将该函数声明为静态函数.这意味着它仅在当前编译单元中可见.换句话说:实现只在a.c文件中可见.您需要在和中删除static关键字a.h,a.c以便其他.c文件可以看到该功能.您应该指定一个返回值,例如,void function1();因为int如果您没有指定返回值,则会隐含.
static在.c文件中声明的函数仅在该文件中可见/可用.如果它们没有被使用,那么它们实际上是死代码,编译器会警告你这个事实.在GCC中,您可以使用unused function属性来禁止此警告:
static int __attribute__((unused)) function1() {
...
}
Run Code Online (Sandbox Code Playgroud)
编辑:
通常,您应该遵循以下有关内联函数的准则:
如果它们在多个C文件中使用,请声明它们static并在包含的头文件中定义它们.这允许.c包含该头的所有文件都有自己的函数私有定义,这允许编译器内联它.单个static函数原型在多个源文件将使用的头文件中几乎没有任何意义,因为它们的实际定义将会丢失.
如果它们不打算重用,请将它们的定义(以及必要时的原型)放在.c应该使用它们的文件中.
如果GCC因为函数大小而抱怨无法内联函数:
问问自己是否真的需要内联函数 - 根据我的经验,编译器通常最了解.
如果你真的想要内联函数,那么always_inline 函数属性可能是有用的.您可能还必须向-finline-limit=nGCC 提供非默认选项,以增加内联函数的允许大小.
另请参阅此内容以获取有关内联函数的更多信息以及有关其使用的一些可能的缺陷.
编辑2:
如果您static inline在共享头文件中定义了一个函数并希望将其转换为普通文件,那么由于缺少更好的单词,您应该:
选择.c存在该功能的文件(即将其与其他相关功能放在一起).
从定义中删除static和inline关键字,并将标题中的定义移动到该文件中.
从原型中删除static和inline关键字并将其放入头文件中.
恭喜,您现在拥有正常的公开功能.
免责声明:您刚刚创建了一个私有的多个文件的功能,对您的所有程序都是公开的.如果存在另一个具有相同名称的公共符号 - 变量或函数,则在链接时可能会出现错误,甚至在运行时也会出现奇怪的行为.你被警告了......