ANSI C

ANSI C、ISO C、または標準Cとは、米国規格協会 (ANSI) および国際標準化機構 (ISO) が発行したC言語の標準の総称である。歴史的にこれらの名前は特に、オリジナルであり、最もサポートされているバージョンであるC89およびC90のことを指す。C言語でプログラムを作成するソフトウェア開発者は、コンパイラ間の移植性のために、標準に準拠することが推奨される。
歴史と概要.
Cの最初の標準はANSIによって発行された。この文書は後にISOによって採択され、ISOによって公表されたその後の改訂版もANSIによって採択されているが、「ISO C」ではなく「ANSI C」という名称がより広く使用されている。一部のソフトウェア開発者は「ISO C」という用語を使用しているが、他のソフトウェア開発者は発行組織に中立的な「標準C」という用語を使用している。
C89.
1983年、ANSIがC言語の標準仕様を確立するための委員会・X3J11を設立した。この規格は1989年に完成し、ANSI X3.159-1989「プログラミング言語C」として採択された。このバージョンは、しばしば「ANSI C」と呼ばれる。その後、C99が発表されてからは、それ以前のバージョンについても同様の命名法で呼ばれるようになり、このバージョンは「C89」とも呼ばれるようになった。
C90.
C89のフォーマットを変更しただけの標準が、ISOによってISO/IEC 9899:1990として採択された。この標準はC90と呼ばれることがある。C89とC90は本質的には同じ言語である。
この標準は後に、ANSI/INCITS、ISO/IECの双方によって撤回されている。
C95.
1995年、ISOはANSI-C標準の拡張、Amendment 1を発行した。正式名称はISO/IEC 9899/AMD1:1995であり、C95というニックネームを付けた。誤りの訂正の他、以下のような言語の能力のさらなる変更があった。
この改訂に加えて、2つのC90の正誤表がISOによって発行された。
C95互換性を確認するプリプロセッサテスト.
/* C95 compatible source code. */
/* C89 compatible source code. */
C99.
2000年3月、ANSIはISO/IEC 9899:1999を採択した。この規格は、一般に「C99」と呼ばれている。この標準での注目すべき追加点は、以下の通りである。
静的配列インデックス、指定初期化子、複合リテラル、可変長配列、、可変長マクロ、キーワードなどの、新しいコア言語機能
3つのC99の正誤表がISOによって発行された。
この規格は、後述のC11のリリースをもって、とISO/IECの双方によって廃止された。
C11.
2011年12月8日に"ISO/IEC 9899:2011"（通称 C11）として改訂された。このバージョンで導入された注目すべき機能には、改良されたUnicode対応、新しい codice_16 キーワードを使用するタイプジェネリック式、クロスプラットフォームのマルチスレッドAPI (codice_17)、コア言語とライブラリ (codice_18) の両方でのアトミック型対応がある。
1つのC11の正誤表がISOによって発行された。
C17.
2018年に"ISO/IEC 9899:2018"（通称C17またはC18）として改訂された。仕様の欠陥修正がメインのマイナーアップデートである。
その他の関連するISO発行物.
ISOは、標準化プロセスの一環として、C言語に関連する技術レポート (technical report) と仕様書 (specification) も公開している。
TS 18661の5番目と最後の部分、ソフトウェアトランザクショナルメモリ仕様、ライブラリ拡張などの多くの技術仕様が開発中で承認待ちである。
主要なコンパイラによる対応.
ANSI Cは現在広く使用されているほとんどのコンパイラが対応している。現時点で書かれているC言語のソースコードのほとんどは、ANSI Cをベースにしている。標準Cで書かれ、ハードウェアに依存する仮定を持たないプログラムは、準拠したC実装のプラットフォームで正しくコンパイルされることが保証されている。このような予防措置を講じないと、ほとんどのプログラムはGUIライブラリなどの非標準ライブラリの使用やコンパイラ固有の属性やプラットフォーム固有の属性の使用などにより、特定のプラットフォームまたは特定のコンパイラでしかコンパイルされないことになる（特定のデータ型の正確なサイズやエンディアンなど）。
K&R CとANSI Cの違いを緩和するために、codice_19 マクロを使用してコードをANSIセクションとK&Rセクションに分割することができる。
 #if defined(__STDC__) && __STDC__
 extern int getopt(int, char * const *, const char *);
 #else
 extern int getopt();
 #endif