| 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を使用している開発者もいます。
非公式仕様: K&R C ( C78 )
1978 年の非公式仕様( Brian KernighanとDennis Ritchie の著書「The C Programming Language」)。
Cの標準化
1983年、アメリカ規格協会(ANSI)は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 ]の両方で撤回されました。
C94/C95
1995年、ISO / IECはC規格の拡張版「Amendment 1」を公表しました。正式名称は最終的にISO/IEC 9899:1990/AMD1:1995となり、C94またはC95の愛称で呼ばれました。エラー修正以外にも、言語機能には次のような変更が加えられました。 [ 6 ] [ 7 ]
- 標準ライブラリのマルチバイトおよびワイド文字のサポートが強化され、マルチバイトI/O
<wchar.h>も導入されました<wctype.h>。 - 言語への二重音字の追加
- 演算子の代替仕様の標準マクロの仕様、例:
and&& - 標準マクロの仕様
__STDC_VERSION__。
これは、__STDC_VERSION__値(199409L)を持つ最初の標準規格であると同時に、その値の年が発行年(1995)と一致しなかった最初のバージョンでもあり、C94とC95の両方の名称が一般的に使用されるようになりました。これはC17(2018)とC23(2024)でも発生しましたが、これらはより初期の年でよく知られているのに対し、この標準は後の年で呼ばれることが多いです。[ 8 ]
修正に加えて、ISO によって C90 の 2 つの技術的修正事項が発行されました。
C95 互換性のためのプリプロセッサテスト
# __STDC_VERSION__ が定義されている場合 && __STDC_VERSION__ >= 199409L/* C95互換ソースコード。 */ #elif defined(__STDC__) /* C89互換ソースコード。 */ #endifC99
2000年3月、ANSIはISO/IEC 9899:1999規格を採用しました。[ 11 ]この規格は一般的にC99と呼ばれています。以前の規格からの主な追加事項は以下のとおりです。
- 新しい組み込みデータ型:
long long、、、_Boolおよび_Complex_Imaginary - 静的配列インデックス、指定初期化子、複合リテラル、可変長配列、柔軟な配列メンバー、可変長マクロ、
restrictキーワードなど、いくつかの新しいコア言語機能 - 、、、を含むいくつかの新しいライブラリヘッダー
stdint.h<tgmath.h>fenv.h<complex.h> - インライン関数、を使用した単一行コメント、宣言とコードの混在、識別子内のユニバーサル文字名など、いくつかのC++機能との互換性が向上しました。
// - 暗黙の関数宣言や暗黙の引数など、いくつかの危険なC89言語機能を削除しました。
int
C99 に関して、ISO によって 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 [ 12 ]とISO/IEC [ 13 ]の両方で撤回され、C11が採用されました。
C11
C11 は、2011 年 12 月 8 日に正式に承認され、公開されました。注目すべき機能としては、改善されたUnicodeサポート、新しいキーワードを使用した型汎用式_Generic、クロスプラットフォームマルチスレッドAPI ( threads.h)、コア言語とライブラリの両方でのアトミックstdatomic.h型のサポート ( ) などがあります。
C11 に関して、ISO から 1 つの技術的訂正が公開されています。
- ISO/IEC 9899:2011/Cor 1:2012 [ 14 ]
17世紀
C17は2018年6月に公開されました。[ 15 ]新しい言語機能を導入するのではなく、C11の欠陥のみに対処しています。[ 16 ]
C23
C23は2024年10月に発行され、Cプログラミング言語の現在の標準となっています。[ 17 ]
C2Y
C2Y は、2020 年代後半にリリースされることが期待されている C プログラミング言語の次期改訂版の非公式な名称です。
その他の関連ISO出版物
標準化プロセスの一環として、ISO/IEC はC 言語に関連する 技術レポートと仕様も公開しています。
- ISO/IEC TR 19769:2004、[ 18 ] Unicode変換形式をサポートするためのライブラリ拡張に関するC11に統合
- ISO/IEC TR 24731-1:2007、[ 19 ]境界チェックされたインターフェースをサポートするためのライブラリ拡張に関するC11に統合
- ISO/IEC TR 18037:2008、[ 20 ]組み込みC拡張に関する
- ISO/IEC TR 24732:2009、[ 21 ] 10進浮動小数点演算に関する規格。ISO/IEC TS 18661-2:2015に置き換えられた。
- ISO/IEC TR 24747:2009、[ 22 ]特殊数学関数について
- ISO/IEC TR 24731-2:2010、[ 23 ]動的割り当て機能をサポートするためのライブラリ拡張について
- ISO/IEC TS 17961:2013、[ 24 ] C言語におけるセキュアコーディングについて
- ISO/IEC TS 18661-1:2014、[ 25 ] IEC 60559:2011互換の2進浮動小数点演算について
- ISO/IEC TS 18661-2:2015、[ 26 ] IEC 60559:2011互換の10進浮動小数点演算について
- ISO/IEC TS 18661-3:2015、[ 27 ] IEC 60559:2011互換の交換および拡張浮動小数点型について
- ISO/IEC TS 18661-4:2015、[ 28 ] IEC 60559:2011互換の補足機能について
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 をサポートするコンパイラのリスト:
- Acornsoft ANSI C(最初のバージョンは1988年、改訂は1989年)
- アムステルダム コンパイラ キット(C K&R および C89/90)
- ARMリアルビュー
- Clang (完全な C89/C90 および C99、部分的な C11、C17、C23、C2y)、LLVMバックエンドを使用
- GCC (完全な C89/90、C99、C11、C17、C23 および一部の実験的/不完全な C2y)
- HP C/ANSI Cコンパイラ(C89およびC99)[ 33 ]
- IBM XL C/C++(C11、バージョン12.1以降)[ 34 ]
- Intel の ICC (後のバージョンはclangをベースにしており、サポートされています)
- ラボウィンドウズ/CVI
- LCC
- Oracle 開発者スタジオ
- OpenWatcom (C89/90 および一部の C99)
- Pelles C(C99およびC11。Windowsのみ)[ 35 ]
- vbcc (C89/90 および C99)
- 小さな C コンパイラ(C89/90 および一部の C99)
参照
参考文献
- ^ Brad Kelechava (2017年9月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年9月12日). 「規範的補遺1の簡単な説明」 .
- ^ 「ISO/IEC 9899:1990/Amd 1:1995」国際標準化機構(ISO)2013年3月22日。
- ^ 「GNU GCC 15.2 マニュアル」 . フリーソフトウェア財団. 2025年.
- ^ 「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。
- ^ 「ISO/IEC 9899:2024 - 情報技術 - プログラミング言語 - C」。
- ^ 「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日閲覧。
- ^ 「GCCでサポートされる2つの言語標準 - 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文法