ANSI C、ISO C、およびStandard Cは、国際標準化機構(ISO) および国際電気標準会議 (IEC) の米国規格協会(ANSI) および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 を使用する開発者もいます。
非公式仕様: K&R C (C78)
1978 年の非公式仕様( Brian KernighanとDennis Ritchie の著書「The C Programming Language」)。
Cの標準化
1983年、アメリカ規格協会はCの標準仕様を確立するために委員会X3J11を結成した。1985年に最初の標準草案が発表され、C85と呼ばれることもある。1986年には別の標準草案が発表され、C86と呼ばれることもある。プレリリース標準Cは1988年に発行され、C88と呼ばれることもある。[2]
C89
ANSI 標準は 1989 年に完成し、ANSI X3.159-1989「プログラミング言語 C」として承認されました。このバージョンの言語は、多くの場合「ANSI C」と呼ばれます。後に、C90 と区別するために「C89」というラベルが使用されることもありますが、ラベル付け方法は同じです。
C90
C89と同じ規格がISO/IECによってISO/IEC 9899:1990として批准されましたが、フォーマットの変更のみが行われ、[3] C90と呼ばれることもあります。したがって、「C89」と「C90」という用語は、実質的に同一の言語を指します。
この規格はANSI/INCITS [4]とISO/IEC [5]の両方で撤回されました。
C95
1995年、ISO / IECはC標準の拡張版であるAmendment 1を発行しました。その正式名称は最終的にISO / IEC 9899:1990 / AMD1:1995、または愛称C95となりました。エラー修正以外にも、言語機能には次のような変更が加えられました。 [6] [7]
- 標準ライブラリのマルチバイトおよびワイド文字のサポートが改善され、マルチバイトI/O
<wchar.h>も導入され<wctype.h>ました。 - 言語への二重音字の追加
- 演算子の代替指定のための標準マクロの指定、例
and:&& - 標準マクロの仕様
__STDC_VERSION__
修正に加えて、C90 に関して ISO によって 2 つの技術的修正事項が発行されました。
- ISO/IEC 9899:1990/Cor 1:1994 TCOR1 1994年[8]
- ISO/IEC 9899:1990/Cor 2:1996(1996年)[9]
C95 互換性のためのプリプロセッサ テスト
# 定義されている場合(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L
/* C95 互換ソースコード。 */
#elif defined(__STDC__)
/* C89 互換ソースコード。 */
#endif
C99
2000年3月、ANSIはISO/IEC 9899:1999規格を採用しました。[10]この規格は一般にC99と呼ばれています。以前の規格に追加された注目すべき機能には以下のものがあります。
- 新しい組み込みデータ型:
long long、、、_Boolおよび_Complex_Imaginary - 静的配列インデックス、指定初期化子、複合リテラル、可変長配列、柔軟な配列メンバー、可変長マクロ、
restrictキーワードなど、いくつかの新しいコア言語機能 stdint.h、、を<tgmath.h>含むいくつかの新しいライブラリ ヘッダーfenv.h<complex.h>- インライン関数、を使用した単一行コメント、宣言とコードの混在、識別子内のユニバーサル文字名など、いくつかのC++機能との互換性が向上しました。
// - 暗黙の関数宣言や暗黙の
int
ISO によって C99 に関する 3 つの技術的訂正が公開されました。
- ISO/IEC 9899:1999/Cor 1:2001(E)
- ISO/IEC 9899:1999/Cor 2:2004(E)
- ISO/IEC 9899:1999/Cor 3:2007(E)、標準ライブラリ関数getsを非推奨にしたことで有名
この規格はANSI/INCITS [11]とISO/IEC [12]の両方で撤回され、代わりにC11が採用されました。
C11
C11 は、2011 年 12 月 8 日に正式に承認され、公開されました。注目すべき機能としては、改善されたUnicodeサポート、新しいキーワードを使用した型ジェネリック式_Generic、クロスプラットフォームマルチスレッドAPI ( threads.h)、コア言語とライブラリの両方でのアトミックstdatomic.h型のサポート ( ) などがあります。
C11 に関して ISO から 1 つの技術的訂正が発行されています。
- ISO/IEC 9899:2011/Cor 1:2012 [13]
C17
2018年10月現在[アップデート]、「C17」がCプログラミング言語の現在の標準となっている。[14]
C17は新しい言語機能を導入することなくC11の欠陥に対処しました。[15]
C23
C23はC言語の次期メジャー標準改訂版の非公式名称です。[16]
その他の関連ISO出版物
標準化プロセスの一環として、ISO/IEC はC 言語に関連する 技術レポートと仕様も公開しています。
- ISO/IEC TR 19769:2004、[17] Unicode変換フォーマットをサポートするためのライブラリ拡張に関するもので、C11に統合されている。
- ISO/IEC TR 24731-1:2007、[18]境界チェックされたインターフェースをサポートするためのライブラリ拡張に関するもので、C11に統合されている。
- ISO/IEC TR 18037:2008、[19]組み込みC拡張に関する
- ISO/IEC TR 24732:2009、[20] 10進浮動小数点演算に関する規格。ISO/IEC TS 18661-2:2015に置き換えられた。
- ISO/IEC TR 24747:2009、[21]特殊な数学関数について
- ISO/IEC TR 24731-2:2010、[22]動的割り当て機能をサポートするためのライブラリ拡張について
- ISO/IEC TS 17961:2013、[23] C言語での安全なコーディングについて
- ISO/IEC TS 18661-1:2014、[24] IEC 60559:2011互換の2進浮動小数点演算について
- ISO/IEC TS 18661-2:2015、[25] IEC 60559:2011互換の10進浮動小数点演算について
- ISO/IEC TS 18661-3:2015、[26] IEC 60559:2011互換の交換および拡張浮動小数点型について
- ISO/IEC TS 18661-4:2015、[27] IEC 60559:2011互換の補足機能について
TS 18661の第5部と最終部、ソフトウェアトランザクションメモリ仕様、並列ライブラリ拡張など、さらに多くの技術仕様が開発中であり、承認待ちとなっている。[28]
主要コンパイラからのサポート
ANSI Cは現在、広く使用されているほぼすべてのコンパイラでサポートされています。GCCとClangは、今日人気のある2つの主要なCコンパイラであり、どちらもC11に基づいており、C17などの後の仕様からの変更を含むアップデートが行われています。 [29] [30]標準Cのみで書かれ、ハードウェアに依存する仮定を一切せずに書かれたソースコードは、準拠したC実装を持つどのプラットフォームでも正しくコンパイルされることが事実上保証されています。このような予防措置がなければ、ほとんどのプログラムは、たとえばGUIライブラリなどの非標準ライブラリの使用や、特定のデータ型の正確なサイズやバイトエンディアンなどのコンパイラまたはプラットフォーム固有の属性への依存により、特定のプラットフォームまたは特定のコンパイラでのみコンパイルされる可能性があります。
コンプライアンス検出可能性
K&R Cと ANSI C 標準の違いを軽減するために、 __STDC__("標準 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非準拠を示すためにゼロに設定する可能性があるためです。[31]
コンパイラサポート
ANSI C をサポートするコンパイラのリスト:
- Acornsoft ANSI C (最初のバージョンは 1988 年、1989 年に改訂)
- アムステルダム コンパイラ キット(C K&R および C89/90)
- ARMリアルビュー
- Clang、LLVMバックエンドを使用
- GCC (フル C89/90、C99、C11)
- HP C/ANSI Cコンパイラ(C89およびC99)[32]
- IBM XL C/C++(C11、バージョン12.1以降)[33]
- インテルのICC
- ラボウィンドウズ/CVI
- LCC
- Oracle 開発者スタジオ
- OpenWatcom (C89/90 および一部の C99)
- Microsoft Visual C++ (C89/90 および一部の C99)
- Pelles C(C99およびC11。Windowsのみ)[34]
- vbcc (C89/90 および C99)
- 小さな C コンパイラ(C89/90 および一部の C99)
参照
- 動作記述言語
- C と C++ の互換性
- C++23、C++20、C++17、C++14、C++11、C++03、C++98、C++プログラミング言語標準のバージョン
- C++ テクニカルレポート 1
参考文献
- ^ Brad Kelechava (2017-09-14). 「ANSI C と ISO C の起源」。2018 年 8 月 14 日閲覧。
- ^ Richard Hale Shaw (1988年9月13日). 「Standard C: The ANSI Draft Grows Up」. PC Magazine . 第7巻第15号. pp. 116–117 . 2022年11月15日閲覧。
- ^ 「標準 - GNU コンパイラ コレクション (GCC) の使用」 。2012年 6 月 24 日閲覧。
- ^ 「INCITS/ISO/IEC 9899」。www.techstreet.com 。 2018年10月3日閲覧。
- ^ 「ISO/IEC 9899:1990 - プログラミング言語 -- C」 。 2012年6月24日閲覧。
- ^ Clive DW Feather (2010-09-12). 「規範的補遺 1 の簡単な説明」
- ^ 「ISO/IEC 9899:1990/Amd 1:1995」。国際標準化機構。2013-03-22。
- ^ 「ISO/IEC 9899:1990/Cor 1:1994」。ISO 。 2019年1月21日閲覧。
- ^ 「ISO/IEC 9899:1990/Cor 2:1996」。ISO 。 2019年1月21日閲覧。
- ^ 「ISO/IEC 9899:1999」。ISO 。 2019年1月21日閲覧。
- ^ "INCITS/ISO/IEC 9899-2012". ANSI。
- ^ 「ISO/IEC 9899:1999 - プログラミング言語 -- C」 。 2012年6月24日閲覧。
- ^ 「ISO/IEC 9899:2011/Cor 1:2012」。国際標準化機構。
- ^ 「ISO/IEC 9899:2018 - 情報技術 - プログラミング言語 - C」。www.iso.org。
- ^ 「規格 - C」www.iso-9899.info。
- ^ 「Cの歴史」cppreference .
- ^ 「ISO/IEC TR 19769:2004」。国際標準化機構。
- ^ 「ISO/IEC TR 24731-1:2007」。国際標準化機構。
- ^ 「ISO/IEC TR 18037:2008」。国際標準化機構。
- ^ 「ISO/IEC TR 24732:2009」。国際標準化機構。
- ^ 「ISO/IEC TR 24747:2009」。国際標準化機構。
- ^ 「ISO/IEC TR 24731-2:2010」。国際標準化機構。
- ^ 「ISO/IEC TS 17961:2013」。国際標準化機構。
- ^ 「ISO/IEC TS 18661-1:2014」。国際標準化機構。
- ^ 「ISO/IEC TS 18661-2:2015」。国際標準化機構。
- ^ 「ISO/IEC TS 18661-3:2015」。国際標準化機構。
- ^ 「ISO/IEC TS 18661-4:2015」。国際標準化機構。
- ^ 「実験的な C 機能」cppreference.com . 2016 年1 月 16 日閲覧。
- ^ 「2 GCC でサポートされている言語標準 - 2.1 C 言語」。GNUコンパイラ コレクション (GCC) の使用。GCC、GNU コンパイラ コレクション。2019年 2 月 5 日閲覧。
- ^ 「言語互換性」。LLVM用 Clang C 言語ファミリーフロントエンド。2019年 2 月 5 日閲覧。
- ^ 「標準の定義済みマクロ名」。www.ibm.com 。 2019年4月10日閲覧。
- ^ 「HP C/ANSI C 開発者バンドル」 。2015年 7 月 12 日閲覧。
- ^ IBM XL C/C++ コンパイラに ISO C11 のサポートが追加されました
- ^ Pelles C ページへのリンク
さらに読む
- シュライナー、アクセル・トビアス (1993)。ANSI-C を使用したオブジェクト指向プログラミング。ハンザー。ISBN 3-446-17426-5。
外部リンク
- ISO Cワーキンググループ
- ANSI C 標準草案 (ANSI X3J11/88-090) (1988 年 5 月 13 日)、第 3 回パブリックレビュー
- ANSI C 根拠草案 (ANSI X3J11/88-151) (1988 年 11 月 18 日)
- C 情報速報 #1 (ANSI X3J11/93-007) (1992 年 5 月 27 日)
- ANSI C Yacc 文法
- ANSI C 文法、Lex 仕様
- 「ISO/IEC 9899:1999 プログラミング言語 -- C」。米国規格協会。2011 年 7 月 25 日時点のオリジナルよりアーカイブ。2009年 8 月 6 日閲覧。
- 「ANSI 規格アクション Vol. 36、#48」(PDF)。米国規格協会。2005 年 12 月 2 日。2016年 3 月 4 日にオリジナル(PDF)からアーカイブ。2009年 8 月 6 日に取得。
