ANSICはISOCとまったく同じではなく、コンパイラは「-ansi」の解釈が異なる可能性があることを読みました。(gccはそれをC90にマップし、clangはそれをC89にマップします)現時点では、どの標準が使用されているかが明示的に示されているため、「-ansi」ではなく「-std=...」を使用する傾向があります。Linux、Windows、MACでのコンパイルに特に興味があるので、一部のコンパイラは「-std=...」ではなく「-ansi」を理解できないのではないかと心配しています。では、一方を他方の上に使用することの長所と短所はありますか?
2 に答える
コンパイラに1989ANSIC標準、または同等に1990 ISO C標準(まったく同じ言語を記述している)を適用させたい場合は、またはのいずれかを安全に使用でき-ansi
ます-std=c89
。
名前-ansi
は厳密に言えば正しくありません。1989年のANSIC規格を参照していますが、ANSI自体はその規格を廃止したと見なしています。これは、1999 ISO C標準(ANSIがリリースされた直後に正式に採用された)に置き換えられました。これ自体は、新しい2011 ISO C標準に置き換えられたか、まもなく置き換えられます。ただし、オプションの意味を変更すると、-ansi
多くのsが壊れてMakefile
スクリプトが作成されます。
gcc 4.7以降のバージョンは-std=c90
、の同義語としても認識され-std=c89
ます。gcc 4.7は2012年3月にリリースされた-std=c90
ため、古いバージョンのgccを許可する必要がない限り、かなり移植性があります。
-std=c99
1999 ISO C標準(のほとんど)を実施します。特にMicrosoftはC99をサポートしていないので(これらすべての年月を経ても)、このオプションを使用すると、コンパイラは他の場所ではサポートされていない可能性のあるC99固有の機能の使用について警告しません。gccのC99サポートはここに文書化されています。
gcc 4.7は、新しいISOC2011標準を部分的-std=c11
にサポートしています。このサポートは後のリリースで改善されましたが、まだ完全ではありません。gcc C11ステータスはここに文書化されており、C99サポートのレベルに類似していると言われています。
より多くのオプションがあり、私が言及したものにはいくつかのエイリアスがあります。たとえば、このオプション-std=c9x
は1999 ISO規格が完成する前に追加されましたが、引き続きサポートされています。同様に-std=c1x
、はの同義語です-std=c11
。
clangはgccと可能な限り互換性があることを意図しているので、同じ意味で同じオプションをサポートする必要があると思います(使用しているgccとclangのバージョンによっては、新しいオプションを除く)。
gccマニュアルには完全な詳細があり、1つのセクションではサポートされている標準について説明し、別-ansi
のセクションではさまざまなオプションを指定してい-std=...
ます。リンクは4.7バージョンへのリンクです。info gcc
(GNUコマンドとgccドキュメントがインストールされている場合)実行することもできます。または、ここinfo
でマニュアルの複数のバージョンを見ることができます。
gcc以外のコンパイラ(およびgcc互換を目指すコンパイラ)を使用する場合は、ドキュメントを読んで、C標準のさまざまなバージョンを適用する方法を見つける必要があります。
-ansi
-std=
コンパイラフラグは他のコンパイラと共有される場合がありますが、フラグgcc
です。
現時点ではin-ansi
と同等ですが、これは1)将来変更される可能性があるため、overを使用することをお勧めします。実際、たとえば ISO c99 も ANSI によって承認されています。-std=c89
gcc
-std=c89
-ansi
c89 と c90 は本質的に同じ C 標準であることに注意してください。c89 は ANSI 名で、c90 は ISO 名です。
gcc
ページから:
これらの出版物の間に技術的な違いはありませんでしたが、ANSI 規格のセクションの番号が付け直され、ISO 規格の条項になりました。この規格は、両方の形式で、一般に C89 として、または批准日から C90 として知られています。
1) コメントで Keith Thompson が指摘したように、多くのビルド スクリプトが壊れる可能性は低いですが。