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++編を作成中です。
この章の概要です。
第0章で触れたように、C++ の標準ライブラリには、C言語の標準ライブラリも含まれています。ですから、C言語のときと同じように使えます。
#include <stdio.h>
int main()
{
("Hello, C++\n");
printf("Hello, C++");
puts}
実行結果:
Hello, C++
Hello, C++
C++03規格では、C95規格の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;
= strlen(str);
len [len - 1] = '\0';
str
(str);
puts
return 0;
}
VisualStudio 2013 の対応終了。
「VisualC++」という表現を「VisualStudio」に統一。
stdio.h、cstdio を使った VisualC++ と Xcode での例示を削除。
clang 3.7 (Xcode 7.3) を、Xcode 8.3.3 に置き換え。
clang の対応バージョンを 3.7 に更新。
≪さらに古い更新履歴を展開する≫
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |