2009-09-04 22 views
7

C'è un modo per trovare l'offset di un membro di una struttura in fase di compilazione? Desidero creare una costante contenente l'offset di un membro della struttura. Nel seguente codice la macro offsetof() funziona nella prima istruzione printf. Tuttavia, l'uso in linea 10 per dichiarare genera l'errore:offsetof in fase di compilazione

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

C'è un altro modo per farlo?

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; 
} 

risposta

4

Compila senza preavviso qui con g ++ 4, dopo aggiungo le # include corretta.

Sei #including stddef.h? offsetof() è una macro, non una parola chiave incorporata in C.

Se ciò non risolve il problema, prova a creare la costante statica, per confinarla al modulo. Questo potrebbe rendere felice il compilatore.

9

La macrooffsetof() è un costrutto in fase di compilazione. Non esiste un modo conforme allo standard per definirlo, ma ogni compilatore deve avere un qualche modo per farlo.

Un esempio sarebbe:

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

Pur non essendo un momento della compilazione costruire tecnicamente (vedi commenti dall'utente "litb"), ogni compilatore deve avere almeno un tale espressione che è in grado di risolvere in fase di compilazione, che è esattamente ciò che è definito in <stddef.h> nello .

Probabilmente c'è qualche altro errore nel codice: una mancanza di <stddef.h> o qualche altra cosa che irrita il compilatore.

+0

Questo non è ciò che intende con "tempo di compilazione", naturalmente. Si mostra un costrutto che non usa una funzione di libreria, ma ciò non significa che valuti un valore di tempo di compilazione. Indipendentemente dal fatto che il codice sia effettivamente emesso è irrilevante - la bozza C dice "Un'espressione costante aritmetica deve avere un tipo aritmetico e deve avere solo operandi che sono costanti intere, costanti fluttuanti, costanti di enumerazione, costanti di caratteri e dimensioni delle espressioni.". I puntatori non sono ammessi nel mix. –

+0

'offsetof' è un costrutto di tempo di compilazione e valuta un'espressione costante intera, ma l'implementazione di esempio no. –

+0

C'è un modo * NO * nella lingua per definire offsetof() come qualcosa che valuta un'espressione costante intera. C'è un modo * NO * per definirlo senza usare i puntatori. Qualunque cosa tu faccia, ti baserai sempre su un compilatore incorporato e/o sulla capacità del compilatore di ottimizzare la tua espressione in modo appropriato. Controlla Wikipedia su offsetof, o qualsiasi libreria C open-source. Quindi, mentre tecnicamente siete corretti sulla definizione di espressioni costanti intere (e adattare la mia formulazione), vi sbagliate nel puntare il dito sulla mia implementazione di esempio. – DevSolar

3

Se si dispone di un #include <stddef.h> come suppongo (il messaggio di errore citato senza sarebbe privo di significato), si tratta di un bug nel compilatore. Il risultato offsetof è un'espressione costante intera in C99 e anche in C90.

Problemi correlati