2010-06-08 62 views
1

我试图创建一个WCHAR:C++ WCHAR:无法分配固定大小的数组0

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 

我在做什么错?

UPDATE:我添加const但它仍然给出了同样的错误:

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

具有在运行时确定的值的'const'变量不是一个常量表达式。 – 2010-06-08 21:56:25

+0

为什么不使用wchar_t数组或甚至可能使用wstring而不是WCHAR数组? – Alerty 2010-06-08 22:02:03

回答

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这样的东西是一个常量表达式,但是不够聪明以至于foo(5,5)是一个常量表达式 - 即使foo(x,y)只是返回x+y

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

+0

对,我将它标记为'CONST long',但它仍然不起作用。 – 2010-06-08 21:57:21

+0

@Rosarch:这只意味着变量不可变,而不是它是一个常量表达式。它需要在编译时知道。 – GManNickG 2010-06-08 21:58:13

3

阵列的大小是一个常量表达式。 bufferSize不是一个常量表达式。使用vectorstd::vector<WCHAR> wszBaz(bufferSize);std::wstring

0

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

要做到这一点,最好的办法是在堆上创建数组如下:

WCHAR* pszBaz = new WCHAR[bufferSize]; 

然后,您需要记住删除[]当你完成它。

即使容易,虽然是只是使用std::wstring ...

+0

在堆栈上创建一个可变大小的数组是完全非法的?那是因为有人可能会创建一个大于堆栈框架的数组吗? – 2010-06-08 21:56:37

+0

我想说从堆中进行任何数组分配的最佳方式是“vector”。 :) @Rosarch:是的,这完全是非法的。是的,这是一个潜在的问题。 C99支持可变长度数组(VLA),C++则不支持。 – GManNickG 2010-06-08 21:56:40

+0

@GMan ...可以说我建议std :: wstring比使用vector要简单得多。使用正确的容器以及所有这些;) – Goz 2010-06-08 21:58:47

0

为什么不直接使用std::wstring

如果你需要确保它有一定的字节数,你可以这样做,当你构建它:

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

,或者您可以使用备用方法:

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