Хотя это типичная реализация offsetof
, она не обязательна стандартом, который просто говорит:
Следующие типы и макросы определены в стандартном заголовке <stddef.h>
[...]
offsetof(
type
,
member-designator
)
, который расширяется до целочисленного константного выражения, имеющего тип size_t
, значение
который является смещением в байтах к элементу структуры (обозначается member-designator
),
с начала его структуры (обозначено type
). Тип и обозначение члена
должно быть таким, что дано
static
type
t;
тогда выражение &(t.
member-designator
)
оценивается как постоянная адреса. (Если указанный член является битовым полем, поведение не определено.)
Прочтите «Стандартную библиотеку C» П. Дж. Плаугера, чтобы обсудить ее и другие элементы в <stddef.h>
, которые являются пограничными функциями, которые могут (должны?) Быть в собственном языке, и для которых может потребоваться специальный компилятор поддержка.
Это только исторический интерес, но я использовал ранний компилятор ANSI C на 386 / IX (см., Я рассказал вам об историческом интересе, около 1990 г.), который упал на этой версии offsetof
, но работал, когда я пересмотрел ее до :
#define offsetof(st, m) ((size_t)((char *)&((st *)(1024))->m - (char *)1024))
Это была ошибка компилятора, не в последнюю очередь потому, что заголовок распространялся вместе с компилятором и не работал.