プログラミングの練習(Hit and Blow) #02 GameMain

ここ数日はRubyの面白さに目覚めていたので、久しぶりに書いていかにC++が面倒な言語かを思い知りました。特に関数の先行宣言。なんで同じことを2回書かなくちゃいけないのか……。その点、C++に似てるけど先行宣言を書かなくていいD言語は楽でした。でもそこがC++のかわいいところだと思って今日もがんばります。

前回書き忘れていましたが、Cの標準ライブラリをC++で使いたいときは

#include <stdio.h>
#include <stdlib.h>

ではなくて、

#include <cstdio>
#include <cstdlib>
using namespace std;

としてあげたほうがいいそうです。using namespaceしていることからもわかるとおり、後者はstd名前空間に包まれています。他の主なC標準ライブラリに対しても、頭にcを付けて最後の.hを削ったものが用意されています。ただ、なんでこうしたほうがいいのかが私には分かりません……。おそらく名前の衝突を防ぐためなのでしょうが、using namespaceしちゃったらその意味がないですよね。だからといってしないと面倒だし(よく使うのに毎回std::printfって書くのは面倒すぎる)。まあ、C++っぽくてかっこいいので、私は後者を使っています。実際は前者でも大した問題はなさそうなので好きなほうでいいと思いますが。(参考:C++マニアック,Hello world!,namespace,header

やっと本題です。前回gameMainという関数がありましたが、これは別ファイルに分けます。GameMain.hとGameMain.cppを作ります。で、以下がGameMain.cppの内容です。

#include "GameMain.h"

static void init();
static void run();
static void term();

static int x = 200;
static int y = 100;

void gameMain()
{
	init();
	run();
	term();
}

void init()
{
}

void run()
{
	DrawBox(x, y, x + 50, y + 50, 0xffffff, TRUE);
	WaitKey();	//何かキーが押されるまで待つ
}

void term()
{
}

まだ中身は空っぽです。最初の関数宣言と変数宣言の前にstaticが付いていますが、これはこれらの関数・変数はこのファイル内でしか使えないようにする指示です。実際、initとtermにstaticが無いと、AppMainの方のinitとtermと名前が衝突しているためコンパイルエラーが出ます。

注意してほしいのですが、C++ではstaticに複数の使い方がありまして、関数の外部では今回の意味になり、関数の内部では静的変数やクラスの静的関数を表すため、非常にややこしいです。というか前者はなぜstaticなんでしょうね。素直に考えればprivateの方が適切ですよね。

ただ、今Wikipediaを見たら

ただし、ファイルスコープを指定するのにstaticを用いるのはC++では推奨されず、無名名前空間を用いるべきとされている。

http://ja.wikipedia.org/wiki/%E4%BA%88%E7%B4%84%E8%AA%9E_(C%2B%2B)

と書いてありました。知りませんでした。でも面倒なのでこのままいきます。中途半端ですみませんが、今回は細かいことに悩みたくないので、新しい知識はなるべく使いたくないのです。