鉴于其从静态成员变量另一类初始化的静态成员变量静态成员变量相关的初始化静态,非文字struct ii
有时缺省初始化为0
或到333
。这取决于编译或链接顺序。 伪证明:C++:与INT VS结构
class StaticClass: // file 'ONE.cpp/.hpp'
static int i = 2
static struct ii { int a = 333 }
class ABC: // file 'abc.cpp'
static int abc_i = StaticClass::i // always 2
static struct abc_ii = StaticClass::ii // sometimes 0, sometimes 333
调用g++ -std=c++11 abc.cpp ONE.cpp && ./a.out
导致i = 2/ii = 0
(GCC 4.8.1,同样与铛++ 3.7; -Wall -Wextra
从不抱怨)。
但是打电话g++ -std=c++11 ONE.cpp abc.cpp && ./a.out
结果i = 2/ii = 333
!
cat ONE.cpp abc.cpp > X.cpp && g++ X.cpp && ./a.out
VS cat abc.cpp ONE.cpp > Y.cpp && g++ Y.cpp && ./a.out
删除包含在单个文件走动码,默认初始化:
同样串联的文件时这样或那样的情况与ONE.o abc.o
VS abc.o ONE.o
,也0当此订单存在时发生:
const OneI ABC::def_ii = StaticClass::ii; const OneI StaticClass::ii = OneI{333};
和一个333这个顺序:
const OneI StaticClass::ii = OneI{333}; const OneI ABC::def_ii = StaticClass::ii;
为什么这甚至有两个单独的编译单元发生的呢?这可以通过不断地执行后者来避免吗?在ABC
到StaticClass::ii
安全使用静态指针(虽然我不想,但)?
完整的C++代码:
/* File: abc.cpp */
#include <iostream>
#include "ONE.hpp"
struct ABC {
ABC();
static const int def_i;
static const OneI def_ii;
void arg_i(const int &x) { std::cout << "i = " << x << " ";};
void arg_ii(const OneI &x) { std::cout << "/ ii = " << x.a << " ";};
};
ABC::ABC() {
arg_i(def_i);
arg_ii(def_ii);
}
const int ABC::def_i = StaticClass::i;
const OneI ABC::def_ii = StaticClass::ii;
int main() {
ABC a;
std::cout << '\n';
}
/* End: abc.cpp */
/* File: ONE.cpp */
#include <iostream>
#include "ONE.hpp"
const int StaticClass::i = 2;
const OneI StaticClass::ii = OneI{333};
/* End: ONE.cpp */
/* File: ONE.hpp */
#include <iostream>
#ifndef One
#define One
struct OneI {
OneI(int a_) : a(a_) { }
int a;
};
struct StaticClass {
const static int i;
const static OneI ii;
};
#endif // One header guard
/* End: ONE.hpp */
您可能想详细说明静态和动态初始化阶段以及如何建立所需的动态初始化顺序。否则你的答案不到半个故事。 –
@MaximEgorushkin我添加了关于静态和动态初始化的详细说明。虽然它确实有助于理解为什么未初始化的'StaticClass :: ii'的值必须为0,我不同意它对这个问题的重要性。 – user2079303
是命令a)零初始化,b)静态初始化,c)动态初始化?而且由于'const int StaticClass :: i = 2'是b),什么是'const int ABC :: def_i = StaticClass :: i'?动态我会猜测。 – toting