Namespaces
Variants

offsetof

From cppreference.net
< c ‎ | types
Определено в заголовочном файле <stddef.h>
#define offsetof(type, member) /*implementation-defined*/

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

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

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

(since 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 упоминались только структуры и члены структур объединения и другие подобъекты также поддерживаются

Смотрите также

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