Namespaces
Variants

offsetof

From cppreference.net
< c ‎ | types
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 type contient une virgule non située entre des parenthèses correspondantes, le comportement est indéfini.

(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

#include <stdio.h>
#include <stddef.h>
struct S {
    char c;
    double d;
};
int main(void)
{
    printf("the first element is at offset %zu\n", offsetof(struct S, c));
    printf("the double is at offset %zu\n", offsetof(struct S, d));
}

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