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

トップページC++編

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 -> C++23 と更新されています。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新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言語の標準ライブラリについては、「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::」という記述が必要になるという違いが生まれます。ただし、この指定がなくてもよいコンパイラもあり得ます(Visual Studio、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;
}


解答ページはこちら

参考リンク 🔗


更新履歴 🔗

 VisualStudio 2013 の対応終了。

 「VisualC++」という表現を「VisualStudio」に統一。

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

 clang 3.7 (Xcode 7.3) を、Xcode 8.3.3 に置き換え。

 clang の対応バージョンを 3.7 に更新。

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



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

次の章へ (第2章 string)

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

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る