ヘッダファイルは、ある *.cpp が持っている関数や型を、他のファイルから使えるようにするために *.cpp の概要を外部へ公開する名刺のようなファイルです。
ヘッダファイルは *.cpp ファイルに対してひとつ *.h という形で作りますが、その内容として次のような情報を記述します。
*.cpp が外部に公開している型を他のファイルに教えるための記述です。 class や typedef や enum などを書くことができます。
// 構造体の定義 typedef struct { // … } SampleStructure; // クラスの定義 class SampleClass { // … } // 列挙型の定義 typedef enum { // … } SampleEnum;
*.cpp が外部に公開している関数を他のファイルに教えるための記述です。他のファイルからはこの *.h ファイルを #include することで *.cpp が提供している関数を使うことができるようになります。関数を外部に公開するためには、関数の名前・引数・戻り値を次のように記述します。
void InitializePlayer(HWND hWindow, HDC hBackBuffer); void FinalizePlayer(HWND hWindow, HDC hBackBuffer); void UpdatePlayer(HWND hWindow, HDC hBackBuffer); void DrawPlayer(HWND hWindow, HDC hBackBuffer);
同じ *.h ファイルを2回以上 #include してしまうと「同じ関数名が使われています」というようなエラーになってしまいます。これを回避するために #include ガードを記述します。
#ifndef SAMPLE_HEADER_INCLUDED__ #define SAMPLE_HEADER_INCLUDED__ // ここにヘッダファイルの中身を書きます #endif
#include ガードは任意の文字列(前述の例では SAMPLE_HEADER_INCLUDED__ )を用いて、「その文字列が初めて使われるか?」「すでに使われていないか?」を検証し、初めて使われている場合は *.h ファイルをインクルードし、すでに使われている場合は #include をスキップするようにします。これによって同じ *.h ファイルが2回以上 #include されないようになります。任意の文字列(前述の例では SAMPLE_HEADER_INCLUDED__ )は好きな文字列を指定することができますが、ファイルごとに違う文字列を指定する必要があります。また、アンダーバーで始まる名前は使用できません。
#ifndef SAMPLE_HEADER_INCLUDED__ #define SAMPLE_HEADER_INCLUDED__ // 型を定義する例 typedef struct { int x; int y; int width; int height; int life; } Player, *pPlayer; // 関数を定義する例 void InitializePlayer(HWND hWindow, HDC hBackBuffer); void FinalizePlayer(HWND hWindow, HDC hBackBuffer); void UpdatePlayer(HWND hWindow, HDC hBackBuffer); void DrawPlayer(HWND hWindow, HDC hBackBuffer); #endif
Contributions