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;
}
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. –
'offsetof' è un costrutto di tempo di compilazione e valuta un'espressione costante intera, ma l'implementazione di esempio no. –
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