我已经尝试运行并编译代码,我在两个不同的源文件中使用相同的名称定义了static variables
。代码已成功编译并正在运行。
现在我的问题是两个静态变量都驻留在内存中的。data/BSS
部分。根据我的理解,两个不同的内存位置必须具有单独的唯一名称标识符。为什么在这种情况下这不是问题?
答案 0 :(得分:2)
“根据我的理解,两个不同的内存位置必须具有单独的唯一名称标识符。” - 在这种情况下,“内存位置”的含义并不清楚。内存位置有地址,而不是名称。如果“内存位置”表示“单个变量”,则上述语句仅适用于具有外部链接的变量。具有外部链接的变量需要外部可见的名称。带有内部链接(静态变量)的变量不会。
在典型的实现中,编译器在编译阶段内部解析所有静态符号。它们不会在目标文件中生成外部名称。即它们根本没有暴露于链接器。在最简单的情况下,来自相同转换单元的所有静态变量都被链接器视为单个数据块。
当不同的翻译单元组合在一起进行链接时,不再需要所有静态变量的名称。到那时,他们早已被遗忘。这就是为什么命名冲突没有机会发生的原因。
P.S。在C ++语言中,允许使用具有外部链接的内联函数来定义内部的静态变量。为了提供适当的功能,编译器通常为这些静态变量分配外部名称。 C语言也支持内联函数,决定以不同的方式处理这个问题:在C语言中,内联函数定义被禁止包含静态变量定义。