C99

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
C言語 > C99

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にはさまざまな新機能が導入された。その多くはさまざまなコンパイラによってすでに拡張として実装されていた。

C89との後方互換性[編集]

C99はほとんどC89と後方互換であるが、いくつかの場面でより厳格である。特に、型が省略された宣言で、暗黙的にintと見なされるということはなくなった。C標準委員会は暗黙的にintに依存する古いコードを黙って処理するよりも注意深くない型指定の欠落を診断する方がより価値があると決定した。実際には、コンパイラは型の欠落を診断するが、型をintと見なし処理を続けることになる。また、C89では宣言されなかった関数は返り値の型がintで、引数の数、型が任意の関数と解釈されたが、C99では文法違反となる。

C++との互換性[編集]

整数型、ヘッダファイルやライブラリファンクションなど、C99の標準のうちある部分はC++ Technical Report 1C++11に取り入れられている。

主要なコンパイラによるサポート[編集]

GCCClangIntel C++ Compiler 等はC99の新機能の大半をサポートしている。ただし、GCCは、ほとんど準拠しているが、規格への100%完全準拠は果たしていない[1]。gcc のデフォルトは C89 に GNU 拡張を加えた -std=gnu89Clang のデフォルトは C99 に GNU 拡張を加えた -std=gnu99 である。gcc は将来的には gnu99 をデフォルトにする予定。

Microsoft Visual C++ は 2013 から C99 の大半を実装した[2]。ただし、tgmath.h や snprintf() などが未実装。

Open Watcom C compiler は標準のうち最もよく使われている部分を実装している。ただ、これらはドキュメント化されていないコマンドラインスイッチを指定しないと有効化されない[3]

Sun Studioは、サン・マイクロシステムズによればC99を完全にサポートしている[4]

Cインタプリタ ChはC99の主要な機能をサポートしている[5]

ユーザー[編集]

GCCがC99の多くの機能に対応しているため[1]、フリーソフトウェア開発などにおいて広く使われている。C99には複合リテラルと指示初期化子によるメンテナンス性の向上という大きな利点があり[6]、特に大規模なプロジェクトにおいて使われることが多い。Linuxカーネルにおいては、C99の指示初期化子を使う前から構文の異なるGCC拡張の指示初期化子を使っていた[7]。Visual StudioなどのC99に対応していないコンパイラがあるため、使いたくても使えないプロジェクトも多い。QEMUでは指示初期化子を使いながらC89との互換性を保つために、INIT_FIELDマクロを導入したものの、メンバの省略ができないなどの欠点がある。

バージョンの検知[編集]

標準のマクロ__STDC_VERSION__はC99のサポートが可能であることを示すために199901Lと定義されている。C89のための__STDC__マクロと同様に、__STDC_VERSION__C89とC99のコンパイラで違うようにコンパイルされるコードを書くために使用することができる。例えば、この例では、inline をどちらの場合でも利用可能である。

#if __STDC_VERSION__ >= 199901L
  /* "inline" is a keyword */
#else
# define inline /* nothing */
#endif

後継[編集]

C99 の後継の仕様は C11 (ISO/IEC 9899:2011)。

C99の受理の後、標準作業部会は組み込み分野、文字データ型の追加(Unicodeのサポート)、境界チェック付きのライブラリ関数などのためのテクニカルレポートを準備してきた。作業は十進浮動小数、数学の特殊関数の追加、動的メモリ確保関数の追加についてのテクニカルレポートについて継続している。CとC++の標準委員会はスレッドについての規格制定に協調して取り組んでいる。

2007年以降、非公式に"C1x"と呼ばれるさらなるC標準が期待され始めた。標準委員会は現在の実装でテストされていない新しい機能の採用を制限するというガイドラインを採用した。

安全でないインタフェースの設計に関する不具合報告に応えて公式に廃止予定とされているgets関数がC11では削除され、gets_sを使わなくてはならなくなった。

参照[編集]

  1. ^ a b Status of C99 features in GCC
  2. ^ C99 library support in Visual Studio 2013 - Visual C++ Team Blog - Site Home - MSDN Blogs
  3. ^ C99 compliance in Open Watcom”. 2009年3月11日閲覧。
  4. ^ Sun Studio 12: C Compiler 5.9 Readme”. Sun Microsystems, Inc. (2007年5月31日). 2008年1月9日閲覧。
  5. ^ C/C++ interpreter Ch C99 features”. SoftIntegration, Inc. (2008年2月15日). 2008年2月15日閲覧。
  6. ^ Open source development using C99
  7. ^ On the initialization of structures