枚举类型value作为c++中数组的长度

enum type value as the length of a array in C++

本文关键字:数组 c++ 类型 value 作为 枚举      更新时间:2023-10-16

我们都知道,c++中的数组长度必须确定。然后我们可以使用:

const int MAX_Length=100;

或:

#define MAX_LENGTH 100

在编译之前确定数组的长度。但是,当我阅读lippman的c++入门书时,在第5版的第3.5.1章中,它说:数组的长度必须是一个常量表达式。问题来了:

typedef enum Length{LEN1=100, LEN2, LEN3, LEN4}LEN; 
LEN MAX_Length=LEN2;  //101
int iArray[LEN2];     //attention

代码在mingw32g++中编译成功。但是在VS2008中失败了,错误是:

error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2133: 'iArray' : unknown size

我认为枚举值是恒定的,所以它应该被用作数组的长度。对吧?

我很困惑,你能帮我一下吗?谢谢你。

在c++ 11和c++ 03中,枚举数(c++ 11中的无作用域枚举)都是整型常量表达式,因此可用于数组边界。我们可以在c++ 11标准草案5.19 [expr]中看到这一点。Const]表示:

整型常数表达式是整型或的表达式无作用域枚举类型,隐式转换为右值,其中转换后的表达式是一个核心常量表达式。[注:表达式可以用作数组边界(8.3.4,5.3.4),作为位域如果基础类型为,则作为枚举数初始化项不固定(7.2),作为空指针常量(4.10),以及作为对齐(土壤质素)。-end note]

和/或c++ 03我们可以从c++ 03标准草案中看到这一点,或者我们可以得到最接近的相同部分段落1,其中说:

[…整型常量表达式只能包含的字面值算术类型(2.13,3.9.1),枚举数,非易失性const整型或枚举类型的变量或静态数据成员用常量表达式初始化(8.5),非类型模板整型或枚举类型的形参,以及sizeof表达式[…]

在rextester上,这段代码在vc++中编译得很好,所以这在当前版本中不再是一个问题。这一定是2008年的一个错误,最终被修复了。也在webcompiler上进行了测试,最后一次更新是2015年12月3日,所以这也适用于最新版本之一。

另一种方法是使用const int,例如:

const int len = LEN2 ;

这将取决于Visual Studio 2008是否认为枚举数不是整数常量表达式,或者它是否只是在数组边界的上下文中,希望只是后者。

C + + 98

据我所知,这也适用于c++ 98, gccclang都允许在使用-std=c++98时这样做,没有向公众提供的c++ 98标准草案,所以我可以确认超出。