外部变量内存位置和 Compile/Run 时间行为
Extern variable memory location and Compile/Run time behaviour
我已经阅读了很多关于外部变量的内容,但似乎没有人适当地解决它。如果我在 C 中声明和定义一个变量,它会在文件的该范围内分配内存。但在稍后阶段,在多文件模块化项目中,该变量被声明为 extern,应该将其存储在数据段中,以展示 extern 功能预期的全局行为。
所以我想弄清楚分配内存的方式和时间,即编译时间和外部变量的 运行 时间行为。
其中一个编译单元必须将变量定义为全局变量。编译此文件时,为数据段中的变量分配内存,类似于文件作用域变量。不同的是,该变量被注册在 linkage table 中,以便其他目标文件可以找到它。
所有其他编译单元使用extern
关键字声明它。这可以防止他们为变量分配内存,并安排 linker 找到外部变量。
当你 link 所有目标文件在一起时, link er 找到所有具有对该变量的外部引用的目标文件,并将该 link 连接到内存在第一个目标文件中分配的。
我已经阅读了很多关于外部变量的内容,但似乎没有人适当地解决它。如果我在 C 中声明和定义一个变量,它会在文件的该范围内分配内存。但在稍后阶段,在多文件模块化项目中,该变量被声明为 extern,应该将其存储在数据段中,以展示 extern 功能预期的全局行为。
所以我想弄清楚分配内存的方式和时间,即编译时间和外部变量的 运行 时间行为。
其中一个编译单元必须将变量定义为全局变量。编译此文件时,为数据段中的变量分配内存,类似于文件作用域变量。不同的是,该变量被注册在 linkage table 中,以便其他目标文件可以找到它。
所有其他编译单元使用extern
关键字声明它。这可以防止他们为变量分配内存,并安排 linker 找到外部变量。
当你 link 所有目标文件在一起时, link er 找到所有具有对该变量的外部引用的目标文件,并将该 link 连接到内存在第一个目标文件中分配的。