2013-03-19 5 views
5

W (starym) kodzie źródłowym Linuksa (napisanym w C89) występuje #define, który jest używany jako literał w inicjalizacji struktury (ide_pci_device_s) przy użyciu standardowej składni inicjalizacji literału C89, ale gdy kompiluję z kompilatorem obsługującym C99, pojawia się błąd initializer element is not constant, poniżej jest próbka kodu, z którym pracuję, który zgłasza błąd.C99 definiuje wartości przekazane jako literalne wartości inicjalizujące do struktury, w przypadku braku zniekształceń

#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 }, 

}; 

Jak mogę nadal korzystać wartość #define natomiast minimalnie zmieniając strukturę źródła budować z kompilatorem C99?

+0

jakaś szansa można wyświetlić komunikat o błędzie verbatim ** ** (tj * * dokładny tekst błędu, w tym kontekście, w jakim dotyczy, zmienne, stałe i wszystkie)? – WhozCraig

+0

http://ideone.com/HTr4xc –

+1

Myślę, że to nie podoba się obsadzie, która w tym przypadku nie jest konieczna do tego, co robisz. Wyjmij '(ide_pci_devid_t)' i dodatkowy zestaw paren po prawej stronie makra i sprawdź, czy to działa. (Nie jestem pozytywny, albo zrobię to jako odpowiedź, podniosę to do odpowiedzi, jeśli to zadziała.) – rra

Odpowiedz

3

Problemem jest odlewane w:

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

Twój kompilator myśli sprawia, że ​​nie stała. Skoro używasz inicjalizatora, który inicjuje zagnieżdżoną strukturę ide_pci_devid_t, nie potrzebujesz rzutowania. Zmiana tego ustawienia na:

#define DEVID_PIIXa  {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371FB_0} 

to naprawi.

(podniesiona do odpowiedzi z komentarzem dyskusji.)

Powiązane problemy