やはり警告はきちんと読まなくてはいけない。

忘れないうちにメモしとこう…。

えーと、例えばこういうソース (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;
}

これを MinGWgcc-4.3.0 でコンパイルして実行すると、こんな感じ:
t.c:9: warning: declaration does not declare anything そして bar=2
gcc が警告した通り、Flatten の中の MixedIn は「ないもの」扱い。警告だけしか出ないのが逆に憎さ100倍な感じ。個人的希望として、これはむしろエラーにしてほしい状況。

ちなみに OpenWatcom 1.8 のバヤイ:
bar=0
こっちは効い(ちゃっ)てるみたい。

C の規格と照らし合わせて、どっちが正しいんだろう。まあどっちも正しいのかもしれないんですが…(しかし、g++ でもやはりダメだったのはちょっと悲しい)。

(追記) Borland C++ 5.5.1 では bar=0、LSIC 3.30c 試食版では Flatten 内の MixedIn 定義部分でエラーが出た。VC++インスコしてないので試してない。