VS2010 中的 const 问题

Posted

技术标签:

【中文标题】VS2010 中的 const 问题【英文标题】:const problem in VS2010 【发布时间】:2011-06-26 17:41:30 【问题描述】:

我有最短的问题:

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

【问题讨论】:

我正在使用一个简单的 Win32 控制台应用程序空项目。不知道是不是0x。 keyword的类型是什么? 我更新了问题,字符串。 哪个版本的 gcc?它(正确地)无法在 gcc 中为我编译。注意:我总是使用-std=c++98-std=c++0c “你如何解决它”是什么意思?您可以通过不这样做来解决它...使用可以动态调整大小的容器,例如 std::vectorstd::string,具体取决于您需要使用它做什么。 【参考方案1】:

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

函数调用,如 keyword.size() 在 ICE 中不可用,因此 kwSize 在 ICE 中不可用。

如果它在 gcc 中“完美运行”,则可能是由于错误或某种语言扩展。

在C++0x中,一些函数调用可以用在整型常量表达式中,但必须是constexpr函数,并且有使用限制。据我所知,目前还没有编译器完全支持constexpr。无论如何,std::string::size 不是constexpr

【讨论】:

在 gcc 中它甚至没有给出警告。你能告诉我如何解决它吗? 是:使用-pedantic -std=c++0x 编译以使gcc 拒绝无效代码。 -pedantic-errors -std=c++0x 我同意你的看法。 -pedantic 只发出警告,即使是标准中明确禁止的事情。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

std::vector oldBuffer(kwSize + 1);

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

&oldBuffer[0]

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

更多关于variable array length in gcc的信息

【讨论】:

以上是关于VS2010 中的 const 问题的主要内容,如果未能解决你的问题,请参考以下文章

C# 7.2 const vs referenced(in) 函数参数传递中的只读字段

VS2010中的元帅结构指针

VS 2010 中的 C++ 调试访问冲突

VS2008 中的 C++ 项目有效,但在 VS2010 中无效

VS2010 中的 C++ 智能感知

PuTTY 源中的 VS2010 构建错误