2013-01-06 33 views
0
int len = GetWindowTextLengthW(hwndEdit) + 1; 
wchar_t text[len]; 

我得到不能分配恒定大小的数组0

错误2错误C2466:不能分配恒定大小的数组0
错误3错误C2133:“文本”:未知大小
错误1错误C2057:预期常量表达式

我不明白为什么它不会编译,因为GetWindowTextLengthW(hwndEdit)+ 1> 0

是不是真的空+ 1 = 1?

+3

[这是无效的C++](http://stackoverflow.com/questions/312116/c-array-size-dependent-on-function-parameter-causes-compile-errors) – DCoder

+0

http:// www。 zetcode.com/gui/winapi/controls/ –

+0

所以谁做的教程制作交流程序,而不是一个C++程序的人? –

回答

3

首先,要使用的语法来声明静态大小的数组,但你在其中在运行时被评估的尺寸变量传递。这就是它不能编译的原因。

其次,你不能静态地分配一个大小为0的数组,但这是另一个问题(尽管std::array允许你这么做)。

我认为你应该使用,而不是动态分配:

wchar_t* text = new wchar_t[len] 

,甚至更好,使用std::wstringstd::vector<wchar_t >

+1

大概'的std ::矢量'在这种情况下。我想它会被用作'GetWindowText'的缓冲区,而'std :: wstring'不能直接做到这一点。 – chris

+0

@chris:好点。 –

+2

@You可以做到这一点与'的std :: wstring'以及,如在:'的std :: wstring的文本(LEN,0); GetWindowText函数(文本[0]);'。在理论上,C++ 98/03允许失败(但它从未真正做到过)。在C++ 11中,std :: basic_string需要连续的缓冲区。 –

0

尝试:

wchar_t* text = new wchar_t[len]; 
+3

...有一个互补的'delete []',据推测。 – Johnsyweb

5

你想要的是不是有照顾关于内存管理,对吗?这就是为什么你选择了一个静态分配的数组。

是的,你可以使用new这里的答案建议,然而,我建议:

std::vector<wchar_t> text;

0

这是事实,那抱怨零,而不是一个非常数值的错误消息是混乱(就像一些编译器抱怨未定义类型的int)。 VLA是一个C99特性,仅在某些C++编译器中以扩展的形式出现(并且在以不同名称部分添加到C++ 14的方式中)。在MSVC下最接近的等价物(在栈上分配,没有调用去分配函数)是_alloca。