C++マニアック

Hello world!,namespace,header

ページの末尾へ   トップページ > 最初のプログラム

TOPIC  節電しましょう。電力の使用状況グラフ(東電)

最初のプログラム

ここでは、次の項目について解説します。

  1. 手始めは、やはり、Hello world!
  2. <stdio.h> ではなく <cstdio> を使う
  3. ネームスペース(名前空間)std
  4. VC++ の場合
  5. cout ではなく printf を使った理由
  6. C 言語由来のヘッダ
  7. C++ 処理系関連

手始めは、やはり、Hello world! ページの先頭へ

最初のプログラムは、Hello world! という文字列を印字せよ、という課題の答えです。これは、コンパイラのインストールのところで既に出てきたものと同じです。しかし、これだけでも、少し語るべきことがあります。

#include <cstdio>
using namespace std;

int main() {
    printf("Hello world!\n");
    return 0;
}

サンプルプログラムをダウンロード

<cstdio>の部分は、<stdio.h>に書き換えてもこのプログラムはちゃんと動作します。あなたが C 言語になれているのであれば stdio.h を良く知っていると思います。しかし、ここには先頭に c をつけて後尾に .h をつけない <cstdio> を使用するのが C++ では正しいといえます。C++ はほぼ C 言語互換性を持っているので、stdio.h を使っても問題なく動作するのですが、C 言語で使っていたヘッダファイルを C++ で使う場合には先頭に c をつけて、後尾の .h を省いたヘッダファイル名を使用するのが常識です。その違いは、名前空間です。using namespace std; と次の行に書かれていることに注目してください。

VC++ をお使いの場合、すぐに実験しないでください、そのわけは後述します。

上記は、システムで用意されているヘッダについてであり、あなたが作成するヘッダの名前を c ではじめる必要はまったくありません。念のため。

ネームスペース(名前空間) std ページの先頭へ

C++ と同時に供給される標準ライブラリは全て std という名前のネームスペース(名前空間)内で定義されています。簡単に書けば、次のようなことになっています。

// これは、C++ ライブラリのヘッダファイル
namespace std {
    // もとの C 言語ヘッダファイルの中身、例えば、
    int printf(const char *, ...);
}

例えば、上記の printf 関数を使うには、ネームスペース名を前につけて std::printf("Hello!\n); などと書く必要があります。これは、関数名が printf ではなく std::printf になったということです。これでは、関数を使うたびにいちいち std:: をつけることになり、煩雑なので、通常は、上記のサンプルプログラムにあったように冒頭に using namespace std; と書いておきます。このようにすると、これを書いた部分以降では、システムに printf という名前の関数がみつからなければ、コンパイラが 自動的に std::printf を探してくれるようになります。

ネームスペースは自分でも作ることが出来ます。例えば、次のようになります。ここでは、green と red という名前の名前空間を作成しています。

namespace green {
    int Func() { return 0; }    // 名前空間 green の中で Func を定義し、下で使ってみる。
}
namespace red {
    int iValue = green::Func(); // 名前空間 red の中で Func を使うには、green:: をつける。
}
namespace green {
    int iValue = Func();        // 同じ名前空間 green の中ではそのまま使える。
}
int iValue = green::Func();     // 無名の名前空間では green:: をつけてアクセスする。
using namespace green;          // これを宣言しておけば、
int iValue2 = Func();           // 以降、そのまま使える。

何も、意識しないで書けば、無名の名前空間でプログラミングしていることになります。

VC++ の場合 ページの先頭へ

基本は、上記のとおりなのですが、VC++ を使って、コンソールアプリを作成する場合、VC++6 では、様々なプロジェクト形式が選択可能で、その中で、例えば選択肢の一つである「Hello World! アプリケーション」を選択すると、次のような内容のファイルが自動的に出来上がります。

#include "stdafx.h"

int main(int argc, char* argv[])
{
    printf("Hello World!\n");
    return 0;
}

<cstdio> はどうなったのかということで、調べてみると、stdafx.h の中で <stdio.h> が既にインクルードされていて、C++ 標準のやり方とは既に異なってしまっています。しかし、これに抵抗しようとするとかなり大変なことになりました。例えば、stdafx.h の中の <stdio.h> のインクルードを消して、main.cpp で <cstdio> をインクルードすることは可能ですが、この場合 using namespace std; を書くと、std という名前空間はないといわれてしまいます。なぜこうなっているのか疑問ですが、抵抗してもしかたがありませんので、ウィザードでプロジェクトを作成した場合にはそのまま使用するのが得策のようです。

「最初のプログラム」でダウンロード可能としたサンプルプログラムは、上記の作成方法ではなく、VC++6 で Test.cpp を開き、「ビルド->ビルド」でワークスペースを作成し、コンパイルできるようにしたものです。C++ の基本の理解のためには、こちらの作成方法の方が良いかもしれません。

BorlandC++5.5 は、とても素直なコンパイラのようで、上記のような問題はありませんでした。

cout ではなく printf を使った理由 ページの先頭へ

最初のプログラムとして、標準出力ストリーム cout を使って、次のように書くことも出来ますが、<iostream> は相当の説明なしには理解できないものなので、あなたが C++ 初心者であれば、最初からこれが理解できなくても全く問題ありません。

#include <iostream>
using namespace std;

int main() {
    cout << "Hello world!" << endl;
    return 0;
}

C 言語で使用できた printf などの関数群は全て C++ でも使用可能なので、ストリーム系のプログラミングテクニックを理由が分からないうちは使う必要はありません。次の項に C++ で使える C 言語由来のヘッダをリストアップしておきます。

<iostream> などの入出力ストリームは、入出力先の切り替えなどに対応するためにはとても便利ですが、初心者には無用の混乱を生じるだけのように感じます。ストリームついては、すこし先のことになると思いますが、改めて解説を行います。

C 言語由来のヘッダ ページの先頭へ

C++ で使える C 言語由来のヘッダには、次のようなものがあります。

<cassert> <cctype> <cerrno> <cfloat> <ciso646> <climits> <clocale> <cmath> <csetjmp> <csignal> <cstdarg> <cstddef> <cstdio> <cstdlib> <cstring> <ctime> <cwchar>