標準C
ライブラリは、
C言語の標準規格で定められた、型、マクロ、関数の集合体です。
C言語でプログラミングを行う上で、基本的な機能を提供しており、開発者はこれらの
ライブラリを活用することで、効率的にプログラムを作成できます。
歴史
初期の
C言語は、文字列操作や入出力といった基本的な機能を内蔵していませんでした。しかし、
C言語の普及に伴い、これらの機能をまとめた
ライブラリの概念が共有されるようになり、標準C
ライブラリの原型が形成されました。
1989年、ANSIによって
C言語の標準規格が制定され、
ライブラリの統一化が図られました。この際、いくつかの新しい概念も導入され、標準C
ライブラリが誕生しました。その後、標準規格の改定が行われる度に、標準C
ライブラリには様々な機能が追加されています。
例えば、
1995年には
ワイド文字操作に関する関数群が、
1999年には
複素数や数学演算に関する関数群が大幅に追加されました。また、2011年には、アライメント、マルチスレッド、
Unicode、メモリ境界チェック付き関数など、現代的なプログラミングに対応するための機能が追加されています。
主な機能
標準C
ライブラリは、多くの
ヘッダファイルに分割されており、それぞれが特定の機能を提供しています。以下に、代表的な
ヘッダファイルとその機能について解説します。
診断機能 ``
`assert.h` は、プログラムのデバッグに役立つアサーション機能を提供します。`assert` マクロを使用することで、プログラムの実行中に特定の条件が満たされているかどうかをチェックできます。また、C11では、コンパイル時に確定する式を対象とした `static_assert` が追加されました。
`complex.h` は、
複素数の演算、
虚数単位の定義、実部と虚部の分離といった機能を提供します。`cabs`、`carg`、`cacos`、`casin`、`ctan` などの関数が用意されており、
複素数計算を容易に行うことができます。
文字操作 ``
`ctype.h` は、文字の種別を分類したり、大文字と小文字を変換したりする関数を提供します。`isalnum`、`isalpha`、`isdigit`、`islower`、`isupper` など、様々な文字判定関数が用意されています。また、`tolower` と `toupper` は、それぞれ文字を小文字または大文字に変換します。
エラー ``
`errno.h` は、
ライブラリ関数でエラーが発生した場合に、そのエラー内容を報告するためのマクロを定義します。`errno` はエラー番号を格納し、`EDOM`、`ERANGE`、`EILSEQ` は、それぞれ定義域エラー、範囲エラー、多バイト文字の不正な並びを表します。
浮動小数点型の特性 ``
`float.h` は、浮動小数点型の大きさや特性を表すマクロを定義します。`FLT_RADIX`、`FLT_MANT_DIG`、`FLT_MAX`、`FLT_MIN`、`FLT_EPSILON` などのマクロが用意されており、浮動小数点数の精度や範囲をプログラムで確認することができます。
整数型の大きさ ``
`limits.h` は、整数型の大きさを表すマクロを定義します。`CHAR_BIT`、`CHAR_MAX`、`INT_MAX`、`INT_MIN`、`LONG_MAX`、`LONG_MIN` などのマクロが用意されており、整数型の最大値や最小値をプログラムで使用することができます。
文化圏固有操作 ``
`locale.h` は、ロケールごとに異なる、
文字コード、数値の書式設定などの操作を行うための機能を提供します。`localeconv` 関数や `setlocale` 関数を利用して、地域に応じた表示形式をプログラムで制御することができます。
数学 ``
`math.h` は、数学的な演算を行うための関数を提供します。`acos`、`asin`、`atan`、`cos`、`sin`、`tan`、`exp`、`log`、`pow`、`sqrt` など、基本的な数学関数が豊富に用意されています。
非局所分岐 ``
`setjmp.h` は、関数の枠組みを超えた分岐(ジャンプ)を制御するための機能を提供します。`setjmp` マクロは実行環境を保存し、`longjmp` 関数は保存された環境に復帰します。これらを活用することで、例外処理などの実装が可能になります。
シグナル操作 ``
`signal.h` は、シグナル処理関数を登録したり、シグナルを送信したりするための機能を提供します。`raise` 関数でシグナルを送信し、`signal` 関数でシグナル処理関数を登録します。
可変個数の引数 ``
`stdarg.h` は、`printf` 関数のような可変長引数の関数で、引数にアクセスするための機能を提供します。`va_list` 型、`va_arg` マクロ、`va_start` マクロ、`va_end` マクロを利用して、可変個数の引数を操作します。
共通の定義 ``
`stddef.h` は、処理系に依存する型やマクロを定義します。`ptrdiff_t`、`size_t`、`wchar_t`、`NULL`、`offsetof` など、様々な型やマクロが用意されています。
入出力 ``
`stdio.h` は、ストリームとファイルの操作に関する機能を提供します。`fopen`、`fclose`、`fread`、`fwrite`、`printf`、`scanf` など、ファイル入出力や標準入出力に必要な関数が豊富に用意されています。
一般ユーティリティ ``
`stdlib.h` は、一般ユーティリティに関する機能を提供します。メモリの割り当てと解放を行う `malloc`、`calloc`、`realloc`、`free` 関数や、文字列を数値に変換する `atoi`、`atol`、`atof` 関数など、汎用的な関数が多数用意されています。
文字列操作 ``
`string.h` は、文字列操作に関する機能を提供します。`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncmp`、`strlen` など、文字列のコピー、連結、比較、長さ取得などの関数が用意されています。
その他のヘッダ
他にも、`
`(型総称数学関数), ``(スレッド), ``(日付と時間), ``(Unicodeユーティリティ), ``(多バイト文字とワイド文字拡張), ``(ワイド文字種分類と大文字小文字) などがあります。
フリースタンディング環境では、C89 の標準Cライブラリのうち、``、``、``、`` に対応しています。C99 ではさらに `` と `` が追加でサポートされます。
Unix系では、POSIXやSUSといった標準仕様が、標準Cライブラリを包含し、さらに追加の関数やマクロ、型などを規定しています。GNU/Linux では、一般的に GNU C ライブラリ (glibc) が実装として用いられています。
C++ では、標準Cライブラリを C のヘッダ名から `c` を先頭に付与したヘッダ名で利用できます。例えば、`stdio.h` は `cstdio` として利用されます。C++ では、C++ の名前空間 `std` 内に識別子が定義されます。
一部の関数では、C++ 固有の事情により、C言語との互換性が低下している場合があります。例えば、`memchr` 関数や `strstr` 関数は、引数のポインタが `const` 修飾されているかどうかによって、返り値の型が変化します。
標準Cライブラリは、C言語プログラミングにおいて不可欠な要素であり、その機能を理解し活用することで、より効率的で信頼性の高いプログラムを開発することができます。