static关键字将全局变量的作用域限定为该翻译单元。 如果我在.h文件中使用static int x
并将每个其他文件包含该.h文件,是不是它们都属于同一个翻译单元? 那么,到处都不会看到x? 那现在静态的作用是什么?C++ - 好的在.h文件中声明静态全局变量?
此外,是否有任何使用static const int x
,其中x是一个全局变量? 默认情况下,所有常量全局变量都不是静态的吗? 即使它被限制在文件的for循环中,const变量的作用域限于TU吗?
static关键字将全局变量的作用域限定为该翻译单元。 如果我在.h文件中使用static int x
并将每个其他文件包含该.h文件,是不是它们都属于同一个翻译单元? 那么,到处都不会看到x? 那现在静态的作用是什么?C++ - 好的在.h文件中声明静态全局变量?
此外,是否有任何使用static const int x
,其中x是一个全局变量? 默认情况下,所有常量全局变量都不是静态的吗? 即使它被限制在文件的for循环中,const变量的作用域限于TU吗?
如果你写
static const int x
在.H文件,那么每一个翻译单元,的#include -s这个.H将拥有自己的私有变量x
。
如果你想有1全局变量所有人都看得到,你应该写
extern const int x;
在
.H文件
和
const int x = ...;
在的.cpp文件之一。
如果您想让一个静态const int对于一个翻译单元可见 - 请不要在.h文件中提及它。
您将最终将每个翻译的该变量的私人副本,这将导致如果你把它放在那里膨胀。如果要在整个地方随机复制也是没有意义的。不,这不好。
您可以在namespace
区块声明const int
;没关系。
基本上,每个源文件与所有包含的头文件一起是一个单独的翻译单元。因此,如果头文件中有一个静态变量,那么它将在包含头文件的每个源文件(转换单元)中是唯一的。
如果我在.h文件中使用static int x并包含.h文件每 其他文件,是不是都属于同一个翻译单元?
如果您将某些内容声明为static(不在类内部,static class关键字具有不同的语义),则该静态变量不能在其TU外部看到。因此将它放在头文件中会导致包含该头的每个TU拥有该静态变量的不同私有副本。
而且,const变量的作用域限于TU,即使它将 限制在文件中的for循环中?
NO。即使对于一个静态const值,范围是由它的声明决定的。所以范围将被括号限制。
const
合格的变量的可观察差异是在static
版本中,您将获得每个翻译单元一个副本,因此两个此类副本的地址比较可能会失败。
如果您从不使用const
变量的地址,那么任何现代编译器都应该能够使用该值并优化变量本身。在这种情况下,static
const
-qualified变量是完全没问题的。
我发现在头文件中最常用的静态方法是引入错误或使调试更加困难。 – PlasmaHH 2012-08-15 10:21:43