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?
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
http://ideone.com/HTr4xc –
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