无法创建具有恒定大小的数组(“预期的常量表达式”)
Posted
技术标签:
【中文标题】无法创建具有恒定大小的数组(“预期的常量表达式”)【英文标题】:Can't create array with constant size ("expected constant expression”) 【发布时间】:2018-03-18 13:09:37 【问题描述】:此问题与 Windows 10 上的 Visual Studio (Community 2015) 中的 C 有关。
我似乎无法创建具有 const 大小的数组 - 下面的代码会导致阻止构建的“预期常量表达式”错误。这是一个大小为 size_t 的 wchar_t 数组,但我看到 char 和其他数组类型和 int 常量的行为相同。
我知道在编译时需要知道数组的大小,但这里肯定就是这种情况。什么给了?
#include <stdio.h>
void main()
size_t const newsize = 100;
wchar_t fileData[newsize];
【问题讨论】:
在这种情况下:为什么不简单地wchar_t fileData[100];
?
我现在已经给了它一个 malloc - 我很可能会继续使用数组大小中的那个或硬代码,因为这看起来像是“它就是这样工作的”情况.不过我想知道为什么会这样!
MSVC 不支持“可变长度数组”,其中数组大小由运行时变量指定。 const
限定符不会使其成为常量表达式(可以在编译时评估的东西)。因此,如果您想在运行时指定大小,则只能在 MSVC 上使用 malloc
或 calloc
。如果要使用 VLA,则必须在 Cygwin 环境中使用其他编译器,例如 MinGW 或 gcc。
【参考方案1】:
我知道在编译时需要知道数组的大小,但这里肯定就是这种情况。
实际上并非如此。在 C 中,const
限定不会产生“常量表达式”。所以newsize
不是constant expression(与 C++ 不同)。
如果您的实现支持variable length array (VLA),则您的代码在 C99 和 C11 中有效(VLA 在 C11 中是可选的)。但是,Visual Studio 似乎不支持 VLA,并期望像 C89 中的数组大小有一个“常量表达式”。
因此您可能必须使用动态内存分配(malloc 和朋友),或者简单地将 100
指定为大小,或者使用宏来定义大小等等。
【讨论】:
【参考方案2】:在 C 中,const 限定类型与常量文字不同。
在 MSVC 中有几个选项。首先,你可以硬编码100
:
#define SIZE 100
int main(void) // main returns int etc etc
wchar_t fileData[SIZE];
或者,您可以使用动态内存分配创建数组:
#include <stdlib.h>
int main(void)
const size_t newsize = 100;
wchar_t *fileData;
fileData = calloc(sizeof filedata, newsize);
请注意,您可以在 C99 中执行 const size_t newsize = 100; wchar_t fileData[newsize];
,但 MSVC 仍然不完全支持。
【讨论】:
你的最后一行似乎是答案(除了我认为它必须const int newsize=100;
)以上是关于无法创建具有恒定大小的数组(“预期的常量表达式”)的主要内容,如果未能解决你的问题,请参考以下文章