C++編【標準ライブラリ】 第1章 C標準ライブラリの扱い

先頭へ戻る

この章と同じ(または似た)情報を扱うページが、Modern C++編 (C++11/14/17 対応) の以下の章にあります。

この章の概要

この章の概要です。


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言語の標準ライブラリについては、「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::」という記述が必要になるという違いが生まれます。ただし、この指定がなくてもよいコンパイラもあり得ます(VisualStudio、clang はいずれも、この記述がなくてもコンパイルできます)。

単に不便になるだけのように思えるかもしれませんが、この名前空間という仕組みは重要な機能です。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;


練習問題

問題① 次の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;
}


解答ページはこちら

参考リンク



更新履歴

'2018/4/5 VisualStudio 2013 の対応終了。

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

'2018/1/5 stdio.h、cstdio を使った VisualC++ と Xcode での例示を削除。

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

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

≪さらに古い更新履歴を展開する≫



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

次の章へ (第2章 string)

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

Programming Place Plus のトップページへ


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