ANSI C

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言語で開発を行う際には、これらの標準規格を理解し、適切な標準に準拠することで、移植性の高いコードを記述できます。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。