Namespaces
Variants

offsetof

From cppreference.net
< c ‎ | types
Definido en el encabezado <stddef.h>
#define offsetof(type, member) /*implementation-defined*/

La macro offsetof se expande a una expresión constante entera de tipo size_t , cuyo valor es el desplazamiento, en bytes, desde el comienzo de un objeto del tipo especificado hasta su subobjeto especificado, incluyendo el relleno si lo hay.

Dado un objeto o de tipo type con duración de almacenamiento estático, & ( o. member ) será una expresión constante de dirección y apuntará a un subobjeto de o . De lo contrario, el comportamiento es indefinido.

Si el nombre del tipo especificado en type contiene una coma que no está entre paréntesis coincidentes, el comportamiento es indefinido.

(since C23)

Contenidos

Notas

Si offsetof se aplica a un miembro de campo de bits, el comportamiento es indefinido, porque no se puede tomar la dirección de un campo de bits.

member no se limita a un miembro directo. Puede denotar un subobjeto de un miembro dado, como un elemento de un miembro de tipo array.

Aunque en C23 se especifica que especificar un nuevo tipo que contenga una coma sin paréntesis en offsetof es comportamiento indefinido, dicho uso generalmente no está soportado incluso en modos anteriores: offsetof ( struct Foo { int a, b ; } , a ) generalmente falla al compilar.

typeof se puede utilizar para evitar el efecto negativo de las comas en la definición de un nuevo tipo, por ejemplo, offsetof ( typeof ( struct { int i, j ; } ) , i ) está bien definido.

(desde C23)

Ejemplo

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

Salida posible:

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

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C publicados anteriormente.

DR Se aplica a Comportamiento publicado Comportamiento correcto
DR 496 C89 solo se mencionaban structs y miembros de struct unions y otros subobjetos también están soportados

Véase también

tipo entero sin signo devuelto por el sizeof operador
(typedef)