编译错误:无效使用未定义的类型' union ...' 。定义有什么问题?

时间:2015-11-18 14:17:42

标签: c

我的代码组织如下:

文件:main.c

 #include "init.h"
 #include "SpiComm.h"
 //. . . . 

文件:init.h

typedef union {

    unsigned int wholeReg;

    struct   {
        unsigned CMD1_flag: 1; 
            . . . .

    };

}  DISCRETE_FLAGS_REG_TYPE;

extern volatile union DISCRETE_FLAGS_REG_TYPE DiscreteFlagsReg; //register declaration

文件:SpiComm.c

#include "SpiComm.h"

volatile union DISCRETE_FLAGS_REG_TYPE  DiscreteFlagsReg;


unsigned char* SpiTxFrameSetup (void)
{
            . . . .                
    SpiTxMsgByte1.dt1CmdFlag = L_DiscreteFlagsReg.regBits.DT1_HW_CMD_flag;
            . . . . 
    spiTxMsg[4] = SpiTxMsgByte1.byte0Full;
        . . . . 
    return (spiTxMsg);  //return the pointer to Tx message array;
}

编译器正在通知此SpiComm.c文件(以及尝试使用此联合的任何字段的任何其他.c文件):

错误:无效使用未定义的类型' union DISCRETE_FLAGS_REG_TYPE'

有什么问题?为什么其他c文件不能识别我在init.h中定义的联合类型?

1 个答案:

答案 0 :(得分:3)

工会本身没有名字; “DISCRETE_FLAGS_REG_TYPE”是一个typedef名称。

您可以使用typedef名称:

extern volatile DISCRETE_FLAGS_REG_TYPE DiscreteFlagsReg;

或命名联盟:

union DISCRETE_FLAGS_REG_TYPE
{
   /* ... */
};

并在C中使用union DISCRETE_FLAGS_REG_TYPE,或在C ++中使用DISCRETE_FLAGS_REG_TYPE

或者,在C中,组合命名和typedef:

typedef union DISCRETE_FLAGS_REG_TYPE
{
   /* ... */
} DISCRETE_FLAGS_REG_TYPE;

(最后一个变体是C ++中的错误。)