5

私は C Primer Plus の VLA について読んでいますが、この本は C への VLA の導入は 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 -ペダンティック

次の警告が表示されます。

警告: ISO C90 は可変長配列 'array' を禁止しています [-Wvla]

これをエラーにしたい場合は、 を使用できます-pedantic-errors。の前にこれを拡張機能gccとしてサポートしていたので、モードで明示的にビルドでき、エラーは表示されません。c99c99

gcc -std=c99 -ペダンティック

GCC でサポートされる言語標準のページでは、C をサポートする標準について詳しく説明しgcc、次のように述べています。

デフォルトでは、GCC は C 言語にいくつかの拡張機能を提供しますが、まれに C 標準と競合することがあります。

于 2013-07-15T12:44:46.223 に答える
3
于 2013-07-15T13:25:35.753 に答える