0

CRectヘッダー ファイルでオブジェクトの配列を定義したいと考えています。したがって、これは次のようになります。

  #pragma once
  #include<atltypes.h>

  CRect blockPos[3] = { CRect(0,0,55,43),  CRect(0,0,55,43), CRect(0,0,55,43), };
4

2 に答える 2

1

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に注意してください。これが他の翻訳単位のグローバル変数に対していつ初期化されるかは指定されていないため、別のグローバル変数のコンストラクターがそれにアクセスしようとすると、プログラムの動作が未定義になる可能性があります。一般に、グローバル変数には危険が伴うため、細心の注意を払って使用してください。

于 2012-09-03T14:51:50.403 に答える
0

ヘッダー ファイルをインクルードするサイトで複数回定義されるため、ヘッダー ファイルで変数を定義しないでください。代わりにアクセサー メソッドを使用する必要があります。

ヘッダーファイル

#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;
}
于 2012-09-03T11:46:06.643 に答える