(Arg edité el mensaje que no era...)
Antes ponía que el fallo de Instru era no convertirlo a char* antes de la resta.
Con sustituir puntero_miembro con ((char*)puntero_miembro) está solucionado.
Código:
#define devuelve_estructura(puntero_miembro,nombre_estructura,nombre_miembro) (nombre_estructura *)(((char*)puntero_miembro)-(long)(&((nombre_estructura *)0)->nombre_miembro));