標準Cライブラリ

標準Cライブラリは、C言語の標準規格で定められた、型・マクロ・関数の集合からなるライブラリである。

1. 歴史
-----

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

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

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

2. 主な機能
-------

2.1. 標準ヘッダ
----------

C11  では、標準ヘッダとして以下のものを定めている。



2.2. 診断機能 assert.h
------------------

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

assert — NDEBUG マクロが定義されていない場合に実行時診断を行う。C11で、翻訳時に確定する式を対象にアサーションする static_assert が追加された。

2.3. 複素数 complex.h
------------------

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

complex — 複素数型
I — 虚数単位
cabs — 絶対値
carg — 偏角
cacos — 逆余弦
cacosh — 逆双曲線余弦
casin — 逆正弦
casinh — 逆双曲線正弦
catan — 逆正接
catanh — 逆双曲線正接
ccos — 余弦
ccosh — 双曲線余弦
cexp — 指数関数
cfabs — 浮動小数点数の絶対値
cimag — 複素数の虚部
clog — 自然対数
clog10 — 常用対数
conj — 共役複素数
cpow — 冪乗
cproj — リーマン球への射影
creal — 複素数の実部
csin — 正弦
csinh — 双曲線正弦
csqrt — 平方根
ctan — 正接
ctanh — 双曲線正接

2.4. 文字操作 ctype.h
-----------------

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

isalnum — 英数字かどうかの判別
isalpha — 英字かどうかの判別
isblank — 単語を区切る文字かどうかの判定
iscntrl — 制御文字かどうかの判別
isdigit — 数字かどうかの判別
isgraph — 空白を除く表示文字かどうかの判別
islower — 小文字かどうかの判別
isprint — 表示文字かどうかの判別
ispunct — 区切り文字かどうかの判別
isspace — 空白類文字かどうかの判別
isupper — 大文字かどうかの判別
isxdigit — 16進数字かどうかの判別
tolower — 小文字への変換
toupper — 大文字への変換

2.5. エラー errno.h
----------------

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

errno — エラー番号を格納するint型の変数を参照するマクロ。マクロであるが、見かけ上はint型の変更可能な左辺値式に展開される。C11以降でスレッドが標準化されたことに伴い、スレッドローカルな記憶域期間  を持つことが規定された。
EDOM — 定義域エラー
ERANGE — 範囲エラー
EILSEQ — 多バイト文字の不正な並び

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

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

FLT_RADIX — 浮動小数点型の内部表現に使用される基数
FLT_ROUNDS — 浮動小数点型の丸め方向
FLT_MANT_DIG — float型のFLT_RADIXを基数とした仮数部の桁数
FLT_MAX_EXP — float 型におけるFLT_RADIXを基数とした指数部の最大値
FLT_MIN_EXP — float 型におけるFLT_RADIXを基数とした指数部の最小値
FLT_MAX_10_EXP — float 型における10を基数とした指数部の最大値
FLT_MIN_10_EXP — float 型における10を基数とした指数部の最小値
FLT_MAX — float 型の最大値
FLT_MIN — float 型の正の値の最小値
FLT_EPSILON — float型で表現可能な1より大きい最小値と1との差
DBL_MANT_DIG — double 型のFLT_RADIXを基数とした仮数部の桁数
DBL_MAX_EXP — double 型におけるFLT_RADIXを基数とした指数部の最大値
DBL_MIN_EXP — double型におけるFLT_RADIXを基数とした指数部の最小値
DBL_MAX_10_EXP — double型における10を基数とした指数部の最大値
DBL_MIN_10_EXP — double 型における10を基数とした指数部の最小値
DBL_MAX — double型の最大値
DBL_MIN — double型の正の値の最小値
DBL_EPSILON — double 型で表現可能な1より大きい最小値と1との差
LDBL_MANT_DIG — long double 型の FLT_RADIX を基数とした仮数部の桁数
LDBL_MAX_EXP — long double 型における FLT_RADIX を基数とした指数部の最大値
LDBL_MIN_EXP — long double 型における FLT_RADIX を基数とした指数部の最小値
LDBL_MAX_10_EXP — long double 型における10を基数とした指数部の最大値
LDBL_MIN_10_EXP — long double 型における10を基数とした指数部の最小値
LDBL_MAX — long double 型の最大値
LDBL_MIN — long double 型の最小値
LDBL_EPSILON — long double 型で表現可能な1より大きい最小値と1との差

2.7. 整数型の大きさ limits.h
---------------------

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

