offsetof
|
Défini dans l'en-tête
<stddef.h>
|
||
|
#define offsetof(type, member) /*implementation-defined*/
|
||
La macro offsetof s'étend en une expression constante entière de type size_t , dont la valeur est le décalage, en octets, depuis le début d'un objet d'un type spécifié jusqu'à son sous-objet spécifié, incluant le remplissage éventuel.
Étant donné un objet
o
de type
type
avec une durée de stockage statique,
&
(
o.
member
)
doit être une expression constante d'adresse et pointer vers un sous-objet de
o
. Sinon, le comportement est indéfini.
|
Si le nom de type spécifié dans
|
(since C23) |
Table des matières |
Notes
Si
offsetof
est appliqué à un membre champ de bits, le comportement est indéfini, car l'adresse d'un champ de bits ne peut pas être prise.
member
n'est pas limité à un membre direct. Il peut désigner un sous-objet d'un membre donné, tel qu'un élément d'un membre tableau.
Bien qu'il soit spécifié en C23 que la spécification d'un nouveau type contenant une virgule non parenthésée dans
offsetof
soit un comportement indéfini, une telle utilisation n'est généralement pas prise en charge même dans les modes antérieurs :
offsetof
(
struct
Foo
{
int
a, b
;
}
, a
)
échoue généralement à compiler.
|
typeof peut être utilisé pour éviter l'effet indésirable des virgules dans la définition d'un nouveau type, par exemple offsetof ( typeof ( struct { int i, j ; } ) , i ) est bien défini. |
(depuis C23) |
Exemple
Sortie possible :
the first element is at offset 0 the double is at offset 8
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C publiées précédemment.
| DR | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| DR 496 | C89 | seuls les structs et leurs membres étaient mentionnés | les unions et autres sous-objets sont également pris en charge |
Voir aussi
|
type entier non signé renvoyé par l'opérateur
sizeof
(typedef) |
|
|
Documentation C++
pour
offsetof
|
|