我有最短的问题:
为什么这在VS2010中不起作用?
string keyword("lookuptable");
const int kwSize = keyword.size();
char oldBuffer[kwSize+1];
它在GCC中完美运行。 VS2010告诉我
“表达式必须具有常量值”
我正在使用Win32控制台应用程序/空项目。
我绝对没有什么特别的,只是
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>
using namespace std
及其在cpp文件中的单个主函数。
答案 0 :(得分:2)
数组的大小必须是一个整数常量表达式,或ICE(这意味着它必须在编译时才知道)。您可以在ICE中使用const int
,但前提是它的初始化程序本身就是ICE。
函数调用(如keyword.size()
)在ICE中不可用,因此{I}中无法使用kwSize
。
如果它在gcc中“完美地运行”,则可能是由于某种错误或语言扩展所致。
在C ++ 0x中,某些函数调用可用于整型常量表达式,但它们必须是constexpr
函数,并且对它们的使用有限制。据我所知,还没有编译器完全支持constexpr
。无论如何,std::string::size
不是constexpr
。
答案 1 :(得分:2)
GCC具有允许可变长度数组的语言扩展。 Visual C ++没有。必须使用固定的编译时常量初始化基于堆栈的数组。
答案 2 :(得分:1)
正如其他人所提到的,非常数数组边界是GCC扩展(可能是其C99支持的附带好处 - C99允许非常数数组边界)。如果你想在C ++中使用它,你应该使用vector
:
std::vector oldBuffer(kwSize + 1);
要将其转换为char *
,请执行:
&oldBuffer[0]
虽然严格来说这不是C ++ 0x之前的有效C ++,但是到目前为止我遇到的每个编译器都能正常工作。 C ++ 0x追溯性地保留了这种用法,并提供了oldBuffer.data()
等价物。
答案 3 :(得分:0)
keyword.size()
在运行时进行评估,因此它不是编译时常量。根据编译器的不同,可能不允许使用依赖于某个运行时值的数组大小。
答案 4 :(得分:0)
答案是“表达必须具有恒定值”。 const必须在编译时解决。