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