全局静态函数仍在另一个文件中工作

时间:2019-03-06 05:03:33

标签: c static global-variables

我在一个文件中声明了一个全局静态函数

a.c

static void Func1(void);
void Func2(void);

void Func1(void) {
    puts("Func1 Called");
}

void Func2(void) {
    puts("Func2 Called");
}

并在公元前访问它

#include <stdio.h>
#include "a.c"
void main() {
    Func1();
    Func2();
}

该程序已成功编译,但是根据提供的信息,该操作将产生错误:undefined reference to Func1。这是怎么了?

2 个答案:

答案 0 :(得分:2)

您没有在另一个文件中包含源文件,而是将它们编译并链接在一起。

在这种情况下,通过说#include "a.c",实际上是将a.c的全部内容放入b.c,然后开始编译,因此static的功能和他们的电话出现在同一个翻译单元中。因此,编译器没有找到被调用函数的问题。

相反,如果您做类似的事情

gcc a.c b.c -o a.out //try to compile and link together

您将看到预期的错误,因为在这种情况下,a.cb.c将是两个单独的翻译单元。

答案 1 :(得分:0)

您在header个文件中声明并在.c个文件中定义。因此,您必须使用头文件来表示所定义的变量或函数。相反,如果您使用.c文件,则会导致多个定义。我认为这就是为什么您可以访问该全局函数。