代码之家  ›  专栏  ›  技术社区  ›  PeterK

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

  •  6
  • PeterK  · 技术社区  · 14 年前

    我最近发现,与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++)的知识,这不应该编译,因为我可以用任何我想要的整数调用函数DOMMEthTHEN(),所以在编译时不能确定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++来说做这样的优化是不是很好(在本例中很容易看到,但我第一次遇到它时,它是在一个大型项目中,乍一看没有多大意义)。

    3 回复  |  直到 14 年前
        1
  •  5
  •   Stack Overflow is garbage    14 年前

    C99(C标准的最新版本)允许动态调整数组大小。

    在C++中,它可能并不是有效的。

        2
  •  2
  •   sbi    14 年前

        3
  •  0
  •   Alexandre C.    14 年前

    这不是标准C++(而是标准C)。实现可能会提供alloca(或者用msvc提供alloca),它基本上完成了这项工作。