Spec-Zone.ru › C

offsetof

Defined in header <stddef.h>
#define offsetof(type, member) /*implementation-defined*/

Макрос offsetof расширяется до целого константного выражения типа size_t, значение которого — смещение в байтах от начала объекта заданного типа до его подобъекта, включая любые добавочные байты.

Для объекта o типа type со статическим сроком жизни &(o.member) должно быть константным выражением-адресом, указывающим на подобъект o. В противном случае поведение не определено.

Если имя типа, указанное в type, содержит запятую не между соответствующими скобками, поведение не определено.

(с C23)

Примечания

Если offsetof применяется к члену-битовому полю, поведение не определено, поскольку адрес битового поля получить нельзя.

member не ограничивается непосредственным членом. Он может обозначать подобъект данного члена, например, элемент массива-члена.

Хотя в C23 указано, что указание нового типа, содержащего не заключённую в скобки запятую в offsetof, является неопределённым поведением, такое использование обычно не поддерживается даже в более ранних режимах: offsetof(struct Foo { int a, b; }, a) обычно не компилируется.

typeof может использоваться для предотвращения нежелательных последствий запятых в определении нового типа, например, offsetof(typeof(struct { int i, j; }), i) определён корректно.

(с C23)

Пример

#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));
}

Возможный вывод:

the first element is at offset 0
the double is at offset 8

Отчёты о дефектах

Следующие отчёты о дефектах, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C.

DR Применено к Поведение, как опубликовано Корректное поведение
DR 496 C89 упоминались только структуры и члены структур также поддерживаются объединения и другие подобъекты

См. также

size_t
беззнаковый целочисленный тип, возвращаемый оператором sizeof
(typedef)
Документация C++ для offsetof

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/types/offsetof

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API