我正在尝试创建一个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];
答案 0 :(得分:3)
数组的大小是常量表达式。 bufferSize
不是一个常数表达式。
使用vector
:std::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表达式。