枚举类型value作为c++中数组的长度
enum type value as the length of a array in C++
我们都知道,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, gcc
和clang
都允许在使用-std=c++98
时这样做,没有向公众提供的c++ 98标准草案,所以我可以确认超出。
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '