static关键字保持限制在翻译单元的全局变量的作用域。 如果我使用static int x
在.h文件,包括.h文件中所有其他文件,将无法它们都属于同一个翻译单元? 然后,将不是X是随处可见? 所以,现在什么是静态的角色?
此外,有没有使用任何的static const int x
,其中x是一个全局变量? 是不是所有的常量的全局变量默认情况下,静态的? 并且是一个const变量的作用域仅限于TU即使在密闭的文件中循环?
static关键字保持限制在翻译单元的全局变量的作用域。 如果我使用static int x
在.h文件,包括.h文件中所有其他文件,将无法它们都属于同一个翻译单元? 然后,将不是X是随处可见? 所以,现在什么是静态的角色?
此外,有没有使用任何的static const int x
,其中x是一个全局变量? 是不是所有的常量的全局变量默认情况下,静态的? 并且是一个const变量的作用域仅限于TU即使在密闭的文件中循环?
如果你写
static const int x
在.h文件中,然后注意#include -s这个.H每一个翻译单元都会有自己的私有变量x
。
如果你想有1人可见的全局变量,你应该写
extern const int x;
在.h文件和
const int x = ...;
在.cpp文件之一。
如果你想有一个静态的const int的只是一个翻译单元可见-在.h文件根本不提它。
If I use static int x in a .h file and include that .h file every other file, won't they all belong to the same translation unit?
If you declare something as static (not inside a class, for class static keyword has a different semantic), that static variable cannot be seen outside its TU. So putting it in the header file will cause each TU including that header to have a different private copy of that static variable.
And is a const variable's scope limited to the TU even if it confined in a for loop in the file?
NO. Even for a static const value, the scope is determined by it's declaration. So the scope will be limited by your for brackets.
你最终会每翻译变量,这将导致膨胀,如果你把它放在那里就会传抄。 它也将毫无意义不得不到处都是随机副本。 没有它也不行。
你可以声明一个const int
一个namespace
块; 没关系。
对于那些变量的观察到的差异const
资格是,在static
的版本,你会得到每翻译单元一个副本,所以解决这样两个副本的比较可能会失败。
如果你永远不可能用你的地址const
变量任何现代编译器应该能够只使用值和优化变量本身了。 在这样的情况下的static
const
-qualified变量是完全正常。
基本上,每个源与所有包含的头文件一起文件是单个翻译单元。 所以,如果你在头文件中有一个静态变量,那么这将是在每一个源文件(编译单元)独特的头文件包含英寸
“静态全局”是没有意义的,他们是在某种程度上彼此的对立面。
术语“全局”经常被误用来形容在文件范围内的任何函数外部声明的变量。 而是一个全局变量是一个具有外部链接 ,可以被任何文件中的项目进行访问-因此全球性的。
外部连接的相对的是内部连接的,这意味着一个变量只能得到由在声明翻译单元访问。 翻译单元意味着一个.c
文件,并全部由它(递归),包括头。
static
是一个变量得到内部链接的保证。 因此,其他的翻译将不能访问或声明extern
变量引用它。
如果声明,会发生什么static
的头文件变量是多个翻译单元将获得该名称的独立变量。 该代码将编译罚款,但聪明的接头会注意到这一点,并给一个链接错误。 这些类型的链接错误的常常是非描述性的,很难追查。
这导致我们以下最佳做法:
为了防止这种错误,始终围绕以“头卫士”的所有头文件:
#ifndef MYHEADER_H #define MYHEADER_H /* contents of header */ #endif
在文件范围内声明的所有变量应该声明static
,私人封装的目的,并减少杂乱的命名空间。 同样, extern
应该避免,因为它会导致糟糕的设计和意大利面条编程。