2016-06-15 8 views
0

私のC知識をC99からC11にアップグレードし始めています。私のコンパイラがデフォルトでC11を理解できるかどうか、あるいは-std=c11フラグが必要かと思います。 -std=c99フラグでコンパイルしていない単純なc11ソースコードでどうすればテストできますか? C++ 11標準もありますが、私はthis articleから始まります。最小限のc11ソースコード

auto宣言を使って簡単なコードで試してみましたが、C99でも有効なキーワードなので少し失われてここで尋ねる。

この質問を発行した後、私は__STDC__VERSION__というマクロに関する回答を受け取り、this answerのコードも試しました。

驚くべきことには、私のテストの出力は以下の通りであった。

compile line: gcc main.c -std=c11 -o main.exe 
oputput of main.exe: c11 

compile line: gcc main.c -std=c99 -o main.exe 
oputput of main.exe: c99 

compile line: gcc main.c -o main.exe 
oputput of main.exe: gnu90 

状況は、私はまだありませんコンパイル時に、実行時にコンパイラの機能を得ることができるということです。 nullptrは、C++ 11内にのみ利用可能であるよう

int main() 
{ 
    int *p = nullptr; 
} 

:C++私はC++ 11でのみコンパイルし、このサンプルコードを見つけることができたため

+0

:私は強くあなたはコンパイラがこれを好きなように設定されていることをどのバージョンを確認することができ、C.

プログラムによりを学ぶ場合は特に、常にこの2つのスイッチを使用することをお勧めします[C11](https://en.wikipedia.org/wiki/C11_(C_standard_revision))と[C++ 11](https://en.wikipedia.org/wiki/C%2B%2B11)を混在させていると思います)。 C11は 'auto'型の控除を追加しませんでした.C++ 11はそれを行いました。 CとC++は2つの非常に異なる言語ですが、共通の構文を共有しています。 –

答えて

0

__STDC_VERSION__は、C11の値が201112Lと定義されています。 C99の値は199901Lです。

これは最も信頼できる方法です。

この値は将来の標準で変更され、(クレジットは@ Lundin)、将来のバージョン番号は単調に増加することに注意してください。

2

4.xからGCCがC11サポートを追加し始めました。彼らはますますC11のサポートをますます追加しています。しかし、すべての4.xのバージョンはデフォルトで-std=gnu90です。

5.0以降のGCCは、デフォルトで-std=gnu11に設定されており、C11を理解するはずです。だからあなたのgccのデフォルトを知るには、単にgcc --versionをチェックしてください。

これは標準Cと同じではありません。純粋な標準Cが必要な場合は、常に-std=c11 -pedantic-errorsを使用する必要があります。私は、 `auto`キーワードについて

#if __STDC_VERSION__ == 201112L 
    #error C11 compiler 
#if __STDC_VERSION__ == 199901L 
    #error C99 compiler 
#else  
    #error Sucky compiler 
#endif 
+0

これは将来の標準をSuckyとして実装しているコンパイラを示していますが。あなたはうんざり! Btwには2つのアンダースコアもありませんか?答えが間違っていますか? – Bathsheba

+0

@Bathsheba '#if __STDC_VERSION__> 201112L #error未来コンパイラ#endif'を自由に追加してください。実際には2つのトレーリングアンダースコアがあります。ありがとうございます。 – Lundin

+0

バージョン番号は増えていますか? – Bathsheba

関連する問題