【问题标题】:Global static function still working in another file全局静态函数仍在另一个文件中工作
【发布时间】:2019-03-06 05:03:33
【问题描述】:

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

交流

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

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

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

并在 b.c 中访问它

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

程序成功编译,但根据提供的信息,这应该会给出错误:undefined reference to Func1。这里出了什么问题?

【问题讨论】:

  • 当您包含a.c 时,静态函数是在当前翻译单元或TU 中定义的。这些函数对 TU 中的代码可见。这就是为什么你通常包含标题而不是源代码的原因。
  • #include "a.c"...这不是您使用源文件的方式。您将它们编译并链接在一起,您不会将它们包含在其他源文件中!
  • 不要#include c 源文件。而是分别编译它们,然后将它们链接在一起。编写一个头文件,其中包含跨文件所需的任何东西的原型和外部语句,并将该头文件包含在需要这些跨文件引用的每个文件中,包括包含实际引用的文件

标签: c static global-variables


【解决方案1】:

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

在您的情况下,通过说#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 将是两个独立的翻译单元。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-12-03
      • 2012-04-05
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      相关资源
      最近更新 更多