CRect
ヘッダー ファイルでオブジェクトの配列を定義したいと考えています。したがって、これは次のようになります。
#pragma once
#include<atltypes.h>
CRect blockPos[3] = { CRect(0,0,55,43), CRect(0,0,55,43), CRect(0,0,55,43), };
CRect
ヘッダー ファイルでオブジェクトの配列を定義したいと考えています。したがって、これは次のようになります。
#pragma once
#include<atltypes.h>
CRect blockPos[3] = { CRect(0,0,55,43), CRect(0,0,55,43), CRect(0,0,55,43), };
const
配列が一定であることを意図している場合は、ヘッダーで配列を宣言するだけです。
CRect const blockPos[3] = { CRect(0,0,55,43), CRect(0,0,55,43), CRect(0,0,55,43), };
これは、ヘッダーを含む各翻訳単位が独自のコピーを生成することを意味します。配列が非常に大きい場合、これは理想的ではない可能性があります。
一定でない場合、または複数のコピーを避けたい場合は、プログラム全体に対して単一の定義と、ヘッダーでの宣言のみが必要になります。
// header
extern CRect blockPos[3];
// some source file
CRect blockPos[3] = { CRect(0,0,55,43), CRect(0,0,55,43), CRect(0,0,55,43), };
この場合、静的初期化順序 fiascoに注意してください。これが他の翻訳単位のグローバル変数に対していつ初期化されるかは指定されていないため、別のグローバル変数のコンストラクターがそれにアクセスしようとすると、プログラムの動作が未定義になる可能性があります。一般に、グローバル変数には危険が伴うため、細心の注意を払って使用してください。
ヘッダー ファイルをインクルードするサイトで複数回定義されるため、ヘッダー ファイルで変数を定義しないでください。代わりにアクセサー メソッドを使用する必要があります。
ヘッダーファイル
#pragma once
CRect* GetRectArray();
C++ ファイル
#include "MyHeader.h"
namespace
{
CRect blockPos[3] = { CRect(0,0,55,43), CRect(0,0,55,43), CRect(0,0,55,43), };
}
CRect* GetRectArray()
{
return blockPos;
}