ANSI C

ANSI CISO 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 KernighanDennis 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 ]

これは、__STDC_VERSION__値(199409L)を持つ最初の標準規格であると同時に、その値の年が発行年(1995)と一致しなかった最初のバージョンでもあり、C94C95の両方の名称が一般的に使用されるようになりました。これはC17(2018)とC23(2024)でも発生しましたが、これらはより初期の年でよく知られているのに対し、この標準は後の年で呼ばれることが多いです。[ 8 ]

修正に加えて、ISO によって C90 の 2 つの技術的修正事項が発行されました。

  • ISO/IEC 9899:1990/Cor 1:1994 TCOR1 1994年[ 9 ]
  • ISO/IEC 9899:1990/Cor 2:1996(1996年)[ 10 ]

C95 互換性のためのプリプロセッサテスト

# __STDC_VERSION__ が定義されている場合 && __STDC_VERSION__ >= 199409L/* C95互換ソースコード。 */ #elif defined(__STDC__) /* C89互換ソースコード。 */ #endif

C99

2000年3月、ANSIはISO/IEC 9899:1999規格を採用しました。[ 11 ]この規格は一般的にC99と呼ばれています。以前の規格からの主な追加事項は以下のとおりです。

C99 に関して、ISO によって 3 つの技術的訂正が公開されました。

この規格は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/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 をサポートするコンパイラのリスト:

参照

参考文献

  1. ^ Brad Kelechava (2017年9月14日). 「ANSI CとISO Cの起源」 . 2018年8月14日閲覧
  2. ^ Richard Hale Shaw (1988年9月13日). 「Standard C: The ANSI Draft Grows Up」 . PC Magazine . 第7巻第15号. pp.  116– 117. 2022年11月15日閲覧
  3. ^ 「標準 - GNUコンパイラコレクション(GCC)の使用」 。 2012年6月24日閲覧
  4. ^ "INCITS/ISO/IEC 9899" . www.techstreet.com . 2018年10月3日閲覧
  5. ^ 「ISO/IEC 9899:1990 - プログラミング言語 -- C」 。 2012年6月24日閲覧
  6. ^ Clive DW Feather (2010年9月12日). 「規範的補遺1の簡単な説明」 .
  7. ^ 「ISO/IEC 9899:1990/Amd 1:1995」国際標準化機構(ISO)2013年3月22日。
  8. ^ 「GNU GCC 15.2 マニュアル」 . フリーソフトウェア財団. 2025年.
  9. ^ 「ISO/IEC 9899:1990/Cor 1:1994」 . ISO . 2019年1月21日閲覧
  10. ^ 「ISO/IEC 9899:1990/Cor 2:1996」 . ISO . 2019年1月21日閲覧
  11. ^ 「ISO/IEC 9899:1999」 . ISO . 2019年1月21日閲覧。
  12. ^ "INCITS/ISO/IEC 9899-2012" . ANSI。
  13. ^ 「ISO/IEC 9899:1999 - プログラミング言語 -- C」 。 2012年6月24日閲覧
  14. ^ 「ISO/IEC 9899:2011/Cor 1:2012」国際標準化機構。
  15. ^ 「ISO/IEC 9899:2018 - 情報技術- プログラミング言語 - C」。www.iso.org
  16. ^規格-C」www.iso-9899.info
  17. ^ 「ISO/IEC 9899:2024 - 情報技術 - プログラミング言語 - C」
  18. ^ 「ISO/IEC TR 19769:2004」国際標準化機構。
  19. ^ 「ISO/IEC TR 24731-1:2007」国際標準化機構。
  20. ^ 「ISO/IEC TR 18037:2008」国際標準化機構。
  21. ^ 「ISO/IEC TR 24732:2009」国際標準化機構。
  22. ^ 「ISO/IEC TR 24747:2009」国際標準化機構。
  23. ^ 「ISO/IEC TR 24731-2:2010」国際標準化機構。
  24. ^ 「ISO/IEC TS 17961:2013」国際標準化機構。
  25. ^ 「ISO/IEC TS 18661-1:2014」国際標準化機構。
  26. ^ 「ISO/IEC TS 18661-2:2015」国際標準化機構。
  27. ^ 「ISO/IEC TS 18661-3:2015」国際標準化機構。
  28. ^ 「ISO/IEC TS 18661-4:2015」国際標準化機構。
  29. ^ 「実験的なC機能」cppreference.com . 2016年1月16日閲覧
  30. ^ 「GCCでサポートされる2つの言語標準 - 2.1 C言語」。GNUコンパイラコレクション(GCC)の使用。GCC、GNUコンパイラコレクション2019年2月5日閲覧。
  31. ^ 「言語互換性」。LLVM用Clang C言語ファミリーフロントエンド2019年2月5日閲覧。
  32. ^ 「標準の定義済みマクロ名」 www.ibm.com 2019年4月10日閲覧
  33. ^ 「HP C/ANSI C 開発者バンドル」 。 2015年7月12日閲覧
  34. ^ IBM XL C/C++ コンパイラに ISO C11 のサポートが追加された
  35. ^ Pelles C ページへのリンク

さらに読む

  • シュライナー、アクセル・トビアス (1993)。ANSI-C を使用したオブジェクト指向プログラミング。ハンザー。ISBN 3-446-17426-5