06月20, 2013

C/C++到底支不支持定义不定长数组(VLA)

注意:这是一篇从旧博客恢复的文章。

原地址:http://freemeepo.com/acm/881.html

注:有更新


今天一同学写了个int n=5;int a[n];这样的代码,问我能不能过编译。我很果断地告诉他不能过。结果试了一下才发现,这竟然也能过编译!!!不科学!!!

我又试了试如下代码,也能正常运行。

#include<iostream>
using namespace std;
int main()
{
  int n;
  cin>>n;
  int a[n];
  cout<<sizeof(a);
  return 0;
}

简直毁三观啊有木有!!!因为不论是C还是C++的书上都明确说明了“数组的维数必须用值大于等于1的常量表达式定义”。于是我一直坚信这种写法过不了编译,所以也一直都没亲自敲代码去试一下。C++ primer第四版中原文如下:

The dimension must be a constant expression (Section 2.7 , p. 62 ) whose value is greater than or equal to one. A constant expression is any expression that involves only integral literal constants, enumerators (Section 2.7 , p. 62 ), or const objects of integral type that are themselves initialized from constant expressions. A nonconst variable, or a const variable whose value is not known until run time, cannot be used to specify the dimension of an array.

后来又经测试,Codeblocks、Devcpp、C-free 5.0等基于MinGW(G++)的IDE均可通过编译,Turbo C 3.0、VS系列无法通过编译。那么为什么会有这样的差别呢?是否支持定义不定长数组与C/C++标准有什么关系呢?接下来我们就来解决这个问题。

事实上,不定长数组的定义早在C的C99标准里就已经被提出,但是从来都没在C++标准(C++98、C++03、C++11)里存在过。因此,G++支持不定长数组完全是因为它同时支持C99和C++(对C99标准支持得最好的就是G++了),而VS不怎么支持C99标准那是人尽皆知的,也就理所当然不支持C99的不定长数组了。另外Turbo C 3.0不支持是因为它非常古老,本身就不支持C99。

PS:目前没有编译器可以完全实现C99,而且为了兼容性,在写C代码时,通常我们不会去用C99标准,编译器也是默认不使用C99的,因此C语言的书里说不允许这样定义数组,也是可以理解的。而C++ primer里也这么说,那是因为它说的是事实,C++里根本就不支持不定长数组。

UPDATE: 当时认为VS对C99支持不好可能是因为我用的VS版本比较低导致的。

本文链接:https://debug.fanzheng.org/post/vla-support-in-C-and-CPP.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。