offsetof
Defined in header <stddef.h> |
||
|---|---|---|
#define offsetof(type, member) /*implementation-defined*/ |
Макрос offsetof расширяется до целого константного выражения типа size_t, значение которого — смещение в байтах от начала объекта заданного типа до его подобъекта, включая любые добавочные байты.
Для объекта o типа type со статическим сроком жизни &(o.member) должно быть константным выражением-адресом, указывающим на подобъект o. В противном случае поведение не определено.
|
Если имя типа, указанное в |
(с C23) |
Примечания
Если offsetof применяется к члену-битовому полю, поведение не определено, поскольку адрес битового поля получить нельзя.
member не ограничивается непосредственным членом. Он может обозначать подобъект данного члена, например, элемент массива-члена.
Хотя в C23 указано, что указание нового типа, содержащего не заключённую в скобки запятую в offsetof, является неопределённым поведением, такое использование обычно не поддерживается даже в более ранних режимах: offsetof(struct Foo { int a, b; }, a) обычно не компилируется.
|
|
(с 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++ для offsetof |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/types/offsetof