VS2010中的const问题

const problem in VS2010

本文关键字:问题 const 中的 VS2010      更新时间:2023-10-16

我有一个最短的问题:

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

数组的大小必须是整数常量表达式或ICE(这意味着它必须在编译时已知)。您可以在ICE中使用const int,但前提是其初始值设定项本身就是ICE。

keyword.size()这样的函数调用在ICE中不可用,因此kwSize在ICE中也不可用。

如果它在gcc中"完美工作",那要么是由于错误,要么是某种语言扩展

在C++0x中,一些函数调用可以在积分常量表达式中使用,但它们必须是constexpr函数,并且它们的使用受到限制。据我所知,目前还没有一个编译器完全支持constexpr。在任何情况下,std::string::size都不是constexpr

GCC有一个允许可变长度数组的语言扩展。Visual C++没有。必须使用固定的编译时常数初始化基于堆栈的数组。

正如其他人所提到的,非常量数组边界是GCC的扩展(可能是其C99支持的一个附带好处-C99确实允许非常量数组界限)。如果你想在C++中使用这个,你应该使用vector:

std::vector oldBuffer(kwSize + 1);

要将其转换为char *,请执行以下操作:

&oldBuffer[0]

虽然严格地说,这不是C++0x之前的有效C++,但它在我迄今为止遇到的每一个编译器中都能正常工作。C++0x追溯性地支持这种用法,并且还提供了等效的oldBuffer.data()

答案是"表达式必须具有常数值"。const必须是在编译时解析的内容。

keyword.size()在运行时求值,因此它不是编译时常数。根据编译器的不同,可能不允许使用取决于某个运行时值的数组大小。

关于gcc 中可变数组长度的一些进一步信息