offsetof
|
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
|
(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
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) |
|
|
Documentación de C++
para
offsetof
|
|