在哪个C标准版本中,可变长度数组不是语言的一部分,必需的或可选的?

Zar*_*uta 3 c

让我们考虑以下代码:

#include <stdio.h>

int main(){
    int size,i;
    scanf("%d",&size);
    int x[size];

    for(i=0;i<size;i++){
        x[i] = i;
    }

    for(i=0;i<size;i++){
        printf("%d\n", x[i]);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我认为有些版本无法使用定义变量大小的变量声明数组,例如:

int x[size];
Run Code Online (Sandbox Code Playgroud)

但是我不确定是哪个版本。这在所谓的ANSI C中是允许的吗?

Jon*_*ler 7

在C89 / C90中,即使将维数更改为编译时间常数,也无法交错声明和语句,例如将int x[size];声明(定义)放在scanf()— 后面。

在C89 / C90中,您不能使用可变长度的数组-由于该int x[size];定义size不是编译时间常数,因此该定义不合法。

C99编译器需要在函数的(几乎)任意点处支持声明(它们仍然不能带有标签)和可变长度数组(VLA)定义。

C11编译器需要在函数中的任何地方(几乎)支持变量定义。C11编译器可以选择支持VLA(第6.10.8.3条条件功能宏和第6.7.6.2节数组声明符),并应定义__STDC_NO_VLA__它们是否不支持VLA

在此讨论的所有方面,C18均等效于C11。

仅作记录:

  • C89是ANSI X3.159-1989
  • C90是ISO 9899-1990-ANSI版本标记为“ ANSI X3.159-1989的修订和重新命名”。主要区别在于语言和库的章节号。
  • C99是ISO / IEC 9899:1999
  • C11是ISO / IEC 9899:2011
  • C18是ISO / IEC 9899:2018

当然,X3.159-1989唯一不寻常的事情是它是在有ISO标准之前由ANSI发布的。但是,ANSI以及其他国家标准机构(例如BSI(英国标准协会)和DIN(德国规范协会或德国标准化研究所))也都采用了每个后续的ISO标准。

还存在于1994年完成并于1995年发布的修正案1(针对ISO 9899:1990)。该修正案添加了标题并引入了有向图,并对其他内容进行了其他更改。几乎从来没有单独考虑过它,尤其是25年后的现在。

请注意,GCC将-ansi选项等同于-std=c90,这会导致术语混淆。ANSI最初比ISO早一年发布了“ ANSI C标准”,但目的总是要有一个通用标准,并且ANSI在发布时认可了ISO 9899:1990标准。


col*_*lxi 0

ANSI-C (C89)不允许使用变量初始化数组。

例如:

  int x = 5;
  int ia[x];
Run Code Online (Sandbox Code Playgroud)

上面的例子是非法的。ANSI-C 将数组初始化大小限制为常量。但是,您可以使用宏来定义数组的长度。

例子:

    #define MAX_ARRAY_SIZE 5
    int ia[MAX_ARRAY_SIZE];
Run Code Online (Sandbox Code Playgroud)

  • erm C99 允许可变长度数组。 (3认同)
  • @Fred:通俗地说,由GCC编译器部分强制执行,ANSI标准是指C89标准X3.158-1989,在ANSI/ISO 9899-1990标准发布之前发布(标有“ANSI X3.159的修订和重新设计”) -1989”)。主要区别在于 ANSI 和 ISO 标准中的章节编号。GCC 鼓励这种混淆,因为选项“-ansi”相当于“-std=gnu90”,而且很多人将“ANSI C”视为 C89 或 C90 标准——它们实际上是等效的标准。否则,狡辩实际上对任何人都没有多大帮助。 (2认同)