gpt4 book ai didi

c++ - 具有数组分配的编译器的不同行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:21 24 4
gpt4 key购买 nike

与 MSVC++ 2008 相比,我最近发现 g++ 有一个有趣的行为。考虑这个小程序:

#include <cstdlib>

const int ARR_LENGTH = 512;

void doSomething( int iLen );

int main( int argc, char** argv )
{
doSomething( ARR_LENGTH );
return 0;
}

void doSomething( int iLen )
{
int iTest[iLen];
return;
}

它会编译吗?你怎么看?根据我对 C(或 C++)的了解,这不应该编译,因为我可以用我想要的任何整数调用函数 doSomething(),所以 iTest 数组的大小无法在编译时确定。然而,当我尝试用 g++ 编译它时,它工作得很好。现在我可以理解这里可能发生了什么——编译器注意到我只调用这个函数一次,传递一个编译时常量作为参数。这里进行了一些认真的优化......但是当我尝试使用 MSVC++ 2008 编译它时,我得到了这个:

1>c:\prj\test\test.cpp(15) : error C2057: expected constant expression
1>c:\prj\test\test.cpp(15) : error C2466: cannot allocate an array of constant size 0
1>c:\prj\test\test.cpp(15) : error C2133: 'iTest' : unknown size

我的问题是:这怎么符合语言的定义(C标准(C++标准))? g++ 做这样的优化就好了吗(在本例中很容易看到,但我第一次遇到它是在一个大项目中,乍一看没有多大意义)。

最佳答案

C99(C 标准的最新版本)确实允许动态大小的数组。但是,该功能不受 Visual Studio(仅实现 C89 支持)的支持

在 C++ 中它不是,而且可能永远不会是有效的。

关于c++ - 具有数组分配的编译器的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3093049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com