Was ist falsch an dieser Verwendung von offsetof?

Ich bin kompilieren von c++ - code in MinGW-GCC 4.4.0, und erste Warnungen der folgenden form...

warning: invalid access to non-static data member '<membername>'  of NULL object
warning: (perhaps the 'offsetof' macro was used incorrectly)

Dieses problem scheint vertraut - etwas, was ich versucht habe zu beheben, bevor Sie und fehlgeschlagen sind, denke ich, aber vor einer Weile. Der code baut fein in Visual C++, aber das habe ich noch nicht gebaut, diesen bestimmten code vor kurzem in andere compiler.

Den problem-code ist die folgende Vorlage...

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

Offensichtlich kann ich das wohl verwenden einige der bedingten Kompilierung verwenden compiler-spezifische Funktionen für diese, und ich glaube, dass C++0x wird (endlich) überflüssig machen. Aber in jedem Fall, ich kann nicht sehen, nichts falsch mit dieser Nutzung offsetof.

Sehr pedantisch, es ist möglich, dass, weil die T parameter-Typen werden manchmal nicht-POD, so GCC-Klassen c_Test als nicht-POD und beschwert (und klagt und klagt - ich bin immer fast 800 Zeilen dieser Warnungen).

Das ist frech von der strikten Wortlaut der Norm, da die nicht-POD-Typen können in der Pause offsetof. Jedoch, diese Art von nicht-POD kein problem sein sollte, in der Praxis - c_Test nicht haben, um eine virtuelle Tabelle, und kein run-time-Tricks finden musste, der offset m_Test.

Außerdem, selbst wenn c_Test hatte eine virtuelle Tabelle, GCC implementiert das offsetof-makro mit einer intrinsischen, das wird immer ausgewertet, zur compile-Zeit basierend auf dem statischen layout von einem bestimmten Typ. Bereitstellung einer tool dann jammern (sorry, Warnung) es ist jedes mal verwendet, scheint einfach dumm.

Auch, ich bin nicht die einzige person hier Rum, tut diese Art der Sache...

Antwort auf legit-nutzt-von-offsetof Frage

Ich tun erinnere mich, dass Sie ein Problem mit offsetof für diese Art von Grund, aber ich weiß nicht denke war das problem dieser Vorlage.

Irgendwelche Ideen?

InformationsquelleAutor der Frage Steve314 | 2010-06-28

Schreibe einen Kommentar