5

(古い) Linux ソース コード (C89 で記述) では、標準の C89 構造体リテラル初期化子構文を使用して#define、構造体 ( ) の初期化でリテラルとして使用される a が発生しますが、 C99 をサポートするコンパイラでコンパイルすると、 ide_pci_device_s、エラーが発生しますinitializer element is not constant。以下は、エラーをスローする作業中のコードのサンプルです。

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

};

#defineC99 コンパイラでビルドするソースの構造を最小限に変更しながら、値を引き続き使用するにはどうすればよいですか?

4

1 に答える 1

3

問題はキャストインです:

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

コンパイラは、それが定数ではないと考えています。イニシャライザを使用しているのはネストされたide_pci_devid_t構造体の初期化であるため、キャストは必要ありません。その定義を次のように変更します。

#define DEVID_PIIXa     {PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82371FB_0}

それを修正します。

(コメントディスカッションからの回答に持ち上げられました。)

于 2013-03-19T06:01:35.657 に答える