C - C 函数的作用域

C - Scope of C Functions

如果这是一个初学者的问题,我深表歉意,但在使用 C 语言工作了一段时间之后,我终于想澄清一下 files/functions 函数究竟有哪些类型可用。

我知道我们可以像这样使用 #include 宏显式包含其他文件:

#include bar.c

但是同一目录中的文件呢?假设我们有以下文件结构:

src-
   |
   a.c
   b.c

假设 a.c 具有函数 "foo()" 并且 b.c 具有 "bar()"

即使没有在 header 文件中明确包含 b.c,我能否在 a.c 中调用 bar()?

那么 sub-directories 中的情况如下:

src-
   |
   a.c
   |
   someFolder-
             |
             b.c

我还能在 a.c 中访问 bar() 吗?

基本上,函数的范围(不包括在 header 中)是如何定义的?

取决于您是否将它们链接到一个二进制文件中。

如果链接 - 那么是的,可以使用隐式声明调用函数。

这种情况下的常见模式是制作包含所有声明的头文件,包括 *.c 文件通常不是首选,因为 #include 只是文件内容的文本包含

#include(预处理器指令,不是宏,顺便说一句)有一个可配置的目录搜索列表。 如果您使用 #include "something.h" 形式(与包含系统头文件的尖括号形式相比),列表中的第一个目录是包含文件的目录。

尽管 #include 进行了简单的文本包含,因此在技术上可以包含任何文本文件,但几乎从不包含 c 文件。

在 C 中,通常将 c 文件单独编译成目标文件并 link 将它们一起编译,并且您包含的是包含声明的头文件,这些声明表示您当前的其他目标文件的接口编译单元否则看不到。

查看 http://www.cs.bu.edu/teaching/c/separate-compilation/ 或关于该主题的另一篇文章。

您混淆了范围链接。

术语 scope 描述标识符在给定上下文中是否对编译器可见。 C 语言已知的最广泛的范围是文件范围,这意味着标识符从声明它的那一点到预处理后翻译单元的末尾都是可见的。您可以通过声明来使任何标识符visible/known,但是使标识符可见并不意味着引用该标识符是指它在另一个文件中所引用的东西。

术语链接描述了两个标识符如何指代同一事物。链接分为三个级别:无链接,每个带有名称的标识符指的是不同的事物。使用 内部链接, 同一翻译单元中的每个标识符都指代同一事物。使用外部链接,整个程序中的每个标识符都指向同一事物。两个翻译单元中的两个标识符指的是同一个东西,你需要声明它们都具有外部链接。

这与声明的获取方式无关。在公共头文件中写入 int foo() 与在两个源文件中写入同一行没有区别。在任何一种情况下,所有标识符都引用相同的 foo(),因为函数具有外部链接,除非明确声明具有与 static 类型说明符的内部链接。

它也与源代码的布局方式无关。只要所有的翻译单元链接到同一个二进制文件中,你就可以在每个翻译单元中调用所有带有外部链接的函数。

正斜杠“/”在这种情况下应该有效。

如果您可以毫无问题地包含 foo.h,这意味着目录(例如,C:\DIRFOO)是在编译器的 "include" 指令中预定义的。因此,可以通过 #include <DIRBAR/bar.h>.

包含子目录(例如 C:\DIRFOO\DIRBAR)中的另一个文件(例如 bar.h