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::vector
或 std::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) 函数参数传递中的只读字段