我的代码组织如下:
文件: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中定义的联合类型?
答案 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 ++中的错误。)