2012-08-15 135 views
11

static关键字将全局变量的作用域限定为该翻译单元。 如果我在.h文件中使用static int x并将每个其他文件包含该.h文件,是不是它们都属于同一个翻译单元? 那么,到处都不会看到x? 那现在静态的作用是什么?C++ - 好的在.h文件中声明静态全局变量?

此外,是否有任何使用static const int x,其中x是一个全局变量? 默认情况下,所有常量全局变量都不是静态的吗? 即使它被限制在文件的for循环中,const变量的作用域限于TU吗?

+4

我发现在头文件中最常用的静态方法是引入错误或使调试更加困难。 – PlasmaHH 2012-08-15 10:21:43

回答

31

如果你写

static const int x 

.H文件,那么每一个翻译单元,的#include -s这个.H将拥有自己的私有变量x

如果你想有1全局变量所有人都看得到,你应该写

extern const int x; 
.H文件

const int x = ...; 

的.cpp文件之一。

如果您想让一个静态const int对于一个翻译单元可见 - 请不要在.h文件中提及它。

3

您将最终将每个翻译的该变量的私人副本,这将导致如果你把它放在那里膨胀。如果要在整个地方随机复制也是没有意义的。不,这不好。

您可以在namespace区块声明const int;没关系。

0

基本上,每个源文件与所有包含的头文件一起是一个单独的翻译单元。因此,如果头文件中有一个静态变量,那么它将在包含头文件的每个源文件(转换单元)中是唯一的。

6

如果我在.h文件中使用static int x并包含.h文件每 其他文件,是不是都属于同一个翻译单元?

如果您将某些内容声明为static(不在类内部,static class关键字具有不同的语义),则该静态变量不能在其TU外部看到。因此将它放在头文件中会导致包含该头的每个TU拥有该静态变量的不同私有副本。

而且,const变量的作用域限于TU,即使它将 限制在文件中的for循环中?

NO。即使对于一个静态const值,范围是由它的声明决定的。所以范围将被括号限制。

1

const合格的变量的可观察差异是在static版本中,您将获得每个翻译单元一个副本,因此两个此类副本的地址比较可能会失败。

如果您从不使用const变量的地址,那么任何现代编译器都应该能够使用该值并优化变量本身。在这种情况下,staticconst -qualified变量是完全没问题的。