-ansi
30歳に応じてコンパイルするコンパイラを要求時代遅れスイッチであるC標準の時代遅れの改正、1990:ISO / IEC 9899、基本的にANSI標準の再ブランドである言語CプログラミングX3.159-1989は、」。なぜ廃止されたのですか?C90がISOによって公開された後、ISOはCの標準化とすべての技術的な修正を担当してきました C90はISOによって公開されたため、を使用する傾向があります-std=c90
。
このスイッチがない場合、最近のGCC Cコンパイラは、ISO / IEC 9899:2011で標準化されたC言語、または最新の2018リビジョンに準拠します。
残念ながら、一部の遅延コンパイラベンダーの中には、標準化文書が標準化された機関からさえ入手できない、古い廃止された標準リビジョンに固執することは許容できると考えています。
スイッチを使用すると、これらの古いコンパイラでコードを確実にコンパイルできます。
これ-pedantic
は興味深いものです。がない-pedantic
場合、特定の標準が要求された場合でも、GCCはC標準で受け入れられない一部の拡張を許可します。たとえばプログラムを考えてみましょう
struct test {
int zero_size_array[0];
};
C11ドラフトn1570段落6.7.6.2p1氏は述べています:
オプションの型修飾子とキーワードstaticに加えて、[および]は式または*を区切ることができます。式(配列のサイズを指定する)を区切る場合、式は整数型でなければなりません。式が定数式の場合、その値はゼロより大きい値でなければなりません。[...]
C標準では、配列の長さがゼロより大きいことが要求されています。そしてこの段落は制約の中にあります。標準では、次の5.1.1.3p1と記載されています。
動作が未定義または実装として明示的に指定されている場合でも、前処理変換ユニットまたは変換ユニットに構文規則または制約の違反が含まれている場合、適合実装は少なくとも1つの診断メッセージ(実装定義の方法で識別)を生成します。定義された。他の状況では診断メッセージを生成する必要はありません。
ただし、プログラムをコンパイルすると gcc -c -std=c90 pedantic_test.c
、警告は生成されません。
-pedantic
コンパイラーが実際にC標準に準拠するようにします。そのため、標準で要求されているように、診断メッセージが生成されます。
gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array ‘zero_size_array’ [-Wpedantic]
int zero_size_array[0];
^~~~~~~~~~~~~~~
したがって、最大限の移植性を得るには、標準リビジョンを指定するだけでは不十分であり、使用する必要があります-pedantic
(または-pedantic-errors
)を使用して、GCCが実際に標準の文字に準拠していることを確認する。
質問の最後の部分は、使用についてだった-ansi
とC ++。ANSIはC ++言語を標準化したことがなく、ISOから採用しただけなので、これは「フランスで標準化された英語」と同じくらい意味があります。しかし、GCCはそれがC ++の場合はそれを受け入れるように思えます。