Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C99 define values passed as literal initializer values to structure, failing as non-const

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?

like image 346
ŹV - Avatar asked Oct 21 '22 14:10

ŹV -


1 Answers

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.)

like image 194
rra Avatar answered Oct 30 '22 02:10

rra