ANSI C

ANSI C、ISO C、または標準Cとは、米国規格協会  および国際標準化機構  が発行したC言語の標準の総称である。歴史的にこれらの名前は特に、オリジナルであり、最もサポートされているバージョンであるC89およびC90のことを指す。C言語でプログラムを作成するソフトウェア開発者は、コンパイラ間の移植性のために、標準に準拠することが推奨される。

1. 歴史と概要
--------

Cの最初の標準はANSIによって発行された。この文書は後にISOによって採択され、ISOによって公表されたその後の改訂版もANSIによって採択されているが、「ISO C」ではなく「ANSI C」という名称がより広く使用されている。一部のソフトウェア開発者は「ISO C」という用語を使用しているが、他のソフトウェア開発者は発行組織に中立的な「標準C」という用語を使用している。

1.1. C89
--------

1983年、ANSIがC言語の標準仕様を確立するための委員会・X3J11を設立した。この規格は1989年に完成し、ANSI X3.159-1989「プログラミング言語C」として採択された。このバージョンは、しばしば「ANSI C」と呼ばれる。その後、C99が発表されてからは、それ以前のバージョンについても同様の命名法で呼ばれるようになり、このバージョンは「C89」とも呼ばれるようになった。

1.2. C90
--------

C89のフォーマットを変更しただけの標準が、ISOによってISO/IEC 9899:1990として採択された。この標準はC90と呼ばれることがある。C89とC90は本質的には同じ言語である。

この標準は後に、ANSI/INCITS、ISO/IECの双方によって撤回されている。

1.3. C95
--------

1995年、ISOはANSI-C標準の拡張、Amendment   1を発行した。正式名称はISO/IEC 9899/AMD1:1995であり、C95というニックネームを付けた。誤りの訂正の他、以下のような言語の能力のさらなる変更があった。

wchar.h と wctype.h およびI/Oの導入による、標準ライブラリでのマルチバイト文字およびワイド文字対応の改善
言語へのダイグラフの追加
演算子の代替仕様のための標準マクロの仕様化
標準マクロ __STDC_VERSION__ の仕様化この改訂に加えて、2つのC90の正誤表がISOによって発行された。

ISO/IEC 9899 TCOR1
ISO/IEC 9899 TCOR2

1.3.1. C95互換性を確認するプリプロセッサテスト
----------------------------

if defined && __STDC_VERSION__ >= 199409L/* C95 compatible source code. */

elif defined/* C89 compatible source code. */

endif<WtXmlEndTag />

1.4. C99
--------

2000年3月、ANSIはISO/IEC 9899:1999を採択した。この規格は、一般に「C99」と呼ばれている。この標準での注目すべき追加点は、以下の通りである。

新しい組み込みデータ型: long long、_Bool、_Complex、_Imaginary静的配列インデックス、指定初期化子、複合リテラル、可変長配列、フレキシブル配列メンバ、可変長マクロ、restrictキーワードなどの、新しいコア言語機能

stdint.h、tgmath.h、fenv.h, complex.h などの新しいライブラリヘッダ
インライン関数、一行コメント、宣言とコードのミックス、ユニバーサルキャラクタ名などの、C++機能との互換性の向上
暗黙的な関数宣言や暗黙の int など、いくつかの危険なC89言語機能を削除3つのC99の正誤表がISOによって発行された。

ISO/IEC 9899:1999/Cor.1:2001
ISO/IEC 9899:1999/Cor.2:2004
ISO/IEC 9899:1999/Cor.3:2007 - 標準ライブラリ関数 gets を非推奨としたこの規格は、後述のC11のリリースをもって、date=2019年2月とISO/IECの双方によって廃止された。

1.5. C11
--------

2011年12月8日に//ISO/IEC 9899:2011//として改訂された。このバージョンで導入された注目すべき機能には、改良されたUnicode対応、新しい _Generic キーワードを使用するタイプジェネリック式、クロスプラットフォームのマルチスレッドAPI 、コア言語とライブラリ  の両方でのアトミック型対応がある。

1つのC11の正誤表がISOによって発行された。

ISO/IEC 9899:2011/Cor 1:2012

1.6. C17
--------

2018年に//ISO/IEC 9899:2018//として改訂された。仕様の欠陥修正がメインのマイナーアップデートである。

1.7. その他の関連するISO発行物
-------------------

ISOは、標準化プロセスの一環として、C言語に関連する技術レポート  と仕様書  も公開している。

ISO/IEC TR 19769:2004 - Unicode変換フォーマットに対応するライブラリ拡張について。C11に統合
ISO/IEC TR 24731-1:2007 - 境界チェックされたインタフェースに対応するライブラリ拡張について。C11に統合
ISO/IEC TR 18037:2008 - 組み込みプロセッサをサポートするためのC拡張について
ISO/IEC TR 24732:2009 - ISO/IEC TS 18661-2:2015に代わる十進浮動小数点演算について
ISO/IEC TR 24747:2009 - 特殊な数学関数について
ISO/IEC TR 24731-2:2010 - 動的割り当て機能に対応するライブラリ拡張について
ISO/IEC TS 17961:2013 - Cの安全なコーディングについて
ISO/IEC TS 18661-1:2014 - IEC 60559:2011に準拠した二進浮動小数点演算
ISO/IEC TS 18661-2:2015 - IEC 60559:2011と互換性のある十進浮動小数点演算
ISO/IEC TS 18661-3:2015 - IEC 60559:2011互換のインターチェンジおよび拡張浮動小数点型
ISO/IEC TS 18661-4:2015 - IEC 60559:2011に準拠した補助機能TS 18661の5番目と最後の部分、ソフトウェアトランザクショナルメモリ仕様、ライブラリ拡張などの多くの技術仕様が開発中で承認待ちである。

2. 主要なコンパイラによる対応
----------------

ANSI Cは現在広く使用されているほとんどのコンパイラが対応している。現時点で書かれているC言語のソースコードのほとんどは、ANSI Cをベースにしている。標準Cで書かれ、ハードウェアに依存する仮定を持たないプログラムは、準拠したC実装のプラットフォームで正しくコンパイルされることが保証されている。このような予防措置を講じないと、ほとんどのプログラムはGUIライブラリなどの非標準ライブラリの使用やコンパイラ固有の属性やプラットフォーム固有の属性の使用などにより、特定のプラットフォームまたは特定のコンパイラでしかコンパイルされないことになる。

K&R CとANSI Cの違いを緩和するために、__STDC__ マクロを使用してコードをANSIセクションとK&Rセクションに分割することができる。

if defined && __STDC__extern int getopt;

elseextern int getopt;

endif<WtXmlEndTag />

3. ANSI Cに対応するコンパイラ
-------------------

アムステルダム・コンパイラ・キット
ARM RealView
Clang
GCC
PCC
HP C/ANSI Cコンパイラ 
IBM XL C/C++コンパイラ 
Intel C++ Compiler
Watcom C/C++ 
Microsoft Visual C++ 
Pelles C 

4. 関連項目
-------

C++17, C++14, C++11, C++03, C++98 - C++のバージョン
C++ Technical Report 1

5. 脚注
-----

6. 外部リンク
--------

[1]
[2] , [3]
[4] 
[5] 
[6]
[7]