如何在C中编译静态和动态变量
how do static and dynamic variables compiled in C
为什么编译器不知道 C 中动态变量的地址(例如动态数组)?
是不是编译前没有声明变量(数组)的大小?
或者,我想,一个更好的问题是:编译器在编译程序时如何分配静态变量(或数组)的地址?
编译器将开始独立编译每个源文件。
当涉及到静态变量时,它会根据其是否已初始化将其存储在 .bss 或 .data 部分中。
所有 object 文件的所有段都放在一起,称为程序内存映射 如果您的主函数正在调用另一个源文件的函数,则被调用函数的地址将是 'dummy'在 linking 过程中被替换的地址。
静态变量未导出到 linker,这就是为什么没有其他源文件可以访问另一个源文件的静态变量的原因,因为 linker 看不到它。因此,想象编译器在编译过程中不会抛出错误,当所有 object 文件一起 link 时会抛出错误。
如果你想逐步尝试
使用
将两个源文件编译为 object 个文件
gcc -c source1.c -o object1.o
gcc -c source2.c -o object2.o
然后link它与
ld object1.o object2.o
如果您想看到 static 只是 linker 的关键字,您可以这样做
给 source1.c 一个 source2.c 的 header 文件,其中包含名为 test 的变量或数组,但没有关键字 static。在 source2.c 中,您使用关键字 static 定义了相同的变量
请不要在 source2.c 本身中包含 source2.c 的 header。然后再做这三个步骤
当你调用 ld
时,你应该得到一个 linker 错误
为什么编译器不知道 C 中动态变量的地址(例如动态数组)?
是不是编译前没有声明变量(数组)的大小?
或者,我想,一个更好的问题是:编译器在编译程序时如何分配静态变量(或数组)的地址?
编译器将开始独立编译每个源文件。 当涉及到静态变量时,它会根据其是否已初始化将其存储在 .bss 或 .data 部分中。 所有 object 文件的所有段都放在一起,称为程序内存映射 如果您的主函数正在调用另一个源文件的函数,则被调用函数的地址将是 'dummy'在 linking 过程中被替换的地址。 静态变量未导出到 linker,这就是为什么没有其他源文件可以访问另一个源文件的静态变量的原因,因为 linker 看不到它。因此,想象编译器在编译过程中不会抛出错误,当所有 object 文件一起 link 时会抛出错误。
如果你想逐步尝试 使用
将两个源文件编译为 object 个文件gcc -c source1.c -o object1.o
gcc -c source2.c -o object2.o
然后link它与
ld object1.o object2.o
如果您想看到 static 只是 linker 的关键字,您可以这样做
给 source1.c 一个 source2.c 的 header 文件,其中包含名为 test 的变量或数组,但没有关键字 static。在 source2.c 中,您使用关键字 static 定义了相同的变量 请不要在 source2.c 本身中包含 source2.c 的 header。然后再做这三个步骤
当你调用 ld
时,你应该得到一个 linker 错误