union: gcc と Visual C++ の違い

struct udppkt_fmt_t {
	u_char type;
#if defined(WIN32)
	union {
		struct udppkt_type_request_t upd_request;
		struct udppkt_type_data_t upd_data;
	};
#elif defined(__linux__) || defined(__FreeBSD__)
	union {
		struct udppkt_type_request_t upd_request;
		struct udppkt_type_data_t upd_data;
	} udppkt_data;
	/*
	gcc では struct udppkt_fmt_t 型の変数 s に対して、
	s.upd_request.count といったアクセスを行うことはできない。(Visual C++ では可能)
	s.udppkt_data.upd_request.count でアクセスする必要がある。

	可読性のために次の定義を追加する。
	*/
# define upd_request udppkt_data.upd_request
# define upd_data udppkt_data.upd_data
#endif
};

上記コメントのとおり。次のように書くともっと読みやすい。

struct udppkt_fmt_t {
	u_char type;
	union {
		struct udppkt_type_request_t upd_request;
		struct udppkt_type_data_t upd_data;
	} udppkt_data;
# define upd_request udppkt_data.upd_request
# define upd_data udppkt_data.upd_data
#endif
};