与MSVC++ 2008相比,我最近发现了一个有趣的g ++行为.考虑这个小程序:
#includeconst 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++中,它不是,也可能永远不会有效.