標準Cライブラリ

ANSI C標準として定義されたC言語のための標準ライブラリで、マクロ・型定義・異なるタスクのための関数を提供するもの

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

歴史

編集

C言語は、PascalPL/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.h C99 複素数計算
ctype.h 文字操作
errno.h エラー
fenv.h C99 浮動小数点環境
float.h 浮動小数点型の特性
inttypes.h C99 整数型の書式の変換
iso646.h AMD1[1] 代替つづり(Alternate spellings)
limits.h 整数型の大きさ
locale.h 文化圏固有操作
math.h 数学
setjmp.h 非局所分岐
signal.h シグナル操作
stdalign.h C11 アライメント
stdarg.h 可変個数の実引数
stdatomic.h C11 アトミック操作
stdbool.h C99 論理型および論理値
stddef.h 共通の定義
stdint.h C99 整数型
stdio.h 入出力
stdlib.h 一般ユーティリティ
stdnoreturn.h _Noreturn
string.h 文字列操作
tgmath.h C99 型総称数学関数(Type-generic math)
threads.h マルチスレッド
time.h 日付及び時間
uchar.h C11 Unicodeユーティリティ
wchar.h AMD1[1] 多バイトおよびワイド文字拡張ユーティリティ
wctype.h AMD1[1] ワイド文字種分類およびワイド文字大文字小文字変換ユーティリティ

診断機能 assert.h

編集

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

  • assertNDEBUG マクロが定義されていない場合に実行時診断を行う。

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

複素数 complex.h

編集

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

文字操作 ctype.h

編集

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

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

エラー errno.h

編集

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

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

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

