我收到警告:function used but not defined
。我在标题文件中static
__inline__
说a.h
。头文件包含在a.c
中。我想将头文件中的所有内联函数放入.c
文件中。以下代码给出了我的问题的想法。
原始代码:
A.H:
static __inline__ function1(){
function definition;
}
我改变了:
A.H:
static function1();
交流转换器:
#include "a.h"
static function1(){
function definition;
}
在上面做的时候我得到了警告:
warning: function function1 is used but not defined.
你可以告诉我为什么会收到这样的警告吗?我想将所有__inline__
函数转移到.c
,以便我不会收到警告:
warning: function1 is could not be inlined, code size may grow.
提前致谢
答案 0 :(得分:41)
您已将该函数声明为静态。这意味着它仅在当前编译单元中可见。换句话说:实现仅在a.c
文件中可见。您需要删除static
和a.h
中的a.c
关键字,以便其他.c文件可以查看该功能。您应该指定一个返回值,例如void function1();
,因为如果您没有指定,则隐式int
。
答案 1 :(得分:7)
在static
文件中声明.c
的函数仅在该文件中可见/可用。如果它们没有被使用,那么它们实际上是死代码,编译器会警告你这个事实。在GCC中,您可以使用unused
function attribute来取消此警告:
static int __attribute__((unused)) function1() {
...
}
编辑:
通常,您应该遵循以下有关内联函数的准则:
如果它们在多个C文件中使用,请声明它们static
并在包含的头文件中定义它们。这允许包含该头的所有.c
文件具有自己的私有函数定义,这允许编译器内联它。孤独的static
函数原型在多个源文件将使用的头文件中几乎没有任何意义,因为它们的实际定义将会丢失。
如果不打算重复使用它们,请在.c
文件中定义它们(以及必要时的原型)。
如果GCC因为函数大小而抱怨无法内联函数:
问问自己真的是否需要内联函数 - 根据我的经验,编译器通常最了解。
如果您确实希望内联函数,always_inline
function attribute可能会有用。您可能还必须向GCC提供非默认-finline-limit=n
选项,以增加内联函数的允许大小。
另请参阅this以获取有关内联函数的更多信息以及有关其使用的一些可能的缺陷。
编辑2:
如果您在共享头文件中定义了static inline
函数并希望将其转换为正常函数,那么由于缺少更好的单词,您应该执行以下操作:
选择一个.c
文件,其中该函数的存在是有意义的(即将其与其他相关函数一起使用)。
从定义中删除static
和inline
个关键字,然后将定义从标题移动到该文件中。
从原型中删除static
和inline
个关键字并将其放入头文件中。
恭喜,您现在拥有正常的公开功能。
免责声明:您刚刚为所有程序创建了一个私有的文件, public 。如果存在另一个具有相同名称的公共符号 - 变量或函数,则在链接时可能会出现错误,甚至在运行时也会出现奇怪的行为。你被警告了......
答案 2 :(得分:3)
在头文件中正常声明函数
A.H
#ifndef A_H_INCLUDED
#define A_H_INCLUDED
void function1(void);
#endif
在没有static
交流转换器
#include "a.h"
void function1(void) {
/* function definition */
}
并在包含标题
之后从其他文件中调用该函数b.c
#include "a.h"
void quux(void) {
function1(); /* call regular function */
}
之前的方式(static
和头文件中的实现)起作用,因为包含该标题的每个代码文件都有自己的函数版本;与每个其他文件中同名的所有其他函数不同(但完全相同)。