A pesar de que es una implementación típica de offsetof
, no es un mandato de la norma, que se limita a decir:
los siguientes tipos y macros se definen en el encabezado estándar <stddef.h>
[...]
offsetof(
type
,
member-designator
)
que se expande a una expresión constante entera que tiene el tipo size_t
, el valor de que es el desplazamiento en bytes, el elemento de estructura (designado por member-designator
), desde el comienzo de su estructura (designados por type
). El tipo y el miembro de designador deberá ser tal que, dada
static
type
t;
entonces la expresión &(t.
member-designator
)
evalúa a una constante de dirección. (Si el miembro especificado no es un campo de bits, el comportamiento no está definido.)
Leer PJ Plauger de "La biblioteca estándar de C" para una discusión de la misma y los otros artículos en <stddef.h>
que son todas las funciones de la línea fronteriza que podría (¿debería?) estar en el lenguaje adecuado y que podría requerir un soporte especial para el compilador.
Es de interés histórico solamente, pero utilicé un compilador ANSI C temprano en 386/IX (véase, ya le dije de interés histórico, alrededor de 1990) que se estrelló en esa versión de offsetof
pero funcionó cuando lo revisé a:
#define offsetof(st, m) ((size_t)((char *)&((st *)(1024))->m - (char *)1024))
Eso fue un error del compilador de clases, entre otras cosas porque la cabecera se distribuyó con el compilador y no funcionaba.
¿Es esta la primera pregunta que he visto en SO quejándose del código que funciona? :-) – paxdiablo
Hubo ese tipo con if (0) {asm (nop)} donde dejarlo fuera hizo que algo fallara ... – RBerteig
ANSI C (en realidad ISO C) no especifica esta definición para 'offsetof'. Simplemente especifica cómo debe comportarse. La definición real corresponde a cada implementación y puede variar una implementación a otra. –