CHAR_BIT — char型を構成する1バイトのビット数
MB_LEN_MAX — 処理系がサポートするマルチバイト文字の最大バイト数
CHAR_MAX — char型の最大値。SCHAR_MAX または UCHAR_MAX と同じ
CHAR_MIN — char型の最小値。SCHAR_MIN または 0 と同じ
SCHAR_MAX — signed char 型の最大値
SCHAR_MIN — signed char 型の最小値
UCHAR_MAX — unsigned char 型の最大値
SHRT_MAX — short型の最大値
SHRT_MIN — short型の最小値
USHRT_MAX — unsigned short型の最大値
INT_MAX — int型の最大値
INT_MIN — int型の最小値
UINT_MAX — unsigned int型の最大値
LONG_MAX — long型の最大値
LONG_MIN — long型の最小値
ULONG_MAX — unsigned long型の最大値

2.8. 文化圏固有操作 locale.h
---------------------

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

struct lconv — 数値を記述する場合の書式に関する情報を格納する構造体
localeconv — 設定されているロケールに応じた値を格納した struct lconvを参照
setlocale — 現在のロケールを設定

2.9. 数学 math.h
--------------

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

HUGE_VAL — float型で表現できるとは限らない正のdouble型の式。無限大またはそれに類する大きな値
acos — 逆余弦
asin — 逆正弦
atan — 逆正接
atan2 — 底辺と高さを指定した直角三角形の逆正接
ceil — 天井関数
cos — 余弦
cosh — 双曲線余弦
exp — 指数関数
fabs — 浮動小数点数の絶対値
floor — 床関数
fmod — 浮動小数点どうしの商と剰余
frexp — 「正規化された仮数部」と「2の累乗」への分解
ldexp — 浮動小数点数と2の累乗との乗算
log — 自然対数
log10 — 常用対数
modf — 整数部と小数部の分解
pow — 冪乗
sin — 正弦
sinh — 双曲線正弦
sqrt — 平方根
tan — 三角関数|正接
tanh — 双曲線関数|双曲線正接

2.10. 非局所分岐 setjmp.h
--------------------

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

jmp_buf — setjmp マクロが実行環境を保存するための型
setjmp — longjmp 関数による復帰を可能にするために実行環境を保存するためのマクロ
longjmp — setjmp マクロで保存された環境への復帰

2.11. シグナル操作 signal.h
---------------------

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

sig_atomic_t — 代入および参照が不分割に実行される整数型
raise — シグナルの送信
signal — シグナル処理関数の登録

2.12. 可変個数の引数 stdarg.h
----------------------

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

va_list — 可変個の実引数にアクセスするための情報を格納する型
va_arg — 可変個の実引数の取り出し
va_start — 可変個の実引数操作の開始
va_end — 可変個の実引数操作の終了

2.13. 共通の定義 stddef.h
--------------------

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

ptrdiff_t — ポインタ減算の結果の型。符号付き整数型。
size_t — sizeof 演算子の結果の型。符号無し整数型。Unix 系など、POSIX 1003.1-1996 API に準拠している場合、ssize_tが符号付きのsize_t。
wchar_t — ワイド文字型。8ビット以上の整数だが、コンパイラやプラットフォームにより大きさは様々。Microsoft Windowsでは16ビット、Unix系では32ビットであることが多い。
NULL — 空ポインタ定数マクロ
offsetof — 構造体メンバの先頭からのオフセットを得る

2.14. 入出力 stdio.h
-----------------

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

FILE — ストリームを制御するためのオブジェクト型
fpos_t — ファイルのシーク位置を格納するための型
clearerr — ファイル終端表示子およびエラー表示子のクリア
fclose — ファイルのクローズ
feof — ファイル終端表示子の判定
ferror — エラー表示子の判定
fgetc — ストリームからの1文字入力
fgetpos — ストリームのファイル位置表示子の参照
fgets — ストリームからの1行入力
fopen — ファイルのオープン
fprintf — ストリームへの書式付き出力
fputc — ストリームへの1文字出力
fputs — ストリームへの1行出力
fread — ストリームからの読み込み
fscanf — ストリームからの書式付き入力
fseek — ストリームのファイル位置表示子の変更
fsetpos — ストリームのファイル位置表示子の設定
ftell — ストリームのファイル位置表示子の参照
fwrite — ストリームへの書き込み
getc — ストリームからの1文字入力
getchar — 標準入力からの1文字入力
gets — 標準入力からの1行入力
perror — 標準エラー出力へのエラーメッセージの出力
printf — 標準出力への書式付き出力
putc — ストリームへの1文字出力
putchar — 標準出力への1文字出力
puts — 標準出力への1行出力
remove — ファイルの削除
rename — ファイル名の変更
rewind — ストリームの巻き戻し
scanf — 標準入力からの書式付き入力
setbuf — ストリームのバッファ設定
setvbuf — ストリームの詳細なバッファ設定
sprintf — 文字配列への書式付き出力
sscanf — 文字列からの書式付き入力
tmpfile — テンポラリファイルをバイナリモードでオープン
tmpnam — テンポラリファイル名の生成
vprintf — 標準出力への書式付き出力
vscanf — 標準入力からの書式付き入力

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

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

