標準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) では、標準ヘッダとして以下のものを定めている。
診断機能 |
この節の加筆が望まれています。 |
スレッド<threads.h>
この節の加筆が望まれています。 |
C11で追加。
日付及び時間 time.h
グレゴリオ暦に基づく日付等を扱うための型・マクロ・関数の宣言定義。
clock_t
— clock 関数が返す値の型time_t
— 時刻を表す型struct tm
— 暦時刻の各要素(年月日時分秒等)を格納する構造体CLOCKS_PER_SEC
—clock
関数が返す値を秒単位に変換するための除数を表すマクロ定数asctime
—tm
構造体から文字列への変換clock
— 処理系定義の開始点(通例プログラム実行開始)からの経過時間(プロセッサ時間、CPU使用時間)の取得ctime
—time_t
型から文字列への変換difftime
—time_t
型どうしの秒単位での差gmtime
— 協定世界時 (UTC) の取得localtime
— 地方時刻の取得mktime
—tm
構造体からtime_t
型への変換strftime
—tm
構造体から文字列への書式付き変換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.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);
脚註
- ^ a b c ISO/IEC 9899/AMD1:1995
- ^ ISO/IEC 9899:1999 TC3 | WG14/N1256, Committee Draft | Septermber 7, 2007 | 7.5 Errors <errno.h>
- ^ ISO/IEC 9899:201x | WG14/N1548, Committee Draft | December 2, 2010 | 7.5 Errors <errno.h>
- ^ 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>