C错误:取消对不完整类型、结构的指针的引用

C错误:取消对不完整类型、结构的指针的引用,c,pointers,struct,dereference,incomplete-type,C,Pointers,Struct,Dereference,Incomplete Type,我知道这个问题被问了很多次,但我似乎无法将它与我的问题联系起来 我的问题与填写结构web有关 这是我的错误代码 src\fpu.c:17:7: error: dereferencing pointer to incomplete type cpu->instr.fpu.control = 0x37F; ^ 这是函数中的错误代码 下面是struct web的外观 中央处理器 指示 struct emu_instruction { uint16_t pref

我知道这个问题被问了很多次,但我似乎无法将它与我的问题联系起来

我的问题与填写结构web有关

这是我的错误代码

src\fpu.c:17:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.control = 0x37F;
       ^

这是函数中的错误代码

下面是struct web的外观

中央处理器

指示

struct emu_instruction
{
    uint16_t prefixes;
    uint8_t opcode;
    uint8_t is_fpu : 1;

    union
    {
        struct emu_cpu_instruction cpu;
        struct emu_fpu_instruction fpu;
    };

    struct 
    {
        struct emu_tracking_info init;
        struct emu_tracking_info need;      
    } track;

    struct 
    {
        uint8_t has_cond_pos : 1;
        uint32_t norm_pos;
        uint32_t cond_pos;
    } source;
};
fpu结构

union FpuMmxRegister {
   long double fp;
   unsigned char  b[10];   //only use 8 of these for mmx
   unsigned short s[4];
   unsigned int   i[2];
   unsigned long long ll;
};

struct emu_fpu_instruction
{
    uint16_t prefixes;

    uint8_t fpu_opcode;
    //uint8_t fpu_modrm;

    struct /* mod r/m data */
    {
        union
        {
            uint8_t mod : 2;
            uint8_t x : 2;
        };

        union
        {
            uint8_t reg1 : 3;
            uint8_t opcode : 3;
            uint8_t sreg3 : 3;
            uint8_t y : 3;
        };

        union
        {
            uint8_t reg : 3;
            uint8_t reg2 : 3;
            uint8_t rm : 3;
            uint8_t z : 3;
        };

        struct
        {
            uint8_t scale : 2;
            uint8_t index : 3;
            uint8_t base : 3;
        } sib;

        union
        {
            uint8_t s8;
            uint16_t s16;
            uint32_t s32;
        } disp;

        uint32_t ea;
    } fpu_modrm;

    //uint32_t ea;

    uint16_t control;
    uint16_t status;
    uint16_t tag;
    uint32_t lastIP;
    uint32_t lastIPseg;
    uint32_t lastDataPointer;
    uint32_t lastDataSeg;
    uint16_t opcode;

    uint32_t last_instr;

    union FpuMmxRegister r[8];

};
告诉我我做错了什么谢谢

只是想让你知道他们在启动函数上都错了

src\fpu.c:17:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.control = 0x37F;
       ^
src\fpu.c:18:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.status = 0;
       ^
src\fpu.c:19:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.tag = 0xFFFF;
       ^
src\fpu.c:20:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.lastDataPointer = 0;
       ^
src\fpu.c:21:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.lastDataSeg = 0;
       ^
src\fpu.c:22:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.lastIP = 0;
       ^
src\fpu.c:23:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.lastIPseg = 0;
       ^
src\fpu.c:24:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.opcode = 0;
       ^

您对
struct emu\u cpu的定义在函数
fpuInit
的定义点不可见。因此,在
fpuInit
定义中对
struct emu\u cpu
的所有引用都被视为新的、不完整类型的前向声明


如果在头文件中定义了
struct emu\u cpu
,请确保它包含在定义
fpuInit

的文件中,匿名联合仅允许在结构树的末尾:

a->b.c.d=

d可以是匿名(无名称)结构或联合

b和c不能,需要有名字


参考:****

您可能只是没有包含正确的头文件,或者是被错误键入的文件欺骗了自己。您对
结构emu\u cpu
的定义在函数
fpuInit
的定义点上是不可见的。在这一切中没有称为fpu的结构。@Arif Burhan:您在哪里做你在这个问题中看到了“结构称为fpu”的引用吗?我想
struct emu\u fpu\u指令fpuunion
中使用code>是否有效?我怀疑您误解了术语“匿名结构”的含义。OP的代码中没有一个匿名结构。我看到了几个匿名联合,但没有匿名结构。是的,只是缺少了一个
\include
union FpuMmxRegister {
   long double fp;
   unsigned char  b[10];   //only use 8 of these for mmx
   unsigned short s[4];
   unsigned int   i[2];
   unsigned long long ll;
};

struct emu_fpu_instruction
{
    uint16_t prefixes;

    uint8_t fpu_opcode;
    //uint8_t fpu_modrm;

    struct /* mod r/m data */
    {
        union
        {
            uint8_t mod : 2;
            uint8_t x : 2;
        };

        union
        {
            uint8_t reg1 : 3;
            uint8_t opcode : 3;
            uint8_t sreg3 : 3;
            uint8_t y : 3;
        };

        union
        {
            uint8_t reg : 3;
            uint8_t reg2 : 3;
            uint8_t rm : 3;
            uint8_t z : 3;
        };

        struct
        {
            uint8_t scale : 2;
            uint8_t index : 3;
            uint8_t base : 3;
        } sib;

        union
        {
            uint8_t s8;
            uint16_t s16;
            uint32_t s32;
        } disp;

        uint32_t ea;
    } fpu_modrm;

    //uint32_t ea;

    uint16_t control;
    uint16_t status;
    uint16_t tag;
    uint32_t lastIP;
    uint32_t lastIPseg;
    uint32_t lastDataPointer;
    uint32_t lastDataSeg;
    uint16_t opcode;

    uint32_t last_instr;

    union FpuMmxRegister r[8];

};
src\fpu.c:17:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.control = 0x37F;
       ^
src\fpu.c:18:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.status = 0;
       ^
src\fpu.c:19:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.tag = 0xFFFF;
       ^
src\fpu.c:20:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.lastDataPointer = 0;
       ^
src\fpu.c:21:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.lastDataSeg = 0;
       ^
src\fpu.c:22:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.lastIP = 0;
       ^
src\fpu.c:23:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.lastIPseg = 0;
       ^
src\fpu.c:24:7: error: dereferencing pointer to incomplete type
    cpu->instr.fpu.opcode = 0;
       ^