gcc警告:使用但未定义的函数

时间:2011-04-02 22:59:00

标签: c gcc compiler-warnings

我收到警告: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.

提前致谢

3 个答案:

答案 0 :(得分:41)

您已将该函数声明为静态。这意味着它仅在当前编译单元中可见。换句话说:实现仅在a.c文件中可见。您需要删除statica.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文件,其中该函数的存在是有意义的(即将其与其他相关函数一起使用)。

  • 从定义中删除staticinline个关键字,然后定义从标题移动到该文件中。

  • 原型中删除staticinline个关键字并将其放入头文件中。

恭喜,您现在拥有正常的公开功能。

免责声明:您刚刚为所有程序创建了一个私有的文件, 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和头文件中的实现)起作用,因为包含该标题的每个代码文件都有自己的函数版本;与每个其他文件中同名的所有其他函数不同(但完全相同)。