VS2010中的const问题

时间:2011-06-26 17:41:31

标签: c++ visual-studio visual-studio-2010 gcc

我有最短的问题:

为什么这在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文件中的单个主函数。

5 个答案:

答案 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()在运行时进行评估,因此它不是编译时常量。根据编译器的不同,可能不允许使用依赖于某个运行时值的数组大小。

有关variable array length in gcc

的更多信息

答案 4 :(得分:0)

答案是“表达必须具有恒定值”。 const必须在编译时解决。