Trong mã nguồn (cũ) Linux (viết bằng C89), #define
xảy ra được sử dụng như một chữ cái trong khởi tạo cấu trúc (ide_pci_device_s
)) bằng cách sử dụng cú pháp khởi tạo văn bản chuẩn C89 struct, tuy nhiên, khi tôi biên dịch với trình biên dịch hỗ trợ C99, tôi nhận được lỗi initializer element is not constant
, dưới đây là mẫu mã tôi đang làm việc để ném lỗi.C99 xác định các giá trị được truyền dưới dạng giá trị khởi tạo theo dạng chữ cho cấu trúc, không thành phần
#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 },
};
Làm thế nào tôi vẫn có thể sử dụng giá trị của #define
trong khi tối thiểu thay đổi cấu trúc của nguồn để xây dựng với một trình biên dịch C99?
Bất kỳ cơ hội bạn có thể hiển thị các thông báo lỗi ** nguyên văn ** (tức là * chính xác * văn bản của lỗi, bao gồm các nội dung mà nó đề cập, biến, hằng số và tất cả)? – WhozCraig
http://ideone.com/HTr4xc –
Tôi nghĩ rằng nó không giống như diễn viên, mà trong trường hợp này là không cần thiết cho những gì bạn đang làm. Đưa ra '(ide_pci_devid_t)' và tập hợp các parens bổ sung ở phía bên tay phải của macro và xem nó có hoạt động hay không. (Tôi không tích cực, hoặc tôi muốn làm điều này một câu trả lời; Tôi sẽ đập nó vào một câu trả lời nếu điều đó hoạt động.) – rra