| C言語の改訂 |
|---|
ANSI C、ISO C、およびStandard Cは、米国規格協会(ANSI)と国際標準化機構(ISO)および国際電気標準会議(IEC)のISO/IEC JTC 1/SC 22 /WG 14によって発行されたCプログラミング言語の連続規格です。歴史的に、これらの名称は、規格のオリジナルかつ最も支持されていたバージョン(C89またはC90として知られています)を指していました。Cで記述するソフトウェア開発者は、これらの規格に準拠することが推奨されます。そうすることで、コンパイラ間の移植性が向上します。
C言語の最初の標準規格はANSIによって発行されました。この文書はその後ISO/IECに採用され、ISO/IECが発行したその後の改訂版もANSIに採用されましたが、この標準規格を指す用語として「ANSI C」は依然として使用されています。[ 1 ]一部のソフトウェア開発者はISO Cという用語を使用していますが、標準化団体に中立で標準Cを使用している開発者もいます。
1978 年の非公式仕様( Brian KernighanとDennis Ritchie の著書「The C Programming Language」)。
1983年、アメリカ規格協会(ANSI)はC言語の標準仕様を策定するために委員会X3J11を設置しました。1985年には最初の標準草案が発表され、C85と呼ばれることもあります。1986年には、別の標準草案が発表され、C86と呼ばれることもあります。プレリリース版の標準Cは1988年に発行され、C88と呼ばれることもあります。[ 2 ]
ANSI規格は1989年に完成し、ANSI X3.159-1989「プログラミング言語C」として承認されました。このバージョンの言語はしばしば「ANSI C」と呼ばれます。後にC90と区別するために「C89」というラベルが使用されることもありますが、ラベル付け方法は同じです。
C89と同じ規格がISO/IECによってISO/IEC 9899:1990として批准されましたが、書式のみが変更されており[ 3 ] 、 C90と呼ばれることもあります。したがって、「C89」と「C90」という用語は、実質的に同一の言語を指します。
この規格はANSI/INCITS [ 4 ]とISO/IEC [ 5 ]の両方で撤回されました。
1995年、ISO / IECはC規格の拡張版「Amendment 1」を公表しました。正式名称は最終的にISO/IEC 9899:1990/AMD1:1995となり、C94またはC95の愛称で呼ばれました。エラー修正以外にも、言語機能には次のような変更が加えられました。 [ 6 ] [ 7 ]
<wchar.h>も導入されました<wctype.h>。and&&__STDC_VERSION__。これは、__STDC_VERSION__値(199409L)を持つ最初の標準規格であると同時に、その値の年が発行年(1995)と一致しなかった最初のバージョンでもあり、C94とC95の両方の名称が一般的に使用されるようになりました。これはC17(2018)とC23(2024)でも発生しましたが、これらはより初期の年でよく知られているのに対し、この標準は後の年で呼ばれることが多いです。[ 8 ]
修正に加えて、ISO によって C90 の 2 つの技術的修正事項が発行されました。
# __STDC_VERSION__ が定義されている場合 && __STDC_VERSION__ >= 199409L/* C95互換ソースコード。 */ #elif defined(__STDC__) /* C89互換ソースコード。 */ #endif2000年3月、ANSIはISO/IEC 9899:1999規格を採用しました。[ 11 ]この規格は一般的にC99と呼ばれています。以前の規格からの主な追加事項は以下のとおりです。
long long、、、_Boolおよび_Complex_Imaginaryrestrictキーワードなど、いくつかの新しいコア言語機能stdint.h<tgmath.h>fenv.h<complex.h>//intC99 に関して、ISO によって 3 つの技術的訂正が公開されました。
この規格はANSI/INCITS [ 12 ]とISO/IEC [ 13 ]の両方で撤回され、C11が採用されました。
C11 は、2011 年 12 月 8 日に正式に承認され、公開されました。注目すべき機能としては、改善されたUnicodeサポート、新しいキーワードを使用した型汎用式_Generic、クロスプラットフォームマルチスレッドAPI ( threads.h)、コア言語とライブラリの両方でのアトミックstdatomic.h型のサポート ( ) などがあります。
C11 に関して、ISO から 1 つの技術的訂正が公開されています。
C17は2018年6月に公開されました。[ 15 ]新しい言語機能を導入するのではなく、C11の欠陥のみに対処しています。[ 16 ]
C23は2024年10月に発行され、Cプログラミング言語の現在の標準となっています。[ 17 ]
C2Y は、2020 年代後半にリリースされることが期待されている C プログラミング言語の次期改訂版の非公式な名称です。
標準化プロセスの一環として、ISO/IEC はC 言語に関連する 技術レポートと仕様も公開しています。
TS 18661の第5部と最終部、ソフトウェアトランザクションメモリ仕様、並列ライブラリ拡張など、さらに多くの技術仕様が開発中であり、承認待ちとなっている。[ 29 ]
ANSI C は、広く使用されているほぼすべてのコンパイラでサポートされています。GCC と Clang は、今日普及している 2 つの主要な C コンパイラであり、どちらも C11 をベースにして、C17 などの後の仕様からの変更を含むアップデートが行われています。 [ 30 ] [ 31 ]標準 Cのみで記述され、ハードウェアに依存する仮定を一切行わなかったソース コードは、準拠した C 実装を持つどのプラットフォームでも正しくコンパイルされることが事実上保証されています。このような予防措置がなければ、ほとんどのプログラムは、たとえばGUIライブラリなどの非標準ライブラリを使用したり、特定のデータ型の正確なサイズやバイトエンディアンなどのコンパイラまたはプラットフォーム固有の属性に依存したりすることによって、特定のプラットフォームまたは特定のコンパイラでのみコンパイルされる可能性があります。
K&R Cと ANSI C 標準の違いを軽減するために、 __STDC__("standard c") マクロを使用してコードを ANSI セクションと K&R セクションに分割できます。
#if defined(__STDC__) && __STDC__ extern int getopt ( int , char * const * , const char * ); #else extern int getopt (); #endif上記の例では、ANSI準拠の実装では関数宣言にプロトタイプが使用されていますが、それ以外の場合は廃止された非プロトタイプ宣言が使用されています。これらはC99時点でもANSI準拠です。このコードが定義と評価の両方をチェックしている点に注意してください。これは、一部の実装では__STDC__ANSI非準拠を示すためにゼロが設定される可能性があるためです。[ 32 ]
ANSI C をサポートするコンパイラのリスト: