MinGW – wxWidgets – DELCEAR_EVENT_TYPE

LastUpdate 2005.09.19 Yoshiaki Ueda
[目次へ戻る]


■イベントタイプの値はDECLEAR_EVENT_TYPE(..., -1)で処理系に任せても大丈夫


 DECLEAR_EVENT_TYPE(..., -1)で、イベントタイプ(イベントのID)の値を処理系に任せられる。
 しかし、ソースファイルごとに(ヘッダーをインクルードする順序によって)宣言する順序が変わってしまえば、その値の一貫性は保たれるのだろうか?

 (結論)大丈夫である。

 なんだ、イベントタイプの宣言と定義は、DECLEAR_EVENT_TYPE( )<=宣言>だけではなく、DEFINE_EVENT_TYPE( )<=定義>とに分かれている。
 DECLEAR_EVENT_TYPE( )で値が決まるわけではなく、DEFINE_EVENT_TYPE( )で値が決まる。
 DECLEAR_EVENT_TYPE( )をヘッダに記述しておいて、DEFINE_EVENT_TYPE( )をどこかのソースファイルに一回だけ記述しておけば大丈夫である。
 C言語ではごくあたりまえのことであった。下記はintの変数の場合との対応である。

宣言 DECLEAR_EVENT_TYPE( ) extern int i;
定義 DEFINE_EVENT_TYPE( ) int i;

●実験


 下記の如く実験しても、「EVT_TYPE_A」と「EVT_TYPE_B」は同じ値を表示する。

//    File1.cpp

DECLARE_EVENT_TYPE(EVT_TYPE_A, -1)
DECLARE_EVENT_TYPE(EVT_TYPE_B, -1)

DEFINE_EVENT_TYPE(EVT_TYPE_B)
DEFINE_EVENT_TYPE(EVT_TYPE_A)

void Message2(void);

class MyApp : public wxApp
{
    bool OnInit()
    {
        wxMessageBox(
            wxString::Format(
                wxT("EvtTypeTest File1\n\tEVT_TYPE_A=%d\n\tEVT_TYPE_B=%d"),
                EVT_TYPE_A,
                EVT_TYPE_B
            )
        );
        Message2();
        return false;
    };
};

IMPLEMENT_APP(MyApp)
//    File2.cpp

DECLARE_EVENT_TYPE(EVT_TYPE_B, -1)    //File1とは順序を変えてある
DECLARE_EVENT_TYPE(EVT_TYPE_A, -1)

//DEFINE_EVENT_TYPE(EVT_TYPE_A)    これをここに書くとエラーになる
//DEFINE_EVENT_TYPE(EVT_TYPE_B)

void Message2(void)
{
    wxMessageBox(
        wxString::Format(
            wxT("EvtTypeTest File2\n\tEVT_TYPE_A=%d\n\tEVT_TYPE_B=%d"),
            EVT_TYPE_A,
            EVT_TYPE_B
        )
    );
}