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ではこのようなコードがエラーなくコンパイル可能である。
以上。