0

谁可以给我解释一下这个?

文件a如下:

file a.c
#include <stdio.h>
#include <stdlib.h>

int fun1();
int main()
{
     fun1();
     return 0;
}

文件 b 写成:

file b.c
static int fun1();
int  fun1(){
     printf("fron fun1");
     return 0;
}

当我尝试编译我的代码时,编译器给出一个错误:undefined reference to fun1。如果我在文件 bc 中声明 fun1 static 是什么意思?

4

5 回答 5

3

如果您在 bc 中声明fun1static它将在外部不可见,因此您只能在编译单元中使用它 bc 删除static.

注意:为了能够编译您的代码,您还需要#include <stdio.h>在 bc 的顶部添加

于 2013-08-02T17:18:06.823 回答
0

用作_ extern_a.cextern int fun1();

注意:fun1()默认有外部链接。

static int fun1();并从中删除b.c

编译使用:

gcc -o test a.c b.c

于 2013-08-02T17:20:06.093 回答
0

好吧,您在文件中要求这种行为b.c

当您声明static类似函数的东西时,该函数仅在声明它的同一翻译单元中可见,换句话说,您有一个b.c仅存在的函数,因此可以在b.c.

所以你的链接器正在考虑里面的函数b.c不是一个选项,这会给你一个未定义的引用,因为这个代码中没有其他实现能够解决这个符号。

于 2013-08-02T17:21:59.747 回答
0

编译器错误的原因:在文件“ac”中没有函数 fun1() 的定义。

解决方案1:

declare fun1() as extern in "a.c" : extern int fun1();

解决方案2:

Add #include "b.c" in "a.c"
于 2013-08-02T17:22:43.780 回答
0

您定义的static函数仅在该文件中可见,即它在该翻译单元中是本地的。

这就是为什么编译器(链接器)无法找到该函数的定义。删除 static 关键字。

对于编译,仅函数原型就足够了,但在链接时,您必须确保您声称在编译期间存在的函数确实存在于其他一些文件中。但是通过将其声明为static您将函数的定义限制为仅该文件,而不是使其对需要(调用)它的文件可见。

于 2013-08-02T17:24:06.037 回答