C言語の標準規格:ANSI C、ISO C、標準C
C言語の標準規格は、ANSI(米国規格協会)とISO(
国際標準化機構)によって定められています。これらの規格は、
C言語の
移植性を高め、異なる
コンパイラ間でも同じように動作するコードを書くための指針となります。特に初期の標準であるC89とC90は、その後の
C言語の発展に大きな影響を与えました。ここでは、
C言語の標準規格の歴史、各規格の特徴、そして
コンパイラの対応状況について詳しく解説します。
歴史と概要
C言語の最初の標準は、ANSIによって策定されました。その後、この標準はISOによって採択され、ISOが発行した改訂版もANSIによって承認されました。しかし、「ISO C」よりも「ANSI C」という名称が広く使われる傾向があります。また、発行組織に中立的な「標準C」という用語も用いられます。
各規格の詳細
C89
1983年、ANSIは
C言語の標準仕様を定めるための委員会を設立しました。そして、1989年にANSI X3.159-1989「プログラミング言語C」として規格が完成しました。この規格は「ANSI C」として広く知られています。その後、C99が登場したことで、この規格は「C89」と呼ばれるようになりました。
C90
C89をISOがISO/IEC 9899:1990として採択したものがC90です。C89とC90は実質的に同じ言語です。しかし、C90は後にANSI/INCITSとISO/IECの両方によって撤回されました。
C95
1995年、ISOはANSI C標準の拡張版であるAmendment 1を発行しました。これはISO/IEC 9899/AMD1:1995と正式に呼ばれ、「C95」というニックネームで呼ばれます。C95では、誤りの訂正だけでなく、以下の機能が追加されました。
- - 標準ライブラリにおけるマルチバイト文字とワイド文字のサポート強化(wchar.h、wctype.h、I/Oの導入)
- - ダイグラフの追加
- - 演算子の代替表記のための標準マクロの定義(&& → andなど)
- - 標準マクロ __STDC_VERSION__ の定義
また、C90の2つの正誤表も発行されました(ISO/IEC 9899 TCOR1(1995)、ISO/IEC 9899 TCOR2(1996))。
C99
2000年3月、ANSIはISO/IEC 9899:1999を採択しました。この規格は一般に「C99」と呼ばれます。C99では、以下の機能が追加されました。
- - 新しい組み込みデータ型(long long, _Bool, _Complex, _Imaginary)
- - 新しいコア言語機能(静的配列インデックス、指定初期化子、複合リテラル、可変長配列、フレキシブル配列メンバ、可変長マクロ、restrictキーワードなど)
- - 新しいライブラリヘッダ(stdint.h、tgmath.h、fenv.h、complex.hなど)
- - C++との互換性向上(インライン関数、一行コメント、宣言とコードの混在、ユニバーサルキャラクタ名など)
- - 危険なC89の機能の削除(暗黙的な関数宣言、暗黙のintなど)
また、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))。
C99は、C11の登場により、ISO/IECによって廃止されました。
C11
2011年12月8日にISO/IEC 9899:2011(通称 C11)として改訂されました。C11では、以下の機能が導入されました。
- - Unicode対応の改善
- - タイプジェネリック式(_Generic キーワードを使用)
- - クロスプラットフォームのマルチスレッドAPI ()
- - アトミック型 ()
また、C11の正誤表も発行されました(ISO/IEC 9899:2011/Cor 1:2012)。
C17
2018年にISO/IEC 9899:2018(通称C17またはC18)として改訂されました。これは主に仕様の欠陥修正を行うマイナーアップデートです。
その他のISO発行物
ISOは、標準化プロセスの一環として、
C言語に関連する技術レポートや仕様書も公開しています。以下はその一部です。
- - ISO/IEC TR 19769:2004:Unicode変換フォーマットに対応するライブラリ拡張
- - ISO/IEC TR 24731-1:2007:境界チェックされたインタフェースに対応するライブラリ拡張
- - ISO/IEC TR 18037:2008:組み込みプロセッサをサポートするためのC拡張
- - ISO/IEC TR 24732:2009:十進浮動小数点演算
- - ISO/IEC TR 24747:2009:特殊な数学関数
- - ISO/IEC TR 24731-2:2010:動的割り当て機能に対応するライブラリ拡張
- - ISO/IEC TS 17961:2013:Cの安全なコーディング
- - ISO/IEC TS 18661-1:2014:二進浮動小数点演算
- - ISO/IEC TS 18661-2:2015:十進浮動小数点演算
- - ISO/IEC TS 18661-3:2015:インターチェンジおよび拡張浮動小数点型
- - ISO/IEC TS 18661-4:2015:補助機能
これらの他にも、多くの技術仕様が開発中です。
ANSI Cは、現在広く使用されているほとんどの
コンパイラでサポートされています。標準Cで記述され、ハードウェア依存の仮定を含まないプログラムは、準拠したC実装のプラットフォーム上で正しくコンパイルされることが保証されています。ただし、非標準ライブラリや
コンパイラ固有の属性を使用すると、特定のプラットフォームや
コンパイラでのみコンパイル可能になる場合があります。
K&R CとANSI Cの違いを緩和するために、__STDC__ マクロを使ってコードをANSIセクションとK&Rセクションに分割することができます。
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, バージョン 12.1 以降)
- - Intel C++ Compiler
- - LabWindows/CVI
- - LCC
- - OpenWatcom (C89/90 および 一部のC99)
- - Microsoft Visual C++ (C89/90 および 一部のC99)
- - Pelles C (C99, Windowsのみ)
まとめ
C言語の標準規格は、ANSI C、ISO C、標準Cという形で進化を続けてきました。特にC89とC90は、その後の
C言語の基礎を築き、C99やC11などの新しい規格では、より高度な機能や現代的なプログラミングスタイルに対応するための拡張が行われています。
C言語で開発を行う際には、これらの標準規格を理解し、適切な標準に準拠することで、
移植性の高いコードを記述できます。