やはり警告はきちんと読まなくてはいけない。
忘れないうちにメモしとこう…。
えーと、例えばこういうソース (t.c)
#include <stdio.h> #include <string.h> struct MixedIn { int foo; int bar; }; struct Flatten { struct MixedIn; int hoge; int uge; }; int get_bar(void *m) { return ((struct MixedIn *)m)->bar; } int main(int argc, char **argv) { struct Flatten f; memset(&f, 0, sizeof(f)); f.hoge = 1; f.uge = 2; printf("bar=%d\n", get_bar(&f)); /* 0 だと思っていたら… */ return 0; }
これを MinGW の gcc-4.3.0 でコンパイルして実行すると、こんな感じ:
gcc が警告した通り、Flatten の中の MixedIn は「ないもの」扱い。警告だけしか出ないのが逆に憎さ100倍な感じ。個人的希望として、これはむしろエラーにしてほしい状況。
ちなみに OpenWatcom 1.8 のバヤイ:
こっちは効い(ちゃっ)てるみたい。
C の規格と照らし合わせて、どっちが正しいんだろう。まあどっちも正しいのかもしれないんですが…(しかし、g++ でもやはりダメだったのはちょっと悲しい)。
(追記) Borland C++ 5.5.1 では bar=0、LSIC 3.30c 試食版では Flatten 内の MixedIn 定義部分でエラーが出た。VC++ はインスコしてないので試してない。