2013-03-19 5 views
5

Nel (vecchio) codice sorgente Linux (scritto in C89), si verifica un #define che viene utilizzato come valore letterale nell'inizializzazione di una struttura (ide_pci_device_s) utilizzando la sintassi di inizializzatore letterale struct C89 standard, tuttavia, quando compilo con un compilatore che supporta C99, ottengo l'errore initializer element is not constant, di seguito è riportato un esempio del codice su cui sto lavorando con cui viene generato l'errore.C99 definisce i valori passati come valori di inizializzatore letterale alla struttura, non riuscendo come non-const

#define ON_BOARD 1 

#define PCI_VENDOR_ID_INTEL  0x8086 
#define PCI_DEVICE_ID_INTEL_82371FB_0 0x122e 

#define DEVID_PIIXa  ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371FB_0}) 

typedef char byte; 

typedef struct ide_pci_devid_t { 
     int one, two; 
} ide_pci_devid_t; 

typedef struct ide_hwif_t { 
     int whatever; 
} ide_hwif_t; 

typedef struct ide_pci_enablebit_s { 
    byte  reg; /* byte pci reg holding the enable-bit */ 
     byte mask; /* mask to isolate the enable-bit */ 
     byte val; /* value of masked reg when "enabled" */ 
} ide_pci_enablebit_t; 

typedef struct ide_pci_device_s { 
     ide_pci_devid_t   devid; 
     const char    *name; 
     void     (*init_hwif)(ide_hwif_t *hwif); 
     ide_pci_enablebit_t  enablebits[2]; 
     byte     bootable; 
     unsigned int   extra; 
} ide_pci_device_t; 

static ide_pci_device_t ide_pci_chipsets[] = { 

    // HERE is where it says 'non-const initializer 
     {DEVID_PIIXa, "PIIX",   NULL,   {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, ON_BOARD,  0 }, 

}; 

Come posso ancora usare il valore della #define mentre minimamente alterare la struttura della sorgente di costruire con un compilatore C99?

+0

Ogni possibilità è possibile mostrare il messaggio di errore ** ** testualmente (cioè l'esatto * * testo dell'errore, compreso il contesto in cui essa si riferisce, variabili, costanti e tutto)? – WhozCraig

+0

http://ideone.com/HTr4xc –

+1

Penso che non piaccia il cast, che in questo caso non è necessario per quello che stai facendo. Estrai '(ide_pci_devid_t)' e l'ulteriore serie di paren nella parte destra della macro e vedi se funziona. (Non sono positivo, o farei una risposta, la risponderò a una risposta se funziona.) – rra

risposta

3

Il problema è il cast:

#define DEVID_PIIXa  ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371FB_0}) 

il compilatore pensa che lo rende non costante. Dal momento che stai usando l'inizializzatore sta inizializzando una struttura nidificata ide_pci_devid_t, non hai bisogno del cast. Modifica che definisci:

#define DEVID_PIIXa  {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371FB_0} 

risolverlo.

(sollevato per una risposta dal commento alla discussione.)