編集

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

  • FLT_RADIX — 浮動小数点型の内部表現に使用される基数
  • FLT_ROUNDS — 浮動小数点型の丸め方向
  • FLT_MANT_DIGfloat型のFLT_RADIXを基数とした仮数部の桁数
  • FLT_MAX_EXPfloat 型におけるFLT_RADIXを基数とした指数部の最大値
  • FLT_MIN_EXPfloat 型におけるFLT_RADIXを基数とした指数部の最小値
  • FLT_MAX_10_EXPfloat 型における10を基数とした指数部の最大値
  • FLT_MIN_10_EXPfloat 型における10を基数とした指数部の最小値
  • FLT_MAXfloat 型の最大値
  • FLT_MINfloat 型の正の値の最小値(整数型とは違いfloat型の実数の最小値は-FLT_MAXである)
  • FLT_EPSILONfloat型で表現可能な1より大きい最小値と1との差(計算機イプシロン
  • DBL_MANT_DIGdouble 型のFLT_RADIXを基数とした仮数部の桁数
  • DBL_MAX_EXPdouble 型におけるFLT_RADIXを基数とした指数部の最大値
  • DBL_MIN_EXPdouble型におけるFLT_RADIXを基数とした指数部の最小値
  • DBL_MAX_10_EXPdouble型における10を基数とした指数部の最大値
  • DBL_MIN_10_EXPdouble 型における10を基数とした指数部の最小値
  • DBL_MAXdouble型の最大値
  • DBL_MINdouble型の正の値の最小値(整数型とは違いdouble型の実数の最小値は-DBL_MAXである)
  • DBL_EPSILONdouble 型で表現可能な1より大きい最小値と1との差
  • LDBL_MANT_DIGlong double 型の FLT_RADIX を基数とした仮数部の桁数
  • LDBL_MAX_EXPlong double 型における FLT_RADIX を基数とした指数部の最大値
  • LDBL_MIN_EXPlong double 型における FLT_RADIX を基数とした指数部の最小値
  • LDBL_MAX_10_EXPlong double 型における10を基数とした指数部の最大値
  • LDBL_MIN_10_EXPlong double 型における10を基数とした指数部の最小値
  • LDBL_MAXlong double 型の最大値
  • LDBL_MINlong double 型の最小値
  • LDBL_EPSILONlong double 型で表現可能な1より大きい最小値と1との差

整数型の大きさ limits.h

編集

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

  • CHAR_BITchar型を構成する1バイトの[4]ビット数(>=8
  • MB_LEN_MAX — 処理系がサポートするマルチバイト文字の最大バイト数
  • CHAR_MAXchar型の最大値。SCHAR_MAX または UCHAR_MAX と同じ
  • CHAR_MINchar型の最小値。SCHAR_MIN または 0 と同じ
  • SCHAR_MAXsigned char 型の最大値(>=127
  • SCHAR_MINsigned char 型の最小値(<=-127
  • UCHAR_MAXunsigned char 型の最大値(>=255
  • SHRT_MAXshort型の最大値(>=32767
  • SHRT_MINshort型の最小値(<=-32767
  • USHRT_MAXunsigned short型の最大値(>=65535
  • INT_MAXint型の最大値(>=32767
  • INT_MINint型の最小値(<=-32767
  • UINT_MAXunsigned int型の最大値(>=65535
  • LONG_MAXlong型の最大値(>=2147483647
  • LONG_MINlong型の最小値(<=-2147483647
  • ULONG_MAXunsigned long型の最大値(>=4294967295

文化圏固有操作 locale.h

編集

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

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

数学 math.h

編集

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

  • HUGE_VALfloat型で表現できるとは限らない正の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 — 双曲線関数|双曲線正接

非局所分岐 setjmp.h

編集

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

  • jmp_bufsetjmp マクロが実行環境を保存するための型
  • setjmplongjmp 関数による復帰を可能にするために実行環境を保存するためのマクロ(しばしば直接、関数で実装されているが、標準ではマクロとされている。POSIXではマクロか関数かは指定されない、としている)
  • longjmpsetjmp マクロで保存された環境への復帰

シグナル操作 signal.h

編集

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

  • sig_atomic_t — 代入および参照が不分割に実行される(アトミックオペレーションとなる)整数型
  • raise — シグナルの送信
  • signal — シグナル処理関数の登録

可変個数の引数 stdarg.h

編集

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

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

共通の定義 stddef.h

編集

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

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

入出力 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行入力(ただし、C11で削除された)
  • perror — 標準エラー出力へのエラーメッセージの出力
  • printf — 標準出力への書式付き出力
  • putc — ストリームへの1文字出力
  • putchar — 標準出力への1文字出力
  • puts — 標準出力への1行出力
  • remove — ファイルの削除
  • rename — ファイル名の変更
  • rewind — ストリームの巻き戻し
  • scanf — 標準入力からの書式付き入力
  • setbuf — ストリームのバッファ設定
  • setvbuf — ストリームの詳細なバッファ設定
  • sprintf — 文字配列への書式付き出力
  • sscanf — 文字列からの書式付き入力
  • tmpfile — テンポラリファイルをバイナリモードでオープン
  • tmpnam — テンポラリファイル名の生成
  • vprintf — 標準出力への書式付き出力(va_list版)
  • vscanf — 標準入力からの書式付き入力(va_list版)

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

編集

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

  • div_tint型の商と剰余を格納する構造体
  • ldiv_tlong型の商と剰余を格納する構造体
  • MB_CUR_MAX — 設定されているロケールにおけるマルチバイト文字の最大バイト数を表すマクロ
  • RAND_MAXrand関数が返す擬似乱数の最大値
  • abort — プログラムの異常終了
  • absint型の絶対値
  • aligned_alloc — アライメントされたメモリブロックの割り付け(C11で追加)
  • atexit — 終了時関数の登録
  • at_quick_exit — 通常の終了時関数の登録(C11で追加)
  • atof — 文字列からdouble型への変換
  • atoi — 文字列からint型への変換
  • atol — 文字列からlong型への変換
  • bsearchバイナリサーチ
  • callocメモリブロックの割り付けとクリア
  • divint型どうしの商と剰余
  • exit[要曖昧さ回避] — プログラムの終了
  • free — メモリブロックの解放
  • getenv — 環境変数の参照
  • labslong型の絶対値
  • ldivlong型どうしの商と剰余
  • malloc — メモリブロックの割り付け
  • mblen — マルチバイト文字の構成バイト数
  • mbstowcs — マルチバイト文字列からワイド文字列への変換
  • mbtowc — マルチバイト文字からワイド文字への変換
  • qsortクイックソート (ただし、仕様上はソートを行うとあるだけで「クイックソートによる」とは書かれていない)
  • quick_exit — 通常のプログラムの終了(C11で追加)
  • rand — 擬似乱数
  • realloc — メモリブロックの再割り付け
  • srand — 乱数種の設定
  • strtod — 文字列からdouble型への変換
  • strtol — 文字列からlong型への変換(基数指定可)
  • strtoul — 文字列からunsigned long型への変換(基数指定可)
  • system — コマンドプロセッサの呼び出し
  • wcstombs — ワイド文字列からマルチバイト文字列への変換
  • wctomb — ワイド文字列からマルチバイト文字列への変換

文字列操作 string.h

編集

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

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

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

編集

スレッド<threads.h>

編集

C11で追加。

日付及び時間 time.h

編集

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

  • clock_t — clock 関数が返す値の型
  • time_t — 時刻を表す型
  • struct tm — 暦時刻の各要素(年月日時分秒等)を格納する構造体
  • CLOCKS_PER_SECclock関数が返す値を秒単位に変換するための除数を表すマクロ定数
  • asctimetm構造体から文字列への変換
  • clock — 処理系定義の開始点(通例プログラム実行開始)からの経過時間(プロセッサ時間、CPU使用時間)の取得
  • ctimetime_t型から文字列への変換
  • difftimetime_t型どうしの秒単位での差
  • gmtime協定世界時 (UTC) の取得
  • localtime — 地方時刻の取得
  • mktimetm構造体から time_t型への変換
  • strftimetm構造体から文字列への書式付き変換
  • time — 現在の暦時刻 (calendar time) の取得

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.hlimits.hstdarg.hstddef.h に対応している。ISO/IEC 9899/AMD1:1995 では加えて iso646.h が、C99 では更に stdbool.h および stdint.h に対応している。

Unix系の標準Cライブラリ

編集

Unix系に関係するPOSIXSUSLinux 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. ^ a b c 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>. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf 

外部リンク

編集