考虑以下示例:
// header props.h
#pragma once
#include <vector>
extern std::vector<int> prop;
struct addToVec
{
addToVec(int a)
{
prop.push_back(a);
}
};
// cpp文件props.cpp
#include "props.h"
std::vector<int> prop;
addToVec b(10);
// main.cpp
#include <iostream>
#include "props.h"
addToVec a2(14);
int main(int argc, char** argv)
{
std::cout << prop.size();
return 0;
}
预期输出为2.但实际输出为1.
这给出了gcc编译器的预期结果(2)(不确定版本)。我正在使用visual studio professional 2013版本12更新5.这是错误还是预期的结果?
元素添加到向量的顺序与我无关。我唯一担心的是,向量中只添加了一个元素(而不是2)。
答案 0 :(得分:4)
答案 1 :(得分:2)
要计算静态初始化排序,您可以使用具有静态成员的函数:
// header props.h
#pragma once
#include <vector>
std::vector<int>& getProp();
struct addToVec
{
addToVec(int a)
{
getProp().push_back(a);
}
};
// cpp file props.cpp
#include "props.h"
std::vector<int>& getProp(){
static std::vector<int> prop;
return prop;
}
addToVec b(10);
通过这种方式,prop
仅在需要时创建。
答案 2 :(得分:1)
这是“静态初始化订单Fiasco”的一个实例 - 请参阅例如static initialization order fiasco
非本地对象的初始化顺序未在C ++中定义,因此在这种情况下,您不能依赖于prop与a2的初始化顺序。您必须选择一个(或两个)在您的控制下显式初始化,而不是依赖于未定义的顺序。