C++: C言語由来のライブラリー
C++でC言語の標準ライブラリーを使うには2種類の方法がある。
- C言語のヘッダーをinclude(例:
#include <string.h>
) - C++のC言語用ヘッダーをinclude(例:
#include <cstring>
)
C++からC言語のライブラリーを使うときにどちらのヘッダーを使えばよいのか迷ったのでまとめる。
C++ではC言語の標準ライブラリーを取り込むために,以下のライブラリーが存在する。
Table 15 — C++ headers for C library facilities <cassert> <cinttypes> <csignal> <cstdio> <cwchar> <ccomplex> <ciso646> <cstdalign> <cstdlib> <cwctype> <cctype> <climits> <cstdarg> <cstring> <cerrno> <clocale> <cstdbool> <ctgmath> <cfenv> <cmath> <cstddef> <ctime> <cfloat> <csetjmp> <cstdint> <cuchar>
これらのライブラリーの扱いについては以下のように書かれている。
C言語の標準ヘッダーとの違いは,名前空間stdにこれらが属している点だ。これらをC言語標準ヘッダーの代わりに使うことで,名前空間stdに統一的に扱うことができる。C言語の標準ヘッダーを使った場合,グローバルな名前空間に全て取り込まれるため,名前空間が汚染され他のライブラリーと競合する可能性がある。
C言語標準ヘッダーとの使い分けについては以下のように書かれている。
C言語との厳密な互換性を重視する場合にC言語標準ヘッダーを使い,そうでなければC++のライブラリーを使えばいいとのこと。特に理由がないならば,C++のライブラリーを使ったほうがいい。
なお,ヘッダーの命名規則は以下のように決まっている。
- C言語の標準ヘッダーをベース(例:
<stdio.h>
) - 先頭にcを付与(例:
<cstdio.h>
) - 末尾の.hを削除(例:
<cstdio>
)
C言語の標準ヘッダー名からC++のライブラリー,またはその逆を連想する場合の参考にしよう。
この記事を書くにあたって,以下の記事がとても参考になった。