c++ - 使用枚举值初始化静态全局常量。这样安全吗?陷阱?

标签 c++ static enums initialization

如果你想用类包装一些枚举类型,例如,围绕它构建一些函数,你可能会遇到以下情况:

主要.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/

相关文章:

java - 静态性能和对象性能哪个最好

java - 枚举中来自供应商的无界通配符通用数组

java - 枚举类的未知序数值

c - 同名的两个静态变量(两个不同的文件)和外部其中一个在任何其他文件中

c++ - 在 C++ 源文件中隐藏变量的可见性

java - 在 Java 中你应该总是使用枚举而不是常量吗?

C++ 类型列表及其在列表中的别名

c++ - 16 字节对齐 AAC 编码数据

c++ - 什么被认为是 C++ 中的语句?

c++ - 读取二维数组作为 C++ 函数中的参数?