Cita: Claro pero a ver, una solución sin macros, es posible alcanzarla, pero como lo propones lo único que haces es perder simplicidad, velocidad, memoria, y de todo.
Si no te gustan las "macros" porque leíste que son "malas", no hagas mucho caso a eso ;)
Hay cosas, como esta, en las que son necesarias.
Estoy de acuerdo con eso.
Ahora en lo que refiere Nivel7 yeap, si solo queda:
Código:
(nombre_estructura *)(puntero_miembro-(long)(&((nombre_estructura *)0)->nombre_miembro));
de esta forma esta bien a medias, solo funciona cuando el tipo del puntero_miembro es char.
(Ya se ha explicado del porque)
Lo comento porque yo en mi tercer intento de solución(jejeje) me di cuenta de eso, y la solución que mandé fue:
Código:
(nombre_estructura *)((char*)puntero_miembro-(int)(&((nombre_estructura *)0)->nombre_miembro));
solo vease que si
void * p = 0;
entonces
(char*)p + 1 seria igual a 1
(short*)p + 1 seria igual a 2
(int*)p + 1 seria igual a 4
no es lo mismo sumarle 1 a un puntero de tipo char a que a uno de tipo short o que a uno de tipo int, lo mismo si le sumamos un entero n(avanzariamos el puntero n elementos del tipo del puntero mas allá del actualmente apuntado), y lo mismo si fuera el caso de la resta.
viendolo asip podemos decir que no es lo mismo
(char*)puntero_miembro - offset
que...
(short*)puntero_miembro - offset
que...
(int*)puntero_miembro - offset
...por ejemplo.
Por otro lado tiene sentido la resta entre 2 punteros del mismo tipo mas no la suma, por ejemplo
int *a = (int*)0x04;
int *b = (int*)0x10;
de donde b - a = -(a - b) = 3; (para este caso)
Que seria como preguntarse cuantos elementos del mismo tipo se pueden almacenar entre una dirección y otra.
Pero la suma??...creo que ni siquiera se permite.
Saludos.