2013-07-15 53 views
5

私はC Primer PlusのVLAについて読んでいます。この本では、CへのVLAの導入がC99標準から始まったと厳密に言います。 forループのヘッダー内でループ制御変数を宣言しようとすると、gccはこのアクションがC99モードでのみ許可されていることを通知します。ただし、次のテストコードはコンパイルと動作します(ただし、配列要素が初期化されていないと考えられるガベージ変数を出力します)。可変長配列は本当にC90では使用できませんか?

#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モードではない場合、どのようにこれはおそらく正当な可能性がありますか?

+0

どのコンパイラを使用していますか?コンパイル時にどのような引数を渡していますか? –

+0

あなたは警告を受けなければなりません:ISO C90は可変長配列 'array''を禁止します –

+0

[この質問](http://stackoverflow.com/questions/5060799/c99-not-default-c-version-for-gcc)厳密には重複ではありませんが、ここでは重要です。 –

答えて

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’ 
+3

もちろん、ここの意味は明らかです:**常に '-pedantic' **でコンパイルしてください** - そして、そのために' -Wall -Wextra -Werror' - 説得力のない理由(壊れるだろうレガシーコード)がない限り。 –

+0

'-pedantic'は、未使用のパラメータについてかなり迷惑になることがあります。 Clangには '-Weverything'フラグが付いています。かなりフラストレーションがかかります。 –

+1

'-pedantic-errors'を使います。未使用のパラメータをコメントアウトします。未使用のパラメータを使用しないでください。待つ:P – rubenvb

9

、可変長配列はC99以来、あなたは、以下のオプションでビルドする場合は、サポートされています

のgcc -std = C89 -pedanticあなたが受け取る

n個の警告:

警告:あなたは、これはあなたが-pedantic-errorsを使用することができ、エラーになりたい場合はISO C90は

[-Wvla]可変長配列「配列」を禁じています。

のgcc -std = c99を-pedantic

Language Standards Supported by GCCページの詳細に入りません:gccあなたがc99モードで明示的に構築することができますし、エラーが表示されます、c99extensionとしてこれをサポート標準gccはCをサポートしており、以下のように述べています。

デフォルトでは、GCCはC言語にいくつかの拡張機能を提供していますCの標準

3

とCTは、「私はC99モードではないんだけど場合は、どのようにこれはおそらく、法的だろうか?」

コンパイラは、C標準に厳密に準拠以外のモードを持つことが許可されています。

実際、C標準はただ1つの仕様です。あなたがそれに従わなければならないという法律はなく、コンパイラ開発者がそれに従わなければならないという法律はありません。

コンパイラでは、独自のバリエーションを定義し、独自の仕様やサードパーティの仕様を使用してコンパイルすることができます。

以上、C標準では言語を拡張可能と定義しています。実装がC標準に準拠している間に定義できる多くの振る舞いがあります。 C標準は、準拠しているプログラムが適合する実装で受け入れられるプログラムであることを指定しています。これは、コンパイラ拡張を使用するプログラムが(他の問題がない場合でも)依然として適合するCプログラムであることを意味します。 (ただし、厳密に準拠したプログラムではなく、拡張機能を使用しないプログラムです)

関連する問題