offsetof
|
Definiert im Header
<stddef.h>
|
||
|
#define offsetof(type, member) /*implementation-defined*/
|
||
Das Makro offsetof expandiert zu einem Integer-Konstantenausdruck vom Typ size_t , dessen Wert das Offset in Bytes vom Anfang eines Objekts des angegebenen Typs zu seinem angegebenen Unterobjekt ist, einschließlich eventueller Auffüllbytes.
Gegeben ein Objekt
o
vom Typ
type
mit statischer Speicherdauer,
&
(
o.
member
)
muss ein Adresskonstantenausdruck sein und auf ein Unterobjekt von
o
zeigen. Andernfalls ist das Verhalten undefiniert.
|
Wenn der in
|
(since C23) |
Inhaltsverzeichnis |
Hinweise
Wenn
offsetof
auf ein Bitfeld-Member angewendet wird, ist das Verhalten undefiniert, da die Adresse eines Bitfelds nicht genommen werden kann.
member
ist nicht auf ein direktes Mitglied beschränkt. Es kann ein Unterobjekt eines bestimmten Mitglieds bezeichnen, wie beispielsweise ein Element eines Array-Mitglieds.
Obwohl in C23 spezifiziert ist, dass die Angabe eines neuen Typs mit einem nicht eingeklammerten Komma in
offsetof
undefiniertes Verhalten darstellt, wird eine solche Verwendung generell selbst in früheren Modi nicht unterstützt:
offsetof
(
struct
Foo
{
int
a, b
;
}
, a
)
führt generell zu einem Kompilierungsfehler.
|
typeof kann verwendet werden, um die negativen Auswirkungen von Kommas in der Definition eines neuen Typs zu vermeiden, z.B. offsetof ( typeof ( struct { int i, j ; } ) , i ) ist wohldefiniert. |
(seit C23) |
Beispiel
Mögliche Ausgabe:
the first element is at offset 0 the double is at offset 8
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| DR 496 | C89 | nur Structs und Struct-Member wurden erwähnt | Unions und andere Subobjekte werden ebenfalls unterstützt |
Siehe auch
|
Vorzeichenloser Ganzzahltyp, zurückgegeben durch den
sizeof
Operator
(typedef) |
|
|
C++-Dokumentation
für
offsetof
|
|