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++03規格では、C95規格のC標準ライブラリが使えます。

C++11

C++11規格では、C99規格のC標準ライブラリが使えます。

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 といった具合です。

これらの新しいヘッダには、元となったC言語版のヘッダと同じ定義が含まれています。 違いは、std名前空間で囲まれていることです。
名前空間についての詳細は、【言語解説】第3章を参照して頂くとして、 実用的には、先ほどのプログラム例のように、printf関数、puts関数の呼び出し時に「std::」という記述が必要になるという違いが生まれます。

単に不便になっただけに見えるでしょうが、この名前空間という仕組みは重要な機能です。 printf が std::printf になったのは、「Aさん」という人間を「X町のAさん」のように特定したことと同じ意味です。 これによって、同じ「Aさん」でも「Y町のAさん」とは違う人間だと分かる訳です。
この機能を使えば、同名の関数でも、別の名前空間に入れることで明確に区別できるようになります。

参考までに、cstdio と stdio.h の実装例を示すと、次のようになります。

// cstdio
namespace std {
	int printf(const char*, ...);
}
// stdio.h
#include <cstdio>
using namespace std;
VisualC++ の場合

C++ の規格上は、cstdio の printf関数は std名前空間に含まれ、stdio.h の printf関数は std名前空間に含まれず裸の状態であるはずです。 ところが、VisualC++ はこれに従っておらず、cstdio を使っていても、「std::」の修飾なしで printf関数等を使用できてしまいます。

#include <cstdio>

int main()
{
	printf("Hello, C++\n");  // C++規格上、std:: の修飾が必要なはずだが…
	puts("Hello, C++");      // C++規格上、std:: の修飾が必要なはずだが…
}

実行結果:

Hello, C++
Hello, C++

本来、これはコンパイルできないはずですが、Visual C++ では問題なく通ってしまいます。

std:: を付けても大丈夫なので、本来の規格に合わせて、付けるようにした方が良いでしょう。

clang の場合

clang 3.7 の場合も、VisualC++ と同様、cstdio を使っていても、std:: の修飾無しでコンパイルできてしまいます。


練習問題

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

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

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

	puts(str);
	
	return 0;
}


解答ページはこちら

参考リンク

更新履歴

'2016/10/15 clang の対応バージョンを 3.7 に更新。

'2015/10/12 clang の対応バージョンを 3.4 に更新。

'2015/9/5 VisualC++ 2012 の対応終了。

'2014/10/18 clang 3.2 に対応。

'2014/2/1 VisualC++ 2013 に対応。

'2014/1/14 VisualC++2008 の対応終了。

'2014/1/13 clang 3.0 に対応。

'2013/2/11 新規作成。



前の章へ

次の章へ

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

Programming Place Plus のトップページへ