C99
ISOで定められたC言語の規格
From Wikipedia, the free encyclopedia
歴史
新機能
C99にはさまざまな新機能が導入された。その多くはさまざまなコンパイラによってすでに拡張として実装されていた。
- インライン関数
- ファイルスコープでない変数宣言がブロックの先頭になければならないという制限の撤廃
- いくつかの新しいデータ型。
long long int、拡張整数型、明示的なブーリアン型、複素数型 など - BCPLやC++のような、
//から始まる一行コメント snprintfのような新しいライブラリ関数stdbool.hやinttypes.hなどの新しいヘッダファイル- 型総称的な数学関数 (
tgmath.h) - IEEE 浮動小数のより進んだサポート
- 指示初期化子[1]
struct foo f = {.x = 10, .y = 20}; - 可変引数マクロのサポート
- 最適化のための
restrict修飾子
C89との後方互換性
C++との互換性
整数型、ヘッダファイルやライブラリファンクションなど、C99の標準のうちある部分はC++ Technical Report 1やC++11に取り入れられている。
主要なコンパイラによるサポート
GCC、Clang、Intel C++ Compiler 等はC99の新機能の大半をサポートしている。ただし、GCCは、ほとんど準拠しているが、規格への100%完全準拠は果たしていない[2]。GCC 4.x までのデフォルトは C89 に GNU 拡張を加えた -std=gnu89、Clang のデフォルトは C99 に GNU 拡張を加えた -std=gnu99 である。GCC 5.0 から C11 に GNU 拡張を加えた -std=gnu11 がデフォルトになる[3]。
Microsoft Visual C++ は 2013 から C99 の大半を実装した[4]。2015までは、tgmath.h や snprintf() などが未実装であったが 2017 で実装された。
Open Watcom C compiler は標準のうち最もよく使われている部分を実装している。かつては、ドキュメント化されていないコマンドラインスイッチを指定しないと有効化されなかった[5]。2010年現在の最新版である 1.9 では -za99 オプションを付けることで有効化される旨、明記されている。
Sun Studioは、サン・マイクロシステムズによればC99を完全にサポートしている[6]。
ユーザー
GCCがC99の多くの機能に対応しているため[2]、フリーソフトウェア開発などにおいて広く使われている。C99には複合リテラルと指示初期化子によるメンテナンス性の向上という大きな利点があり[8]、特に大規模なプロジェクトにおいて使われることが多い。Linuxカーネルにおいては、C99の指示初期化子を使う前から構文の異なるGCC拡張の指示初期化子を使っていた[1]。以前はVisual StudioがC99に対応していなかったため、使いたくても使えないプロジェクトが多かった。QEMUでは指示初期化子を使いながらC89との互換性を保つために、INIT_FIELDマクロを導入したものの、それにはメンバの省略ができないなどの欠点がある。FFmpeg/libavでは、C99のソースコードをC89へと変換するトランスレータのc99conv及びc99wrapを用意することで、この問題を解決している。
バージョンの検知
後継
C99 の後継の仕様は C11 (ISO/IEC 9899:2011)。
C99の受理の後、標準作業部会は組み込み分野、文字データ型の追加(Unicodeのサポート)、境界チェック付きのライブラリ関数などのためのテクニカルレポートを準備してきた。作業は十進浮動小数、数学の特殊関数の追加、動的メモリ確保関数の追加についてのテクニカルレポートについて継続している。CとC++の標準委員会はスレッドについての規格制定に協調して取り組んでいる。
2007年以降、非公式に"C1x"と呼ばれるさらなるC標準が期待され始めた。標準委員会は現在の実装でテストされていない新しい機能の採用を制限するというガイドラインを採用した。
安全でないインタフェースの設計に関する不具合報告に応えて公式に廃止予定とされているgets関数がC11では削除され、gets_sを使わなくてはならなくなった。