Bien que ce est typique de mise en œuvre de l' offsetof
, il n'est pas exigé par la norme, qui dit tout simplement:
Les types suivants et les macros sont définies dans la norme en-tête <stddef.h>
[...]
offsetof(type, member-designator)
qui se développe à une constante entière expression de type size_t, la valeur de
qui est le décalage en octets, pour le membre de structure (désigné par les états-indicateur),
depuis le début de sa structure (désigné par type). Le type et membre de désignation
doit être telle que, compte tenu de
static type t;
ensuite, l'expression &(t.membre-indicateur) évalue à une adresse constante. (Si le
membre spécifié est un peu sur le terrain, le comportement est indéfini.)
Lire P J Plauger "de La Bibliothèque Standard C" pour une discussion à ce sujet et d'autres articles en <stddef.h>
qui sont toutes les fonctionnalités de ligne qui pourrait (devrait?) être dans la langue appropriée, et qui peut nécessiter la prise en charge du compilateur.
C'est de l'historique, de l'intérêt seulement, mais j'ai utilisé un début de compilateur C ANSI sur 386/IX (voyez, je vous l'ai dit un intérêt historique, circa 1990) qui s'est écrasé sur cette version de l' offsetof
, mais il a travaillé quand j'ai révisé à:
#define offsetof(st, m) ((size_t)((char *)&((st *)(1024))->m - (char *)1024))
C'était un bug du compilateur de toutes sortes, pas moins parce que l'en-tête a été distribué avec le compilateur et n'a pas de travail.