2009-09-04 25 views
7

¿Hay alguna forma de encontrar el desplazamiento de un miembro de una estructura en tiempo de compilación? Deseo crear una constante que contenga el desplazamiento de un miembro de estructura. En el siguiente código, la macro offsetof() funciona en la primera instrucción printf. Sin embargo, el uso de la línea 10 para declarar genera el error:offsetof en tiempo de compilación

"Cannot resolve '->' operator as a constant expression".

¿Hay alguna otra manera de hacerlo?

struct MyStruct 
{ 
    unsigned long lw; 
    unsigned char c[5]; 
    int i; 
    int j; 
    unsigned long last; 
}; 

const int ofs = offsetof(struct MyStruct, i); // This line in error 

int main(void) 
{ 
    printf("Offset of c = %d.\n", offsetof(struct MyStruct, c)); 
    printf("Offset of i = %d.\n", ofs); 
    return 0; 
} 

Respuesta

4

Compila sin previo aviso aquí con g ++ 4, después de que agregue los #includes adecuados.

¿Está #including stddef.h? offsetof() es una macro, no una palabra clave incorporada en C.

Si eso no lo soluciona, intente hacer la constante estática para limitarla al módulo. Eso podría hacer feliz al compilador.

9

La macro offsetof() es una construcción en tiempo de compilación. No existe una manera estándar de definirlo, pero cada compilador debe tener alguna forma de hacerlo.

Un ejemplo sería:

#define offsetof(type, member) ((size_t) &(((type *) 0)->member)) 

Aunque no siendo un tiempo de compilación construir técnicamente (véanse los comentarios de "litb" usuario), cada compilador debe tener al menos uno tal expresión que se es capaz de resolver en tiempo de compilación, que es exactamente lo que offsetof() se define en <stddef.h>.

Probablemente haya otro error en su código - una faltante de <stddef.h>, o alguna otra cosa que irrite su compilador.

+0

Eso no es lo que quiere decir con "tiempo de compilación", por supuesto. Muestra un constructo que no utiliza una función de biblioteca, pero eso no significa que se evalúe como un valor de tiempo de compilación. Si el código es realmente emitido o no es irrelevante, el borrador C dice "Una expresión aritmética constante debe tener un tipo aritmético y solo debe tener operandos que sean constantes enteras, constantes flotantes, constantes de enumeración, constantes de caracteres y tamaño de expresiones". Los punteros no están permitidos en la mezcla. –

+0

'offsetof' es una compilación de tiempo de compilación y se evalúa como una expresión constante de entero, pero su implementación de ejemplo no lo hace. –

+0

Hay un * NO * en el lenguaje para definir offsetof() como algo que se evalúa como una expresión constante entera. Hay * NO * forma de definirlo sin usar punteros. No importa lo que haga, siempre dependerá de un compilador incorporado y/o de la capacidad del compilador para optimizar su expresión de forma adecuada. Compruebe Wikipedia en offsetof, o cualquier biblioteca C de código abierto. Entonces, aunque técnicamente es correcto en la definición de expresiones constantes enteras (y yo adapto mi redacción), se equivoca al señalar con el dedo la implementación de mi ejemplo. – DevSolar

3

Si tiene un #include <stddef.h> como supongo (el mensaje de error que cita sin no tendría sentido), es un error en su compilador. El resultado offsetof es una expresión constante entera tanto en C99 como en C90.

Cuestiones relacionadas