问题
编译时,出现error: identifier “Reg_Flag” is undefined
extern Reg_Flag reg_flag;
很奇怪,我明明已经定义了。无非就是定义是在extern的下面,会不会是这个原因?
解决
果然,把extern的部分放到结构体定义的下面之后,编译成功了。那这是为什么呢?
typedef struct {
uint8_t DO1;
uint8_t DO2;
// 更多成员...
} Reg_Flag;
extern Reg_Flag reg_flag;
搜索之后了解到:extern关键字用来告诉编译器相应的变量在其他地方定义,但编译器需要在使用extern之前就了解这些变量的类型。如果在使用extern声明变量之前没有定义相应的类型,编译器就不知道这些标识符代表什么类型的变量,从而引发“未定义标识符”的错误。
当把extern声明移动到相应的结构体类型定义之后,编译器已经识别了这些类型,因此能够正确地识别extern声明的变量类型。
补充
'extern’关键字:用于声明一个变量或函数是在别处定义的,意味着它告诉编译器期望在其他地方找到这个变量或函数的定义。
【注】
(1)首先要确保使用’extern’关键字引用的变量的类型都已经被定义。
(2)类型定义后,再用’extern’声明这些外部变量,这样编译器能够理解这些变量的完整类型信息。