在函数中使用结构体变量出现referenzspannung类型冲突错误如何解决
报错原因及修复方案
核心错误原因
- 错误1:函数调用写法错误,误写为函数声明。你在
main.c中的referenzspannung(struct ADMESSUNG *mess);不是函数调用,是局部作用域内的函数声明,该声明中用到的struct ADMESSUNG是仅在当前作用域有效的全新类型,和你在measure.c中定义的结构体不属于同一类型,直接引发类型冲突报错。 - 错误2:结构体定义位置不合理,头文件未包含类型声明。你将
struct ADMESSUNG的完整定义放在了measure.c中,其他引用measure.h的文件无法识别该结构体类型,也会引发类型不匹配问题。 - 错误3:未在实现文件中引入对应头文件。如果
measure.c开头没有加#include "measure.h",编译器无法校验函数定义和头文件中声明的一致性,也可能引发类型冲突。
修复步骤
1. 调整measure.h内容
添加头文件防护,将结构体定义(或前置声明)、函数原型、全局变量外部声明统一放到头文件中:
#ifndef MEASURE_H #define MEASURE_H // 完整定义结构体,外部文件需要访问结构体成员时必须写在此处 struct ADMESSUNG { unsigned long Coderef; double Uref; double Stcal; double Offset; unsigned long Temperaturcode; double Temperaturavin; double RTD; double R; double Tempwert; unsigned long Phcode; double Phavin; double Stprobe; double PHWert; }; // 函数原型声明 void referenzspannung(struct ADMESSUNG *mess); // 全局变量外部声明,供其他文件使用measure.c中定义的mess变量 extern struct ADMESSUNG mess; #endif
2. 调整measure.c内容
开头引入measure.h,删除重复的结构体定义,保留全局变量定义和函数实现:
#include "measure.h" // 全局结构体变量定义 struct ADMESSUNG mess; void referenzspannung(struct ADMESSUNG *mess) { AD7793_SetIntReference(AD7793_REFSEL_INT); AD7793_SetExcitDirection(AD7793_DIR_IEXC1_IOUT2_IEXC2_IOUT1); AD7793_SetExcitCurrent(AD7793_EN_IXCEN_210uA); AD7793_SetChannel(AD7793_CH_AIN3P_AIN3M); mess->Coderef = AD7793_ContinuousReadAvg(50); mess->Uref = ((mess->Coderef / 8388608) - 1) * 1.17; // code in voltage }
3. 调整main.c调用逻辑
开头引入measure.h,调用函数时直接传入结构体指针,不需要带类型声明:
#include "measure.h" int main(void) { // 方式1:使用measure.c中定义的全局mess变量 referenzspannung(&mess); // 方式2:使用局部自定义的结构体变量 // struct ADMESSUNG local_mess; // referenzspannung(&local_mess); return 0; }
内容的提问来源于stack exchange,提问作者Marc Hammer
相关产品推荐
相关产品推荐

