C99 define values passed as literal initializer values to structure, failing as non-const
c, constants, struct
Solution
The problem is the cast in:
#define DEVID_PIIXa ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371FB_0})
Your compiler thinks that makes it non-constant. Since where you're using the initializer is initializing a nested `ide_pci_devid_t` struct, you don't need the cast. Changing that define to:
#define DEVID_PIIXa {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371FB_0}
will fix it.
(Lifted to an answer from the comment discussion.)
Problem
In the (old) Linux source code (written in C89), a `#define` occurs that is used as a literal in the initialization of a structure (`ide_pci_device_s`) using the standard C89 struct literal initializer syntax, however, when I compile with a compiler that supports C99, I get the error `initializer element is not constant`, below is a sample of the code I am working with which throws the error. ``` #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 }, }; ``` How can I still use the value of the `#define` while minimally altering the structure of the source to build with a C99 compiler?