【问题标题】:Static variable with the same name in different file [duplicate]不同文件中具有相同名称的静态变量[重复]
【发布时间】:2014-09-19 19:25:52
【问题描述】:

我尝试运行和编译代码,其中我在两个不同的源文件中定义了具有相同名称的static variables。代码编译成功并运行。

现在我的问题是这两个静态变量都驻留在内存中的 .data/BSS 部分中。据我了解,两个不同的内存位置必须有一个单独的唯一名称标识符。为什么在这种情况下这不是问题?

【问题讨论】:

  • 静态变量意味着它是本地的,不会被导出。
  • 提问前请搜索SO网站。

标签: c variables static


【解决方案1】:

“据我了解,两个不同的内存位置必须有一个单独的唯一名称标识符。” - 在这种情况下,不清楚您所说的“内存位置”是什么意思。内存位置有地址,而不是名称。如果“内存位置”是指“单个变量”,则上述语句仅适用于具有 external 链接的变量。具有外部链接的变量需要外部可见的名称。具有内部链接的变量(静态变量)没有。

在典型的实现中,所有静态符号都由编译器在编译阶段在内部解析。它们不会在目标文件中产生外部名称。即它们根本没有暴露给链接器。在最简单的情况下,来自同一翻译单元的所有静态变量都被链接器视为单个数据块。

当不同的翻译单元聚集在一起进行链接时,不再需要静态变量的所有名称。到那个时候,他们早就被遗忘了。这就是为什么命名冲突没有机会发生的原因。

附:在 C++ 语言中,具有外部链接的内联函数可以在内部定义静态变量。为了提供适当的功能,编译器通常为这些静态变量分配外部名称。同样支持内联函数的 C 语言决定以不同的方式处理这个问题:在 C 语言中,内联函数定义简单地禁止包含静态变量定义。

【讨论】:

  • 感谢您的解释。据我从您的回答中了解到,您的意思是说静态变量在链接时没有解决。它们在编译时被解析,因为静态变量不能在翻译单元(源文件)之外定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 2011-01-27
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多