最近我发现了g++与MSVC++ 2008的一个有趣行为差异。考虑这个小程序:
#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 ++进行这种优化是否可以?(在这种情况下很容易看到,但第一次遇到它时,在一个大项目中,乍一看并不太合理)。