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 C99にはさまざまな新機能が導入された。その多くはさまざまなコンパイラによってすでに拡張として実装されていた。 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 Sun Studio Cインタプリタ ChはC99の主要な機能をサポートしている[7]。 GCCがC99の多くの機能に対応しているため[2]、フリーソフトウェア開発などにおいて広く使われている。C99には複合リテラルと指示初期化子によるメンテナンス性の向上という大きな利点があり[8]、特に大規模なプロジェクトにおいて使われることが多い。Linuxカーネルにおいては、C99の指示初期化子を使う前から構文の異なるGCC拡張の指示初期化子を使っていた[1]。以前はVisual StudioがC99に対応していなかったため、使いたくても使えないプロジェクトが多かった。QEMUでは指示初期化子を使いながらC89との互換性を保つために、INIT_FIELDマクロを導入したものの、それにはメンバの省略ができないなどの欠点がある。FFmpeg/libav 標準のマクロ__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のサポート)、境界チェック 2007年以降、非公式に"C1x"と呼ばれるさらなるC標準が期待され始めた。標準委員会は現在の実装でテストされていない新しい機能の採用を制限するというガイドラインを採用した。 安全でないインタフェースの設計に関する不具合報告に応えて公式に廃止予定とされているgets関数がC11では削除され、gets_sを使わなくてはならなくなった。
歴史
新機能
インライン関数
ファイルスコープでない変数宣言がブロックの先頭になければならないという制限の撤廃
いくつかの新しいデータ型。long long int、拡張整数型、明示的なブーリアン型、複素数型 など
BCPLやC++のような、//から始まる一行コメント
snprintfのような新しいライブラリ関数
stdbool.hやinttypes.h
型総称的な数学関数 (tgmath.h)
IEEE 浮動小数のより進んだサポート
指示初期化子[1]struct foo f = {.x = 10, .y = 20};
可変引数マクロのサポート
最適化のためのrestrict修飾子
C89との後方互換性
C++との互換性
主要なコンパイラによるサポート
ユーザー
バージョンの検知
後継詳細は「C11 (C言語)」を参照
参照^ a b ⇒On the initialization of structures
^ a b ⇒Status of C99 features in GCC
^ “GCC 5 Release Series ? Changes, New Features, and Fixes
^ ⇒C99 library support in Visual Studio 2013 - Visual C++ Team Blog - Site Home - MSDN Blogs
^ “ ⇒C99 compliance in Open Watcom”. 2009年3月11日閲覧。
^ “ ⇒Sun Studio 12: C Compiler 5.9 Readme”. Sun Microsystems, Inc. (2007年5月31日). 2008年1月9日閲覧。
^ “ ⇒C/C++ interpreter Ch C99 features”. SoftIntegration, Inc. (2008年2月15日). 2008年2月15日閲覧。
^ ⇒Open source development using C99
表
話
編
歴
C言語
K&R
ANSI C
C89
C90
C99
C11
C17(英語版)
C2x(英語版)
Embedded C(英語版)
MISRA C
Cの機能
関数
ヘッダファイル
演算子
文字列(英語版)
文法(英語版)
プリプロセッサ(英語版)
データ型(英語版)
キーワード
フリースタンディング環境
標準Cライブラリの関数
ctype.h(英語版)
stdio.h
math.h(英語版)
stdlib.h(英語版)
string.h(英語版)
time.h
stdarg.h(英語版)
POSIXライブラリ(英語版)
標準Cライブラリ
Bionic(英語版)
libhybris(英語版)