Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 名称空间是否影响C++;?_C++_Static_Namespaces_Initialization - Fatal编程技术网

C++ 名称空间是否影响C++;?

C++ 名称空间是否影响C++;?,c++,static,namespaces,initialization,C++,Static,Namespaces,Initialization,全局变量按照在翻译模块中出现的顺序进行初始化,不同翻译模块中变量的相对初始化顺序(所谓的“静态初始化顺序失败”) 名称空间对此有影响吗?例如,如果我有以下代码: //first.cpp int first; int second; //second.cpp namespace { int first; } int second; 与此代码相比,其初始化顺序是否有任何差异: //first.cpp int first; int second; //second.cpp namespace {

全局变量按照在翻译模块中出现的顺序进行初始化,不同翻译模块中变量的相对初始化顺序(所谓的“静态初始化顺序失败”)

名称空间对此有影响吗?例如,如果我有以下代码:

//first.cpp
int first;
int second;
//second.cpp
namespace {
int first;
}
int second;
与此代码相比,其初始化顺序是否有任何差异:

//first.cpp
int first;
int second;
//second.cpp
namespace {
int first;
}
int second;
是否存在将全局对象放入命名空间会影响初始化顺序的情况?

那么,“全局变量按照在转换模块中出现的顺序进行初始化”是确定的。它不会为其他任何东西(如名称空间)留下任何影响顺序的空间

事实上,“全局变量按顺序初始化…”是标准的不精确引用,因为它在形式上是错误的。从C++标准、ISO/IEC 1488、2003、3.6、1段的准确措辞为:

在同一转换中命名空间范围中定义了静态存储持续时间的对象 单元和动态初始化应按照其定义在翻译单元中出现的顺序进行初始化

因此,它不是说“全局”,而是说“使用静态存储”,即所有非局部变量,无论它们是全局变量、名称空间成员还是类成员,以及它们是否声明为
静态变量

它还添加了“和动态初始化”。具有平凡构造函数和常量初始值设定项的变量总是首先初始化(通过简单地从二进制加载它们的值),然后对所有非常量初始值设定项求值,并按该顺序运行非平凡构造函数。这很重要,例如,您可以在这些构造函数中可靠地创建一个链表;若它的头是普通指针,那个么它已经初始化,所以您可以安全地使用它

3.6具有静态存储持续时间的其他非局部变量已命令初始化。变量 如果在单个翻译单元中定义了有序初始化,则应按照其顺序初始化 翻译单元中的定义

名称空间对此没有影响-本节未提及


影响顺序的是不同的翻译单位。如果需要定义它们之间的顺序,请使用扩展名,如GCC的
构造函数
属性。

+1作为强调:
确定了“全局变量按照在翻译模块中出现的顺序进行初始化”
。故事结束了!“确定”语句只影响全局变量。用户定义名称空间中的内容不可用global@JohannesSchaub-利特:是的,它们是全球性的。你逼我看说明书上的确切措辞。好了,来了。。。请注意,C++标准定义全局名称仅是出现在全局范围内的([Basic,Simult.NealStays] / 3)。就C++而言,第二个CPP <代码>第一个/COD>不是全局的。显然,对于“全局”的所有实际用途,尤其是可变的“全局”是一个PITA,在所有编程语言中,它都是一个“全局”。与其使用扩展来控制顺序,我建议完全避免依赖性。@DavidRodríguez dribeas更好,避免静态存储。