如果你想用类包装一些枚举类型,例如,围绕它构建一些函数,你可能会遇到以下情况:
主要.cpp:
#include "WrappedEnumConstants.h"
int main(int argc, char * argv[])
{
WrappedZero.print();
WrappedOne.print();
}
WrappedEnumConstants.h
#ifndef WRAPEDENUMCONSTANTS_H
#define WRAPEDENUMCONSTANTS_H
#include "WrappedEnum.h"
#include "InternalEnum.h"
static const WrappedEnum WrappedZero(ZeroEnum);
static const WrappedEnum WrappedOne(OneEnum);
#endif
WrappedEnum.h
#ifndef WRAPPEDENUM_H
#define WRAPPEDENUM_H
#include <iostream>
#include "InternalEnum.h"
class WrappedEnum
{
public:
WrappedEnum(InternalEnum a);
void print() const;
private:
InternalEnum a;
};
#endif
包装枚举.cpp
#include <iostream>
#include "WrappedEnum.h"
WrappedEnum::WrappedEnum(InternalEnum a) :
a(a)
{}
void WrappedEnum::print() const {
std::cout << "WrappedEnum: " << a << std::endl;
}
内部枚举.h
#ifndef INTERNALENUM_H
#define INTERNALENUM_H
enum InternalEnum { ZeroEnum, OneEnum};
#endif
我得到的输出与预期的一样:
WrappedEnum: 0
WrappedEnum: 1
我想知道静态常量 WrappedZero 和 WrappedOne 的初始化是否安全。 ZeroEnum 和 OneEnum 的常量是否保证在 WrappedZero 和 WrappedOne 之前初始化,或者我只是幸运?特别是,我想知道如果你在一个有很多东西链接在一起的大型项目中使用 WrappedEnum 可能会有什么陷阱。你看到了吗?
枚举常量(如 ZeroEnum 和 OneEnum)和全局“static const int”的初始化有区别吗?
最佳答案
Are the constants of ZeroEnum and OneEnum guaranteed to be initialized before WrappedZero and WrappedOne or was I only lucky?
它们是编译时常量,因此根本不会在运行时初始化。随时使用它们是安全的。
Are there differences in initialization of enum constants (like ZeroEnum and OneEnum) and a global "static const int"?
如果 static const int
是用常量值初始化的,那么在任何知道其值的代码中它将成为编译时常量。否则,它将在程序启动之前的静态初始化阶段进行初始化。无论哪种情况,随时使用它也是安全的。
如果它需要用运行时值初始化,那么它将在动态初始化阶段被初始化(就像你的“包装”对象),你可能会遇到初始化问题订单。
关于c++ - 使用枚举值初始化静态全局常量。这样安全吗?陷阱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18791159/