5

我正在阅读 C Primer Plus 中的 VLA,这本书严格地说,将 VLA 引入 C 是从 C99 标准开始的。每当我尝试在 for 循环的标头中声明循环控制变量时,gcc 都会通知我此操作仅在 C99 模式下允许。但是,以下测试代码可以编译并运行(尽管它会打印垃圾变量,考虑到没有初始化任何数组元素,这是可以预料的)。

#include <stdio.h>

int main(){
    int x; 
    int i = 9; 
    int array[i]; 

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

    return 0; 
}

如果我不在 C99 模式下,这怎么可能是合法的?

4

3 回答 3

9

这本书是正确的,从C99开始就支持可变长度数组,如果您使用以下选项构建:

gcc -std=c89 -pedantic

您将收到警告:

警告:ISO C90 禁止变长数组 'array' [-Wvla]

如果您希望这是一个错误,您可以使用-pedantic-errors. 之前gcc支持此作为扩展c99,您可以在模式下显式构建c99,您将不会看到任何错误:

gcc -std=c99 -pedantic

GCC 支持的语言标准页面详细介绍了哪些标准gcc支持 C,并指出:

默认情况下,GCC 为 C 语言提供了一些扩展,这些扩展在极少数情况下会与 C 标准冲突

于 2013-07-15T12:44:46.223 回答
8

如果我不在 C99 模式下,这怎么可能是合法的?

它不是。但是,GCC 允许它作为编译器扩展

-pedantic您可以通过传递标志来强制 GCC 对此严格要求:

$ gcc -std=c89 -pedantic main.c
main.c: In function ‘main’:
main.c:6: warning: ISO C90 forbids variable-size array ‘array’
于 2013-07-15T12:41:30.743 回答
3
于 2013-07-15T13:25:35.753 回答