C言語(C11)ではC++(C++11以降)の標準ライブラリのうち、当然のことながら標準Cライブラリに当たる部分しかサポートされません。一方でC++11が参照しているのはC99であり、C11で追加されたライブラリはC++17より前のバージョンではサポートされません。

std名前空間

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

多重定義の影響

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

また、sinなどの数学関数は、C++では、float版、double版、long double版が多重定義されていましたが、C11では、float版として接尾辞-fが付く関数が、long double版として接尾辞-lが付く関数が定義されます。例えば、sin, sinf, sinlのようにです。

また、<tgmath.h>では、単にsinと書くだけで実引数の型に応じて、float版、double版、long double版のほか、複素数版のcsin関数等が呼び出されます。C++ほどの自由度はありませんが、これも一種の多重定義と考えることができます。

const修飾子の扱い

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

C11で追加されたライブラリ

C++11および14の標準ライブラリはC99をベースにしています。しかし、C11では新たにいくつかのライブラリが追加されています。具体的には、次のヘッダとそこで宣言・定義される関数、型、マクロです。

  • <stdalign.h>
  • <stdatomic.h>
  • <stdnoreturn.h>
  • <threads.h>
  • <uchar.h>
  • <tgmath.h>

C11では、C++11とほぼ同じ機能を、別のヘッダ、別の関数を使って実現しているものが多数あります。_Atomic修飾子やthrd_create関数などがそれにあたります。

また、Annexですが、接尾辞_sが付いた関数が多数追加されています。Visual C++でも_s付きの関数が追加されていて、C11で追加された関数と同名のものも多数あるのですが、微妙に仕様が異なるので要注意です。


↑ モダンC++プログラマーのためのC11入門