g++でoffsetofを使うと警告

出典
NAKAMURA Minoru の日記 -- g++ で offsetof が警告に


メンバ変数のオフセットを取得するマクロを使うとinvalid access to non-static data member とかいう警告がでます。
コンストラクタのあるクラスや構造体ででるっぽいです。
stddef.hのoffsetofマクロだけじゃなくオフセット求めるコードを書けば警告がでます。

引用
http://www.jp.freebsd.org/cgi/mroff.cgi?sect=1&cmd=&lc=1&subdir=man&dir=jpman-6.2.2%2Fman&subdir=man&man=cc

-Wno-invalid-offsetof (C++ only)
POD でないタイプに offsetof マクロを適用して警告を抑制します。1998
ISO C++ 標準によると、offsetof を POD でないタイプに適用することは
未定義です。しかしながら、既存の C++ 実装では、ある種類の POD でな
いタイプに適用されるとき、通常 offsetof は重要な結果を与えます。(コ
ンストラクタを持っているという理由だけで POD タイプとなることに失敗
する単純な struct などです。) このフラグは、移植性がないコードを書
いていることを承知していて、それに関する警告を無視するために故意に
選んだ、ユーザのためのものです。

offsetof での制限は、C++ 標準の将来のバージョンで緩和されるかもしれ
ません。

  • Wno-invalid-offsetofオプションを使うと抑制できます。