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 };