2013-03-19 19 views
5

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?

+0

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

+0

http://ideone.com/HTr4xc –

+1

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

Trả lời

3

Vấn đề là các diễn viên trong:

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

trình biên dịch của bạn nghĩ rằng làm cho nó không liên tục. Vì nơi bạn đang sử dụng bộ khởi tạo đang khởi tạo cấu trúc lồng nhau là ide_pci_devid_t, bạn không cần sử dụng. Thay đổi xác định đó thành:

#define DEVID_PIIXa  {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371FB_0} 

sẽ khắc phục.

(Dỡ bỏ một câu trả lời từ các cuộc thảo luận nhận xét.)

Các vấn đề liên quan