出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/10/10 02:16 UTC 版)
C99は、ISOで定められたC言語の規格である。正式な規格名は ISO/IEC 9899:1999。
ANSIの標準化プロセス(C89)のあと、C言語仕様はC++が標準化の取り組みによって進化しているのと比べて停滞していた。1995年には標準追補を作成したが、これはC89への細かい修正および国際文字集合対応の追加であった。1990年代の後半にいくつかの訂正を経て、ISO/IEC 9899:1999 として1999年に発行した。この標準は"C99"と呼ばれ、ANSI標準としても2000年5月に受理。国際的なC標準は作業部会ISO/IEC JTC1/SC22/WG14で保守している。
C99にはさまざまな新機能が導入された。その多くはさまざまなコンパイラによってすでに拡張として実装されていた。
long long int、拡張整数型、明示的なブーリアン型、複素数型 など//から始まる一行コメントsnprintfのような新しいライブラリ関数stdbool.hやinttypes.hなどの新しいヘッダファイルtgmath.h)struct foo f = {.x = 10, .y = 20};restrict修飾子C99はほとんどC89と後方互換であるが、いくつかの場面でより厳格である。特に、型が省略された宣言で、暗黙的にintと見なされるということはなくなった。C標準委員会は暗黙的にintに依存している古いコードを黙って処理するよりも、型指定が不注意により欠落していると診断する方により価値を置く決定をした。実際には、コンパイラは型の欠落を警告するが、型をintと見なし処理を続けることになる。また、C89では宣言されなかった関数は返り値の型がintで、引数の数、型が任意の関数と解釈されたが、C99では文法違反となる。
整数型、ヘッダファイルやライブラリファンクションなど、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]。
Cインタプリタ ChはC99の主要な機能をサポートしている[7]。
GCCがC99の多くの機能に対応しているため[2]、フリーソフトウェア開発などにおいて広く使われている。C99には複合リテラルと指示初期化子によるメンテナンス性の向上という大きな利点があり[8]、特に大規模なプロジェクトにおいて使われることが多い。Linuxカーネルにおいては、C99の指示初期化子を使う前から構文の異なるGCC拡張の指示初期化子を使っていた[1]。以前はVisual StudioがC99に対応していなかったため、使いたくても使えないプロジェクトが多かった。QEMUでは指示初期化子を使いながらC89との互換性を保つために、INIT_FIELDマクロを導入したものの、それにはメンバの省略ができないなどの欠点がある。FFmpeg/libavでは、C99のソースコードをC89へと変換するトランスレータのc99conv及びc99wrapを用意することで、この問題を解決している。
標準のマクロ__STDC_VERSION__はC99のサポートが可能であることを示すために199901Lと定義されている。C89のための__STDC__マクロと同様に、__STDC_VERSION__はC89とC99のコンパイラで違うようにコンパイルされるコードを書くために使用することができる。例えば、この例では、inlineをどちらの場合でも利用可能である。
#if __STDC_VERSION__ >= 199901L
/* "inline"は予約語 */
#else
# define inline /* 何も行わない */
#endif
C99 の後継の仕様は C11 (ISO/IEC 9899:2011)。
C99の受理の後、標準作業部会は組み込み分野、文字データ型の追加(Unicodeのサポート)、境界チェック付きのライブラリ関数などのためのテクニカルレポートを準備してきた。作業は十進浮動小数、数学の特殊関数の追加、動的メモリ確保関数の追加についてのテクニカルレポートについて継続している。CとC++の標準委員会はスレッドについての規格制定に協調して取り組んでいる。
2007年以降、非公式に"C1x"と呼ばれるさらなるC標準が期待され始めた。標準委員会は現在の実装でテストされていない新しい機能の採用を制限するというガイドラインを採用した。
安全でないインタフェースの設計に関する不具合報告に応えて公式に廃止予定とされているgets関数がC11では削除され、gets_sを使わなくてはならなくなった。
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/05/04 02:05 UTC 版)
詳細は「C99」を参照 1999年12月1日に、ISO/IEC JTC1 SC22 WG14 で規格の改訂を行い、C++の機能のいくつかを取り込むことを含め機能を拡張し、ISO/IEC 9899:1999(E) Programming Language--C (Second Edition) を制定した。この版のC言語の規格を、通称としてC99と呼ぶ。 日本では、日本産業規格 JIS X 3010:2003「プログラム言語C」がある。 主な追加機能: 変数宣言がブロックの先頭でなくても良くなった。 ブール代数を扱うための_Bool型が予約語に追加され、標準ライブラリとしてstdbool.hを追加した。 複素数を扱うための_Complex型や_Imaginary型を予約語に追加し、標準ライブラリとして、complex.hを追加した。 少なくとも64ビットの整数値を保持できる long long int型の追加。 オプションとして、固定幅かつ内部表現の規定された整数型の標準化(stdint.h)。 //による1行コメント。 インライン関数(inlineキーワード)。 可変長配列(alloca関数の代替)。 C99は下記の訂正がある。 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」の解説は、「C言語」の解説の一部です。
「C99」を含む「C言語」の記事については、「C言語」の概要を参照ください。