標準Cライブラリ

標準Cライブラリ(ひょうじゅんシーライブラリ)は、C言語の標準規格で定められた、型・マクロ・関数の集合からなるライブラリである。

歴史

C言語は、PascalやPL/1等の従来のプログラミング言語とは異なり、文字列操作や入出力等の基本的な機能を内蔵していなかった。やがてC言語の利用者は、現在の標準Cライブラリの原型となる概念や実装を共有するようになった。

C言語の普及に伴い、言語仕様がそうであったように、ライブラリもまた多くの方言が生まれたが、1989年(ISO/IEC 9899:1990)にANSIによるC言語の標準規格が制定されることで統一化が図られ、更にはいくつかの新たな概念が導入され、これが標準Cライブラリとなった。

その後に行われた標準規格の改定は、標準Cライブラリへの機能追加が主であった。1995年(ISO/IEC 9899/AMD1:1995)には、主としてワイド文字操作に関する関数群が大幅に追加された。また、1999年(ISO/IEC 9899:1999、C99)には、主として複素数や数学上の演算に関する関数群が大幅に追加された。2011年(ISO/IEC 9899:2011、C11)には、アライメント・マルチスレッド・Unicode・メモリ境界チェック付き関数などが追加になった。

主な機能

標準ヘッダ

C11 (ISO/IEC 9899:2011) では、標準ヘッダとして以下のものを定めている。

ISO/IEC 9899:2011(C11) の定める標準ヘッダ一覧
ヘッダーファイル初出概要
assert.h診断機能
complex.hC99複素数計算
ctype.h文字操作
errno.hエラー
fenv.hC99浮動小数点環境
float.h浮動小数点型の特性
inttypes.hC99整数型の書式の変換
iso646.hAMD1代替つづり(Alternate spellings)
limits.h整数型の大きさ
locale.h文化圏固有操作
math.h数学
setjmp.h非局所分岐
signal.hシグナル操作
stdalign.hC11アライメント
stdarg.h可変個数の実引数
stdatomic.hC11アトミック操作
stdbool.hC99論理型および論理値
stddef.h共通の定義
stdint.hC99整数型
stdio.h入出力
stdlib.h一般ユーティリティ
stdnoreturn.h_Noreturn
string.h文字列操作
tgmath.hC99型総称数学関数(Type-generic math)
threads.hマルチスレッド
time.h日付及び時間
uchar.hC11Unicodeユーティリティ
wchar.hAMD1多バイトおよびワイド文字拡張ユーティリティ
wctype.hAMD1ワイド文字種分類およびワイド文字大文字小文字変換ユーティリティ

診断機能 assert.h

ヘッダ assert.h がインクルードされる時点における NDEBUG マクロの定義状態により、実行時診断機能の有効・無効を切り替えることができる。

C11で、翻訳時に確定する式を対象にアサーションする static_assert が追加された。

複素数 complex.h

複素数の演算、虚数単位の定義、実部と虚部の分離機能などが含まれている。

文字操作 ctype.h

文字種別の分類、および大文字・小文字の変換を行う関数を提供する。 ctype.h ヘッダが提供する文字操作関数は、設定されているロケールに応じて動作が変わる。

エラー errno.h

ライブラリ関数内でエラーが発生した場合、そのエラーの内容を報告するために使用するいくつかのマクロ定義。

浮動小数点型の特性 float.h

浮動小数点型の大きさや様々な特性を表すマクロの定義。

整数型の大きさ limits.h

整数型の大きさを表すマクロの定義。

文化圏固有操作 locale.h

ロケールごとに異なる、文字コード、数値を記述する場合の書式等の操作を行う型・マクロ・関数の宣言定義。

数学 math.h

数学的な演算を行うための関数、および関連するマクロの宣言定義。

非局所分岐 setjmp.h

関数の枠組みを越えた分岐(ジャンプ)を制御するための型・マクロ・関数の宣言定義。

シグナル操作 signal.h

シグナル処理関数の登録およびシグナルの送信に関するマクロ・型・関数の宣言定義。

可変個数の引数 stdarg.h

printf 関数のような可変長引数の関数における実引数の操作に関する型とマクロの定義。

共通の定義 stddef.h

処理系に依存する型とマクロの定義。

入出力 stdio.h

ストリームおよびファイルの操作に関する型・マクロ・関数の宣言定義。

一般ユーティリティ stdlib.h

一般ユーティリティに関する型・マクロ・関数の宣言定義。

文字列操作 string.h

文字列操作に関する型・マクロ・関数の宣言定義。

型総称数学関数<tgmath.h>

スレッド<threads.h>

C11で追加。

日付及び時間 time.h

グレゴリオ暦に基づく日付等を扱うための型・マクロ・関数の宣言定義。

time_tは、特にUNIX用の実装を初めとした多くの実装において、協定世界時 (UTC) 1970年1月1日0時0分0秒からの経過秒数を符号付32ビット整数型で表すようになっている。そのような実装では2001年9月9日問題、2038年問題のような問題が生じる。詳しくは各問題の記事を参照されたい。

Unicodeユーティリティ<uchar.h>

C11で追加。

多バイト文字及びワイド文字拡張ユーティリティ<wchar.h>

ワイド文字種分類及びワイド文字大文字小文字ユーティリティ<wctype.h>

フリースタンディング環境

フリースタンディング環境では、C89 では標準Cライブラリのうち float.h、limits.h、stdarg.h、stddef.h に対応している。ISO/IEC 9899/AMD1:1995 では加えて iso646.h が、C99 では更に stdbool.h および stdint.h に対応している。

Unix系の標準Cライブラリ

Unix系に関係するPOSIX、SUS、Linux Standard Baseなどの標準仕様では、標準Cライブラリを包含し、さらに追加の関数やマクロ、型などが規定されている。

GNU/Linux(多くのLinuxディストリビューション)では、一般的にGNU Cライブラリ (glibc) が標準Cライブラリの実装として用いられている。BSD系列での実装は、BSD libcと呼称される。

C++における標準Cライブラリ

C++03の標準C++ライブラリでは、C95相当の標準Cライブラリを包含している。更には、C95では任意実装であったfloat型やdouble型の数学関数も常にサポートされる。C++11ではC99相当の標準Cライブラリと uchar.h を包含している。

標準Cライブラリにおけるヘッダ xyz.h は、C++では cxyz というヘッダにマッピングされる。各識別子は std 名前空間内で宣言される。また、標準Cライブラリとの互換性を持たせるため、xyz.h 形式のヘッダも使用することができ、std 名前空間内で宣言された識別子はusing指令によってグローバル名前空間に引き出される。

C++固有の事情から、一部の関数についてはC言語との互換性が低下している。具体的にはmemchr関数やstrstr関数等がそれにあたる。すなわち、引数として渡されるポインタが指す型がconst修飾されているか否かにより、返却値の型もそれに合わせて変更されるように多重定義されている。

Cの場合

char *strchr(const char*, int);

C++の場合

const char *strchr(const char*, int);
char *strchr(char*, int);

脚註

  1. 1 2 3 ISO/IEC 9899/AMD1:1995
  2. ↑ ISO/IEC 9899:1999 TC3 | WG14/N1256, Committee Draft | Septermber 7, 2007 | 7.5 Errors <errno.h>
  3. ↑ ISO/IEC 9899:201x | WG14/N1548, Committee Draft | December 2, 2010 | 7.5 Errors <errno.h>
  4. ↑ N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E). ISO/IEC JTC1/SC22/WG14. p. 20, §5.2.4.2.1 Characteristics of integer types <limits.h>

外部リンク