第12回 標準Cライブラリ

いったんは連載を終えた「C++プログラマのためのC言語入門」ですが、ここまでの時点で扱い切れなかった話題を少し補足するために、連載を再開することにします。今回解説するのは、標準Cライブラリについてです。Cでは、C++の標準ライブラリのうち、当然のことながら標準Cライブラリに当たる部分しかサポートされません。しかし、標準Cライブラリの範疇でも、若干のちがいがあります。

std名前空間

C++の標準ライブラリでは、マクロや一部の例外を除き、すべての識別子がstd名前空間で定義されます。<stdio.h>のようなC互換のヘッダを用いた場合でも、std名前空間で定義された識別子をusing宣言によって大域的名前空間に導入しているだけです。しかし、Cには名前空間がありませんので、std::を付けて関数名などを指定することはできません。

多重定義の影響

absやdivのような関数は、C++では、labs, fabs, ldivのような引数の型ごとに異なる名前を持つ関数だけでなく、多重定義が行われていました。しかし、Cには多重定義の仕様がないため、引数の型ごとに異なる名前の関数だけがサポートされます。

また、sinなどの数学関数は、C++では、float版、double版、long double版が多重定義されていましたが、Cではdouble版しかありません。処理系によっては(あるいはC99以上であれば)、float版として接尾辞-fが付く関数が、long double版として接尾辞-lが付く関数が定義されることがあります。例えば、sin, sinf, sinlのようにです。

C++では、数学関数が多重定義されているため、例えば引数として汎整数型の値を渡すと、多重定義の解決ができませんでした。しかし、Cの場合、例えばsinならdouble版しかありませんので、正しくコンパイルすることができます。

const修飾子の扱い

strchrやmemchrのように、C++ではconst修飾子の有無によって多重定義されていた関数は、Cではconst修飾子付きに引数を受け取り、const修飾子無しの返却値を返します。具体的には、次のようになります。

C++の場合
 
char* strchr(char* s, int c);
const char* strchr(const char* s, int c);
Cの場合
 
char *strchr(const char *s, int c);

C95以降のライブラリ

C++の標準ライブラリはC95をベースにしています。しかし、C90ではC95で追加されたライブラリはサポートされません。具体的には、次のヘッダとそこで宣言・定義される関数、型、マクロです。

  • <iso646.h>
  • <wctype.h>
  • <wchar.h>

また、C90のprintf系関数およびscanf系関数では、"%lc"や"%ls"といったワイド文字(列)を表す書式指定を使うことができません。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/760