Mesoscopic Programming

タコさんプログラミング専門

Programming Tips #15 名前なし構造体って?

私はいま驚いた。
メッセージコールバック関数で WM_COMMAND が来たとき、wParam をそれぞれ LOWORD() と HIWORD() で id と code とに分ける処理を省けないものかと思案していた。
wParam を共用体のメンバとし、同時に WORD サイズの id と code を並べた構造体を共用体のメンバとして定義すれば良いことは分かっているが、その場合、構造体に名前を与えなければならないのはいささか苦痛である。
もし構造体が共用体のように名前なしで使えたら素敵やん?と妄想しつつ実装してみた。
まさかとは思ったがコンパイルが通ってしまった。
これはコンパイラのバグだろうと疑心暗鬼にかられながらデバッグしてみたところ正常に機能していた。
ぐーぐる先生に訊ねたところ、これはどうやらマイクロソフト固有仕様だったらしい。
あらためてストラウストラップ先生の教科書を読みなおしたが名前なしで使えるのは共用体だけだった。

class Window
{
    HWND hwnd;
    UINT umsg;

    union
    {
        WPARAM      wparam;
        HWND        hchild;

        struct
        {
            USHORT  id;
            USHORT  code;
        };
    };

    union
    {
        LPARAM           lparam;
        HWND             hctrl;
        LPMINMAXINFO     lpminmaxinfo;
        LPNMHDR          lpnmhdr;
        LPNMKEY          lpnmkey;
        LPNMMOUSE        lpnmmouse;
        LPNMTTDISPINFO   lpnmttdi;
        LPNMTREEVIEW     lpnmtv;
        LPNMTVDISPINFO   lpnmtvdi;
        LPNMTVGETINFOTIP lpnmtvgit;
    };
};

マイクロソフトCではこのようなコードがエラーなくコンパイル可能である。

以上。