Modern C++編【標準ライブラリ】 第1章 C標準ライブラリ

先頭へ戻る

この章の概要

この章の概要です。


C標準ライブラリ

第0章で触れたように、C++ の標準ライブラリには、C言語の標準ライブラリも含まれています。ですから、C言語のときと同じように使えます。

#include <stdio.h>

int main()
{
	printf("Hello, C++\n");
	puts("Hello, C++");
}

実行結果:

Hello, C++
Hello, C++

C++11/14規格では、C99規格に相当するC標準ライブラリが使えます。 C言語の標準ライブラリについては、 「C言語編 標準ライブラリのリファレンス」を参照して下さい。

C++17 (C標準ライブラリ)

C++17規格では、一部例外もありますが、C11規格に相当するC標準ライブラリが使えます。

C++ の標準ヘッダ

先ほどのように、C標準ライブラリを、C言語とまったく同じように使うことはできますが、 C++ では、もう少し違った方法で使うのが一般的です。 冒頭の例を書き換えると、次のようになります。

#include <cstdio>

int main()
{
	std::printf("Hello, C++\n");
	std::puts("Hello, C++");
}

実行結果:

Hello, C++
Hello, C++

C++ では、C標準ライブラリのヘッダ名(<stdio.h> など) の先頭に C を付け、拡張子の .h を取った名前の標準ヘッダが定義されています。<stdio.h> なら <cstdio> に、<string.h> なら <cstring> といった具合です。両者に含まれている機能自体は同じですが、名前空間に関して違いがあります。

名前空間に関する詳細は、【言語解説】第4章で解説しているので、そちらを参照して頂きたいのですが、実用上の違いとして、A という名前空間に囲まれている名前を使う際には、「A::」のような修飾が必要になります。標準ライブラリの場合、std という名前空間に囲まれているので、「std::」という修飾が必要になります。

「std::」の修飾が必要という表現は、using を使うことで省くことができるので、正確ではありませんが、ここではこの表現で通しています。詳細は、【言語解説】第4章で解説しています。

<cstdio> のような、C++ 形式の名前の標準ヘッダは、そこに含まれている名前が std名前空間で囲まれています。また、C言語のときと同じように「std::」の修飾無しでも使えるようになっているかもしれません。

一方、<stdio.h> のような、C言語形式の名前の標準ヘッダは、「std::」の修飾無しで使えるように提供されています。ただし、「std::」の修飾を行っても使えるようになっているかもしれません。

つまりどちらのヘッダも、一方の使い方は"確実"に行え、他方の使い方は"できるかも"知れない、ということになります。まとめると、次のようになります。

ヘッダ名 「std::」の修飾ありでの使用 「std::」の修飾なしでの使用
C言語形式 (stdio.h など) できるかも知れない 必ずできる
C++形式 (cstdio など) 必ずできる できるかも知れない

C++形式の名前のヘッダを使った場合、VisualStudio、clang ともに、「std::」の修飾はあっても無くても良いですが、修飾しておいた方が良いでしょう。


練習問題

問題① 次のC言語プログラムを、C++ で追加されたヘッダを使う形に書き換えて下さい。

#include <stdio.h>
#include <string.h>

int main(void)
{
	char str[] = "abcde\n";
	size_t len = strlen(str);
	
	str[len - 1] = '\0';

	puts(str);
	
	return 0;
}


解答ページはこちら

参考リンク



更新履歴

'2018/4/2 「VisualC++」という表現を「VisualStudio」に統一。

'2018/1/5 Xcode 8.3.3 を clang 5.0.0 に置き換え。

'2017/7/30 clang 3.7 (Xcode 7.3) を、Xcode 8.3.3 に置き換え。

'2017/7/3 新規作成。



前の章へ(第0章 はじめに)

次の章へ(第2章 ムーブに関するユーティリティ)

Modern C++編のトップページへ

Programming Place Plus のトップページへ


はてなブックマーク Pocket に保存 Twitter でツイート Twitter をフォロー
Facebook でシェア Google+ で共有 LINE で送る rss1.0 取得ボタン RSS
管理者情報 プライバシーポリシー