# ANSI C

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

## 歴史と概要

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

### C89

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

### C90

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

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

### C95

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

* `wchar.h` と `wctype.h` およびI/Oの導入による、標準ライブラリでのマルチバイト文字およびワイド文字対応の改善
* 言語へのダイグラフの追加
* 演算子の代替仕様のための標準マクロの仕様化（`&&`→`and`など）
* 標準マクロ `__STDC_VERSION__` の仕様化

この改訂に加えて、2つのC90の正誤表がISOによって発行された。

* ISO/IEC 9899 TCOR1（1995年）
* ISO/IEC 9899 TCOR2（1996年）

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

```
# if defined(\_\_STDC\_VERSION\_\_) && \_\_STDC\_VERSION\_\_ >= 199409L

/\* C95 compatible source code. \*/
# elif defined(\_\_ANSI\_\_)
/\* C89 compatible source code. \*/
# endif

```

### C99

→詳細は「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(E)
* ISO/IEC 9899:1999/Cor.2:2004(E)
* ISO/IEC 9899:1999/Cor.3:2007(E) - 標準ライブラリ関数 `gets` を非推奨とした

この規格は、後述のC11のリリースをもって、？？？とISO/IECの双方によって廃止された。

### C11

→詳細は「C11 (C言語)」を参照
2011年12月8日に*ISO/IEC 9899:2011*（通称 **C11**）として改訂された。このバージョンで導入された注目すべき機能には、改良されたUnicode対応、新しい `_Generic` キーワードを使用するタイプジェネリック式、クロスプラットフォームのマルチスレッドAPI (`<threads.h>`)、コア言語とライブラリ (`<stdatomic.h>`) の両方でのアトミック型対応がある。

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

* ISO/IEC 9899:2011/Cor 1:2012

### C17

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

### その他の関連するISO発行物

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

* 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番目と最後の部分、ソフトウェアトランザクショナルメモリ仕様、ライブラリ拡張などの多くの技術仕様が開発中で承認待ちである。

## 主要なコンパイラによる対応

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

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

```
 #if defined(\_\_STDC\_\_) && \_\_STDC\_\_
 extern int getopt(int, char \* const \*, const char \*);
 #else
 extern int getopt();
 #endif

```

## ANSI Cに対応するコンパイラ

* アムステルダム・コンパイラ・キット（C K&R と C89/90）
* ARM RealView
* Clang（LLVM バックエンドを使用）
* GCC（C89/90, C99, C11完全対応）
* PCC（C89, C99, C11）
* HP C/ANSI Cコンパイラ (C89, C99)
* IBM XL C/C++コンパイラ (C11, starting with version 12.1)
* Intel C++ Compiler
* LabWindows/CVI
* LCC
* OpenWatcom (C89/90 and some C99)
* Microsoft Visual C++ (C89/90 and some C99)
* Pelles C (C99, Windows only.)

* CとC++の互換性
* C++17, C++14, C++11, C++03, C++98 - C++のバージョン
* C++ Technical Report 1

* ISO C working group
* *Draft ANSI C Standard* (ANSI X3J11/88-090) (May 13, 1988), Third Public Review
* *Draft ANSI C Rationale* (ANSI X3J11/88-151) (Nov 18, 1988)
* *C Information Bulletin #1* (ANSI X3J11/93-007) (May 27, 1992)
* ANSI C Yacc grammar
	+ ANSI C grammar, Lex specification
* Schreiner, Axel-Tobias. *Object oriented programming with ANSI-C*. Hanser. hdl:1850/8544. ISBN 3-446-17426-5
* “ISO/IEC 9899:1999 Programming Languages -- C”.  American National Standards Institute. 2017年8月1日閲覧。
* “ANSI Standards Action Vol. 36, #48”.  American National Standards Institute (2005年12月2日). 2017年8月1日閲覧。