我有两个文件:main.c和main1.c:
main1.c:
#include <stdio.h>
int a = 12;
void foo(void)
{
printf("%d\n", a);
}
的main.c
#include <stdio.h>
#include <stdlib.h>
void foo(void);
int main(void)
{
foo();
}
为什么foo()打印12即使变量&#39; a&#39;在main.c中没有定义,也没有用extern声明?我不能使用&#39; a&#39;在使用extern声明它之前,main.c中的变量。这是否意味着在以某种方式调用函数时它会继承&#39;翻译单元中定义的所有变量在何处定义?我知道联系概念(或者我以为我是),我想知道这里发生了什么。
答案 0 :(得分:1)
foo
的实施可以访问a
。 main.c中的foo
声明并未规定其实现可以访问的内容。
答案 1 :(得分:0)
编译器的功能是将每个.c文件转换为“对象”文件。为此,它会将每个.c文件视为相对隔离。
编译main.c和main1.c时,编译器一次只关注其中一个。
当编译器专注于编译main.c时,不会以任何方式考虑main1.c及其内容。
当编译器专注于编译main1.c时也是如此; main.c及其内容不以任何方式考虑。
因此,两个.c文件完全隔离(彼此)编译。
生成的“对象”文件包含机器代码,导出的符号列表,“未解析的符号”列表以及其他内容。
链接器的功能是打包构成可执行文件的所有“对象”文件,并解析每个“对象”文件中列出的“未解析符号”。
链接器建立连接,例如,在'main1'对象文件导出的函数'foo()'和'main'对象所需的'unresolved external''foo()'之间进行连接文件。
要更正确,main.c中的行:
void foo(void);
应该改为:
extern void foo(void);
由于'main.c'是与'main1.c'隔离编译的,并且由于'main.c'没有引用'a',编译器报告错误。
Why can function defined in a different file access variables defined in that file without extern?
变量'a'是main1对象的内部变量;因此可以完全访问main1中的引用。
事实上,无法访问'a'的'主要'。没有某种'extern int a'引用来告诉编译器'a'的特征,并且链接器负责解析'a'的实际位置。
Why does foo() print 12 even if variable 'a' is not defined in main.c?
变量'a'与'main.c'没有关系。它只存在于'main1.c中。无需在'main.c'中定义值。
Does it mean that when the function is called it somehow 'inherits' all variables defined in translation unit where it's defined?
没有。 (术语“继承”更多地与'面向对象'环境有关。术语'继承'在C中很少使用。)