加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C99将作为文字初始化值传递的值定义为结构,失败为非const

发布时间:2020-12-16 05:02:53 所属栏目:百科 来源:网络整理
导读:在(旧的) Linux源代码(用C89编写)中,使用标准C89结构文字初始化语法在结构初始化(ide_pci_device_s)中使用#define作为文字,但是,当我使用编译器编译时支持C99,我得到的错误初始化元素不是常量,下面是我正在使用的代码示例,它会抛出错误. #define ON_BOARD 1#
在(旧的) Linux源代码(用C89编写)中,使用标准C89结构文字初始化语法在结构初始化(ide_pci_device_s)中使用#define作为文字,但是,当我使用编译器编译时支持C99,我得到的错误初始化元素不是常量,下面是我正在使用的代码示例,它会抛出错误.
#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}},ON_BOARD,0 },};

我怎样才能使用#define的值,同时最低限度地改变使用C99编译器构建的源代码的结构?

解决方法

问题是演员:
#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}

会解决它.

(从评论讨论中得到答案.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读