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

35

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


2
"Static global" - 你指的是什么? - Andrzej
2
@Andrzej 在全局范围内使用 static 关键字修饰类型,例如 static int x = 5; - Seth Carnegie
4个回答

38

如果一个非静态全局变量具有外部链接,那么extern有什么用处? - rubenvb
@rubenvb:你的问题的答案在链接中得到了详细解释。 - Alok Save
2
@rubenvb extern 的意思是声明而不是定义,就像函数的原型。 - Seth Carnegie
@SethCarnegie:只有当它没有初始化程序、函数体等内容时,这才是真的(§3.1/2)。@rubenvb:在匿名命名空间中,默认情况下名称具有内部链接性,但您可以将它们显式地再次设置为extern - dyp
@下投反对票的人:如果有任何技术上的原因,请向我们所有人阐明原因。 - Alok Save

12

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


3
更具体地说,使用 static 可以防止链接器将该翻译单元中的符号导出。 - cdhowie

3

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


1
当然,它们可以通过指针"访问"。它们只是不能从其他翻译单元的作用域中使用名称进行引用(§3.5)。 - dyp
1
@DyP 我认为Rahul的意思很明显,即该变量无法通过其名称访问。 - Pavel P

3
如果您不知道区别,正确答案可能会更加令您困惑。简言之,类的静态变量与文件作用域的静态变量没有关联。类的静态变量本质上与常规变量相同,但是必须使用类名前缀引用它们。文件作用域的静态变量是仅局限于该文件的常规变量。要理解这意味着什么,请尝试将两个名称相同的变量添加到单个项目中。您将获得链接错误,因为存在多个相同的符号。通过使符号静态化,您将避免这些问题,并且变量的名称将无法从文件外部访问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接