C ++中文件作用域变量行为不一致

加雷斯

标题可能会有所改善,但是我不确定是什么问题。欢迎提出建议。我有一个自定义的枚举类Color

// Color.h
class Color {
protected:
    int id;
    Color(int id) : id(id) {}
    void operator&(); //undefined
public:
    Color(const Color& r) : id(r.id) {}
    Color& operator=(const Color& r) {id=r.id; return *this;}
    bool operator==(const Color& r) const {return id==r.id;}
    bool operator!=(const Color& r) const {return id!=r.id;}
    operator int() const {return id;} //so you can still switch on it

    static Color Blue;          
    static Color Red;           
};

// Color.cpp
#include "Color.h"

Color Color::Blue(0);
Color Color::Red(1);

在中main,我有一个文件范围的数组Colors当我Colors在文件作用域数组中打印的值时,一切正确:

// main.cpp
#include "Test.h"
using namespace std;

const Color mainColors[] = {Color::Red, Color::Red }; // values should be [1, 1]

int main()
{
    cout << "Main file-scoped colors: " << mainColors[0] << ", " << mainColors[1] << endl; // prints [1, 1]
    Test();
    return 0;
}

但是,如果我尝试在另一个文件中执行相同的操作Test,则它将不起作用。当我打印文件作用域的数组时,这些值是不正确的,就像它们未初始化一样。

// Test.h
#include "Color.h"
void Test();

// Test.cpp
#include "Test.h"
const Color fooColors[] = {Color::Red, Color::Red}; // values should be [1, 1]

void Test()
{
    cout << "Test file-scoped colors: " << fooColors[0] << ", " << fooColors[1] << endl; // prints [0, 0]
}

我在这里做错了什么?我认为这可能与枚举成员是静态的有关,但我不能为此投入精力。

萨胡

您看到的问题是静态变量初始化顺序不确定的结果。

只需对构建系统进行少量更改即可轻松更改行为(例如,调试与非调试,向程序添加另一个文件等)。

像看上去mainColorsmain.cpp获取之后,初始化Color::RedColor::Blue初始化,并fooColorsTest.cpp获取之前进行初始化Color::RedColor::Blue初始化。

变通(感谢@Andy)

static成员函数Blue()添加Red()Color用它们来初始化变量main.cppTest.cpp

Color.h

static Color Blue();
static Color Red();

Color.cpp

Color Color::Blue() {return Color(0);}
Color Color::Red() {return Color(1);}

main.cpp

const Color mainColors[] = {Color::Blue(), Color::Red() };

Test.cpp

const Color fooColors[] = {Color::Blue(), Color::Red()};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

循环计数变量的C ++重新声明行为不一致?

来自分类Dev

C ++ 11 regex :: icase不一致的行为

来自分类Dev

MacOS C行为不一致

来自分类Dev

堆栈数组变量不一致 C

来自分类Dev

当涉及c ++ 20概念时,gcc和clang之间的行为不一致

来自分类Dev

CUDA和C ++之间的static_casting中的行为不一致

来自分类Dev

二进制文件的大小不一致,加倍(C / C ++)

来自分类Dev

C ++:将完全限定的名称与排序功能一起使用-行为不一致

来自分类Dev

gcc和clang之间的C ++不一致

来自分类Dev

IPython键盘中断CTRL + C不一致

来自分类Dev

C ++指针引用:不一致的段错误

来自分类Dev

gcc和clang之间的C ++不一致

来自分类Dev

与ReadProcessMemory C ++的数据不一致

来自分类Dev

C 方法产生不一致的结果

来自分类Dev

C++ - 输出语句的顺序不一致

来自分类Dev

C#线程启动顺序不一致

来自分类Dev

C# 列表项值不一致

来自分类Dev

使用泛型的C#8可为空的引用类型处理中的行为不一致

来自分类Dev

从文件还原时,c ++ std :: normal_distribution提供不一致的随机数

来自分类Dev

Bash变量递增,行为不一致

来自分类Dev

C ++(和C)中类型转换期间的明显不一致

来自分类Dev

C语言中的声明和定义不一致

来自分类Dev

C ++ 11:乱序实例成员初始化的警告不一致

来自分类Dev

从C#客户端向Java Server发送数据-数据不一致。

来自分类Dev

使用C函数获取不同R对象的类属性时不一致

来自分类Dev

Visual C ++初始化与gcc和clang不一致

来自分类Dev

客观C正则表达式不一致

来自分类Dev

使用cmath的fmod(C ++)时出现不一致

来自分类Dev

C#中的可访问性不一致?

Related 相关文章

热门标签

归档