Dev*_*lar 89
对不起,当我无序回答你的问题时,这样就更容易理解了.
在头文件中声明静态变量时,其范围仅限于.h文件或所有单元.
没有"头文件范围"这样的东西.头文件包含在源文件中.翻译单元是源文件,包括头文件中的文本.无论你在头文件中写什么,都会被复制到每个包含源文件中.
因此,在头文件中声明的静态变量就像每个单独源文件中的静态变量.
由于声明一个变量static这种方式意味着内部连接,每个翻译单元#include荷兰国际集团的头文件中获取自己的,单独的变量(不可见您的翻译单位外).这通常不是你想要的.
我想知道头文件中的静态变量与类中声明的静态变量之间的区别.
在类声明中,static表示该类的所有实例共享此成员变量; 也就是说,您可能有数百个此类对象,但只要其中一个对象引用static(或"类")变量,它就是所有对象的相同值.您可以将其视为"全球级".
一般来说静态变量在类中声明时在.cpp文件中初始化了吗?
是的,一个(也是唯一一个)翻译单元必须初始化类变量.
那么这是否意味着静态变量范围仅限于2个编译单元?
就像我说的:
static 意味着完全不同的东西取决于背景.全局static限制翻译单位的范围.类static对所有实例都是全局的.
我希望这有帮助.
PS:检查Chubsdad的答案的最后一段,关于你不应该如何static在C++中用于指示内部链接,而是匿名命名空间.(因为他是对的.;-))
Chu*_*dad 48
头文件中的静态变量:
说'common.h'有
static int zzz;
Run Code Online (Sandbox Code Playgroud)
此变量'zzz'具有内部链接(在其他翻译单元中无法访问此相同变量).每个包含的翻译单元'common.h'都有自己唯一的名称对象'zzz'.
类中的静态变量:
类中的静态变量不是类的子对象的一部分.该类的所有对象共享的静态数据成员只有一个副本.
$ 9.4.2/6 - "命名空间范围内的类的静态数据成员具有外部链接(3.5).本地类不应具有静态数据成员."
所以我们可以说'myclass.h'有
struct myclass{
static int zzz; // this is only a declaration
};
Run Code Online (Sandbox Code Playgroud)
并且myclass.cpp有
#include "myclass.h"
int myclass::zzz = 0 // this is a definition,
// should be done once and only once
Run Code Online (Sandbox Code Playgroud)
并且"hisclass.cpp"有
#include "myclass.h"
void f(){myclass::zzz = 2;} // myclass::zzz is always the same in any
// translation unit
Run Code Online (Sandbox Code Playgroud)
并且"ourclass.cpp"有
#include "myclass.h"
void g(){myclass::zzz = 2;} // myclass::zzz is always the same in any
// translation unit
Run Code Online (Sandbox Code Playgroud)
因此,类静态成员不仅限于2个翻译单元.它们只需在任何一个翻译单元中定义一次.
注意:不推荐使用'static'来声明文件范围变量,并且未命名的命名空间是一种优越的替代方法
Gou*_*ham 14
在类外部的头文件中声明的静态变量将位于包含头的file-scoped每个.c文件中.这意味着在包含头文件的每个.c文件中都可以访问具有相同名称的变量的单独副本.
另一方面,静态类变量class-scoped是,每个编译单元都可以使用相同的静态变量,包括带有静态变量的类的头.
| 归档时间: |
|
| 查看次数: |
133923 次 |
| 最近记录: |