C ++ WCHAR:无法分配常量大小为0的数组

时间:2010-06-08 21:52:27

标签: c++ compiler-construction syntax

我正在尝试创建一个WCHAR:

LONG bufferSize = foo.bar() + 1;
WCHAR wszBaz[bufferSize];

编译器发出错误:

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

我做错了什么?

更新:我添加了const,但仍然会出现同样的错误:

const LONG bufferSize = foo.bar() + 1;
WCHAR wszBaz[bufferSize];

4 个答案:

答案 0 :(得分:3)

数组的大小是常量表达式。 bufferSize不是一个常数表达式。

使用vectorstd::vector<WCHAR> wszBaz(bufferSize);std::wstring

答案 1 :(得分:0)

您正尝试在堆栈上创建一个可变大小的数组。

执行此操作的最佳方法是在堆上创建数组,如下所示:

WCHAR* pszBaz = new WCHAR[bufferSize];

然后,您需要记住在完成后删除[]。

更简单但只是使用std::wstring ...

答案 2 :(得分:0)

为什么不使用std::wstring

如果你需要确保它有一定数量的字节,你可以在构造它时这样做:

std::wstring baz(bufferSize, ' ');

或者您可以使用保留方法:

std::wstring baz;
baz.reserver(bufferSize);

答案 3 :(得分:0)

数组大小必须是常量表达式:

const int foo = 10;
WCHAR array1[123]; // ok - 123 is a constant expression
WCHAR array2[foo + 10]; // ok too - the expression is constant
WCHAR array3[bar(123)]; // not ok - it may evaluate to the same thing every time, but function calls aren't seen as constant.

请注意,const不会使const表达式成为某种东西。 const表达式在编译时是常量。编译器非常聪明,可以发现像5+5这样的东西是一个const表达式,但是不够聪明,无法弄清foo(5,5)是一个const表达式 - 即使foo(x,y)只是x+y返回{{1}}。

在下一个C ++标准(C ++ 0x)中,您将能够将函数定义为const表达式。