【问题标题】:What is the difference between static global and non-static global identifier in C++?C ++中的静态全局标识符和非静态全局标识符有什么区别?
【发布时间】:2012-10-31 16:03:18
【问题描述】:

C++ 中static 全局标识符和非static 全局标识符有什么区别?

【问题讨论】:

  • “静态全局”——你的意思是什么?
  • @Andrzej 一个带有 static 关键字前缀的全局类型。例如,static int x = 5; 在全局范围内。

标签: c++ static global-variables identifier


【解决方案1】:

Static 将变量的范围限制为相同的translation unit
静态全局变量具有内部链接
非静态全局变量具有外部链接

好读:
What is external linkage and internal linkage?

【讨论】:

  • 如果非静态全局有外部链接,extern有什么用?
  • @rubenvb:你的问题的答案在链接内联回答中有详细解释。
  • @rubenvb extern 表示它是声明而不是定义,就像函数的原型一样。
  • @SethCarnegie:只有在没有初始化程序或函数体等情况下才成立(第 3.1/2 节)。 @rubenvb:在匿名命名空间中,默认情况下名称具有内部链接,但您可以再次明确地将它们设为extern
  • @Downvoter:如果反对票有任何技术原因,请告知我们所有人。
【解决方案2】:

全局static 变量仅在变量所在的翻译单元(即源文件)中可用。非静态全局变量可以从其他源文件中引用。

【讨论】:

  • 更具体地说:使用static 可防止链接器从该翻译单元导出符号。
【解决方案3】:

全局非静态变量可以从其他文件访问,而静态全局变量则不能

【讨论】:

  • 当然,它们可以通过指针“访问”。它们只是“不能被其他翻译单元范围内的名称引用”(第 3.5 节)。
  • @DyP 我认为很明显,Rahul 的意思是该变量无法通过其名称访问。
【解决方案4】:

如果你不知道有什么区别,正确的答案可能会让你更加困惑。简而言之,一个类的statics 与文件范围内的静态无关。类的静态本质上与常规变量相同,但必须通过在它们前面加上类名来引用它们。文件范围内的静态变量是仅对文件本地的常规变量。要理解这意味着什么,请尝试将两个具有相同名称的变量添加到单个项目中。您将收到链接器错误,因为有多个相同的符号。通过将符号设为静态,您将避免问题和变量名无法从文件外部访问。

【讨论】:

    猜你喜欢
    • 2016-08-29
    • 2014-04-02
    • 1970-01-01
    • 2018-12-22
    • 2010-10-31
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多