man kann es aufrufen??
-
Tobias Gerg schrieb:
Dass offsetof Makro macht doch genau dass selbe...
Nur es ist
- nicht im ANSI/ISO sondern "nur" POSIX Standard definiert
und - nicht definiert wie offsetof implementiert werden muss
.
Wenn zB bei p->f() f eine virtuelle Funktion ist, dann wuerde der Aufruf garantiert crashen da auf die vtable zugegriffen werden wuerde (die ein null pointer ja nicht hat).
Weiters koennte der Aufruf ja auch etwaige invarianten ueberpruefen, was wieder zugriff auf objektspezifische Daten verlangen wuerde und wir haetten wieder einen absturz.
deshalb ist es schon gut so, dass es undefiniert ist.
wenn man weiss was man tut und die plattform kennt, kann man das fuer so sachen wie eben ein offsetof makro ausnutzen - aber prinzipiell ist es eben undefiniert.
- nicht im ANSI/ISO sondern "nur" POSIX Standard definiert
-
Wie
offsetofimplementiert wird, ist nicht definiert. Wie es aussieht, ist er so in der MSVC Library umgesetzt, wobei allerdings dort schlussendlich kein Zugriff auf den Member erfolgt, sondern nur die Adresse geholt wird:#ifdef _WIN64 #define offsetof(s,m) (size_t)( (ptrdiff_t)&reinterpret_cast<const volatile char&>((((s *)0)->m)) ) #else #define offsetof(s,m) (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m)) #endifEs sieht also so aus, als wenn der MSVC dazu in der Lage ist, bzw. dadurch, dass nur die Adresse geholt wird, den Rest wohl wegoptimiert. Das heisst aber nicht, dass es dem Standard entsprechender und gültiger Code ist.
In der nicht definierten Implementation nutzen die Kompiler oft ihre Eigenschaften aus, um etwas zu realisieren, verbessern oder vereinfachen.Die Implementation vom TDM GCC sieht übrigens so aus:
#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)Grüssli