6

与 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++做这样的优化是不是很好(在这种情况下很容易看到,但是我第一次遇到它,它是在一个大项目中,乍一看并没有多大意义)。

4

3 回答 3

5

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

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

于 2010-06-22T12:31:48.237 回答
2

动态大小的数组是 C99 的一个特性。如果你的编译器支持 C99(GCC 支持,VC 不完全支持)——并且如果你抛出 C99 开关——那么这将编译。

于 2010-06-22T12:32:08.640 回答
0

这不是标准 C++(而是标准 C)。实现可以提供几乎可以完成工作的 alloca(或带有 msvc 的 _alloca)。

于 2010-06-22T12:42:26.293 回答