VS2008错误要求在声明数组时使用常量表达式,但GCC中的此代码没有错误
VS2008 error expected constant expression on declaring array, but no error for this code in GCC
我有以下函数
void someFun(int* ar, const int size) {
int newAr[size];
//do something
}
这行有三个错误:
Error 1 error C2057: expected constant expression
Error 2 error C2466: cannot allocate an array of constant size 0
Error 3 error C2133: 'newAr' : unknown size
但是varsize是常量!使用gcc,编译时不会出现错误。你能告诉我vs2008(或者一般的Visual C++)哪里出了问题,为什么出了问题吗?提前谢谢。
size
不是常量表达式。错误消息中的术语"常量表达式"指的是积分常量表达式的C++概念。积分常数表达式的全部思想是,它的值应该在编译时已知。例如,使用初始值设定项声明为的积分const
对象可以用作积分常量表达式。
仅仅因为您声明了某个int
变量const
,并不会将其转化为积分常量表达式。函数参数从不形成积分常数表达式。这就是为什么不能使用size
在C++中定义数组大小的原因。
GCC编译代码是因为它将C语言的C特定特性作为非标准扩展引入C++。请注意,在GCC中,size
也不被认为是常数。GCC并不要求数组大小保持恒定。
如果您将GCC编译器切换到严格而迂腐的C++模式,它将拒绝像MSVC++那样编译您的代码。
静态数组的大小必须在编译时已知(因此它不能是变量,const关键字意味着变量不能更改,但并不意味着变量在整个程序长度上都是常量,在编译时更不为人所知)。你必须这样做:
int* newAr = new int[size];
或者更好地使用矢量:
std::vector<int>(size);
我建议向量过度动态分配数组的原因是,使用数组时,你必须记住在使用完内存后释放内存,否则就会泄漏内存。然而,使用向量,它将管理自己的内存。
您可以在此处获得有关矢量的其他信息。我强烈建议你阅读它们,它们非常有用,在我的情况下,它们是我大部分时间接触的第一个容器。
p.S:正如chris提到的,它在gcc中工作的原因是因为gcc已经有能力做到这一点有一段时间了,但它是一个非标准的扩展,因此不可移植。幸运的是,我相信它已经被纳入C++14标准草案,这意味着很快大多数/所有编译器都会支持它
参数const int size
并不意味着size
是编译时常数。这只是意味着在someFun
中,不能更改size
的值。然而,size
的值可以在someFun
的不同调用之间改变。
C/C++中的数组需要具有编译时已知的大小。
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 我的代码中有错误,未声明的标识符
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- C++ LeetCode #377 的 DP 解决方案中,此代码是否有错误?
- 试图建立银行管理系统,但有错误
- 我试图创建临时对象的方式有错误吗
- 我的随机生成器是否不工作,或者我决定人/骨架是否击中对手的方式是否有错误
- 我在OpenCV中有错误的"approxPolyDP(ROI_Vertices, ROI_Poly, 1.0, true)"
- 使用 std::addressof 时出现 GCC 7 编译错误
- 我在这个 C++ 代码上有错误吗?
- 是视觉C++优化器错误还是我的代码中有错误?
- 将 cctype 函数分配给 std::function,gcc 编译错误
- 使用GCC 4.8构建错误:数组用作初始化器
- 为什么一个简单的C++程序会有错误的结果?是 #define 引起的吗?
- 对此有错误
- C :数据文件有错误:预期的无限制ID
- 一个带有参数的程序,为什么此程序有错误的答案
- 继承默认构造函数在 gcc 中失败并在 clang 中工作,哪个有错误?
- GCC -E -MD是否有错误,或者我缺少一些东西