MinGW GCC 4.4.0 でいくつかの c++ コードをコンパイルしていますが、次の形式で警告が表示されます...
warning: invalid access to non-static data member '<membername>' of NULL object
warning: (perhaps the 'offsetof' macro was used incorrectly)
この問題はおなじみのようです。以前に解決しようとして失敗したものだと思いますが、少し前です。このコードは Visual C++ で問題なくビルドできますが、この特定のコードを他のコンパイラで最近ビルドしたことはありません。
問題のコードは次のテンプレートです...
template<typename T>
class c_Align_Of
{
private:
struct c_Test
{
char m_Char;
T m_Test;
};
public:
enum { e_Align = offsetof (c_Test, m_Test) };
};
明らかに、条件付きコンパイルを使用して、これにコンパイラ固有の関数を使用できます。また、C++0x によって (最終的に) 冗長になると思います。しかし、いずれにせよ、この の使用に問題は見当たりませんoffsetof
。
非常に衒学的なことですが、T
パラメーターの型が非 POD である場合があるため、GCC クラスc_Test
が非 POD であり、不平を言う可能性があります (そして、不平を言い、不平を言う - 私はこれらの警告を 800 行近く受け取っています)。
非 POD 型は壊れる可能性があるため、これは標準の厳密な表現では不適切offsetof
です。ただし、この種の非 POD は実際には問題にならないはずですc_Test
。仮想テーブルはなく、 のオフセットを見つけるために実行時の策略は必要ありませんm_Test
。
さらに、c_Test
仮想テーブルがあったとしても、GCC は、その特定の型の静的レイアウトに基づいてコンパイル時に常に評価される組み込み関数を使用して、offsetof マクロを実装します。ツールを提供し、それが使用されるたびに泣き言を言うのはばかげているように思えます。
また、このようなことをするのは私だけではありません...
このような理由で に問題があったことは覚えていますが、問題はこのテンプレートではなかったと思います。offsetof
何か案は?