div_t — int型の商と剰余を格納する構造体
ldiv_t — long型の商と剰余を格納する構造体
MB_CUR_MAX — 設定されているロケールにおけるマルチバイト文字の最大バイト数を表すマクロ
RAND_MAX — rand関数が返す擬似乱数の最大値
abort — プログラムの異常終了
abs — int型の絶対値
aligned_alloc — アライメントされたメモリブロックの割り付け
atexit — 終了時関数の登録
at_quick_exit — 通常の終了時関数の登録
atof — 文字列からdouble型への変換
atoi — 文字列からint型への変換
atol — 文字列からlong型への変換
bsearch — バイナリサーチ
calloc — メモリブロックの割り付けとクリア
div — int型どうしの商と剰余
exitdate=2022年12月}} — プログラムの終了
free — メモリブロックの解放
getenv — 環境変数の参照
labs — long型の絶対値
ldiv — long型どうしの商と剰余
malloc — メモリブロックの割り付け
mblen — マルチバイト文字の構成バイト数
mbstowcs — マルチバイト文字列からワイド文字列への変換
mbtowc — マルチバイト文字からワイド文字への変換
qsort — クイックソート 
quick_exit — 通常のプログラムの終了
rand — 擬似乱数
realloc — メモリブロックの再割り付け
srand — 乱数種の設定
strtod — 文字列からdouble型への変換
strtol — 文字列からlong型への変換
strtoul — 文字列からunsigned long型への変換
system — コマンドプロセッサの呼び出し
wcstombs — ワイド文字列からマルチバイト文字列への変換
wctomb — ワイド文字列からマルチバイト文字列への変換

2.16. 文字列操作 string.h
--------------------

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

memchr — メモリブロック中の文字検索
memcmp — メモリブロックの比較
memcpy — メモリブロックのコピー
memmove — メモリブロックの転送
memset — メモリブロックを指定文字で埋める
strchr — 文字列内の文字探索
strcat — 文字列の連結
strcmp — 文字列の比較
strcpy — 文字列のコピー
strcspn — 文字列中の指定文字群を含まない先頭部分の長さ
strerror — エラー番号に対応したエラーメッセージ文字列の取得
strcoll — ロケールに応じた順序付けによる文字列の比較
strlen — 文字列の長さ
strncat — 字数制限付きで文字列の連結
strncmp — 字数制限付きで文字列の比較
strncpy — 字数制限付きで文字列のコピー
strpbrk — 文字列中の文字群探索
strrchr — 文字列内の逆方向文字探索
strspn — 文字列中の指定文字群を含む先頭部分の長さ
strstr — 文字列中の文字列探索
strtok — 文字列からの字句切り出し
strxfrm — ロケールに応じた順序付けになるように文字列を変換

2.17. 型総称数学関数
-------------

2.18. スレッド
----------

C11で追加。

2.19. 日付及び時間 time.h
-------------------

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

clock_t — clock 関数が返す値の型
time_t — 時刻を表す型
struct tm — 暦時刻の各要素を格納する構造体
CLOCKS_PER_SEC — clock関数が返す値を秒単位に変換するための除数を表すマクロ定数
asctime — tm構造体から文字列への変換
clock — 処理系定義の開始点からの経過時間の取得
ctime — time_t型から文字列への変換
difftime — time_t型どうしの秒単位での差
gmtime — 協定世界時  の取得
localtime — 地方時刻の取得
mktime — tm構造体から time_t型への変換
strftime — tm構造体から文字列への書式付き変換
time — 現在の暦時刻  の取得time_tは、特にUNIX用の実装を初めとした多くの実装において、協定世界時  1970年1月1日0時0分0秒からの経過秒数を符号付32ビット整数型で表すようになっている。そのような実装では2001年9月9日問題、2038年問題のような問題が生じる。詳しくは各問題の記事を参照されたい。

2.20. Unicodeユーティリティ
--------------------

C11で追加。

2.21. 多バイト文字及びワイド文字拡張ユーティリティ
----------------------------

2.22. ワイド文字種分類及びワイド文字大文字小文字ユーティリティ
----------------------------------

3. フリースタンディング環境
---------------

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

4. Unix系の標準Cライブラリ
-----------------

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

GNU/Linuxでは、一般的にGNU Cライブラリ  が標準Cライブラリの実装として用いられている。BSD系列での実装は、BSD libcと呼称される。

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

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

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

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

Cの場合 char *strchr; C++の場合 const char *strchr; char *strchr;

6. 脚註
-----

7. 外部リンク
--------