C++: C言語由来のライブラリー

C++でC言語の標準ライブラリーを使うには2種類の方法がある。

  1. C言語のヘッダーをinclude(例:#include <string.h>
  2. 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>
ISO C++11 (N3242) 17.6.1.2 Headers

これらのライブラリーの扱いについては以下のように書かれている。

Except as noted in Clauses 18 through 30 and Annex D, the contents of each header cname shall be the same as that of the corresponding header name.h, as specified in the C standard library (1.2) or the C Unicode TR, as appropriate, as if by inclusion. In the C++ standard library, however, the declarations (except for names which are defined as macros in C) are within namespace scope (3.3.6) of the namespace std. It is unspecified whether these names are first declared within the global namespace scope and are then injected into namespace std by explicit using-declarations (7.3.3).
ISO C++11 (N3242) 17.6.1.2 Headers

C言語の標準ヘッダーとの違いは,名前空間stdにこれらが属している点だ。これらをC言語標準ヘッダーの代わりに使うことで,名前空間stdに統一的に扱うことができる。C言語の標準ヘッダーを使った場合,グローバルな名前空間に全て取り込まれるため,名前空間が汚染され他のライブラリーと競合する可能性がある。

C言語標準ヘッダーとの使い分けについては以下のように書かれている。

175) The “.h” headers dump all their names into the global namespace, whereas the newer forms keep their names in namespace std. Therefore, the newer forms are the preferred forms for all uses except for C++ programs which are intended to be strictly compatible with C.
ISO C++11 (N3242) 17.6.1.2 Headers

C言語との厳密な互換性を重視する場合にC言語標準ヘッダーを使い,そうでなければC++のライブラリーを使えばいいとのこと。特に理由がないならば,C++のライブラリーを使ったほうがいい

なお,ヘッダーの命名規則は以下のように決まっている。

  • C言語の標準ヘッダーをベース(例:<stdio.h>
  • 先頭にcを付与(例:<cstdio.h>
  • 末尾の.hを削除(例:<cstdio>

C言語の標準ヘッダー名からC++のライブラリー,またはその逆を連想する場合の参考にしよう。

この記事を書くにあたって,以下の記事がとても参考になった。

なぜ、C++の標準ヘッダをインクルードするとき拡張子をつけないのか。 – C言語・C++・C# | 教えて!goo

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です