无法创建具有恒定大小的数组(“预期的常量表达式”)

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 上使用 malloccalloc。如果要使用 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;

以上是关于无法创建具有恒定大小的数组(“预期的常量表达式”)的主要内容,如果未能解决你的问题,请参考以下文章

在恒定大小的容器中滚动小部件颤动网络

如何从 golang 中的数组 unsafe.Pointer 创建数组或切片?

无法为具有大小的数组分配内存

Java的数组和ArrayList

在 c++11 中复制常量大小数组的最简洁方法

默认 Win32 项目具有恒定数量的内存泄漏