offsetof
|
Определено в заголовочном файле
<stddef.h>
|
||
|
#define offsetof(type, member) /*implementation-defined*/
|
||
Макрос offsetof раскрывается в целочисленное константное выражение типа size_t , значение которого представляет собой смещение в байтах от начала объекта указанного типа до его указанного подобъекта, включая выравнивание, если оно присутствует.
Для объекта
o
типа
type
со статической продолжительностью хранения,
&
(
o.
member
)
должно быть константным выражением-адресом и указывать на подобъект
o
. В противном случае поведение не определено.
|
Если имя типа, указанное в
|
(since C23) |
Содержание |
Примечания
Если
offsetof
применяется к битовому полю, поведение не определено, поскольку адрес битового поля не может быть получен.
member
не ограничивается прямым членом. Он может обозначать подобъект заданного члена, такой как элемент массива-члена.
Хотя в стандарте C23 указано, что использование нового типа, содержащего неподобную запятую в
offsetof
является неопределённым поведением, такое использование обычно не поддерживается даже в более ранних режимах:
offsetof
(
struct
Foo
{
int
a, b
;
}
, a
)
обычно не компилируется.
|
typeof может использоваться для избежания негативного эффекта запятых в определении нового типа, например, offsetof ( typeof ( struct { int i, j ; } ) , i ) является корректно определённым. |
(начиная с C23) |
Пример
Возможный вывод:
the first element is at offset 0 the double is at offset 8
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| DR 496 | C89 | упоминались только структуры и члены структур | объединения и другие подобъекты также поддерживаются |
Смотрите также
|
беззнаковый целочисленный тип, возвращаемый оператором
sizeof
(typedef) |
|
|
C++ documentation
для
offsetof
|
|