C语言嵌套结构体报错:incomplete type is not allowed 求助
问题原因与解决办法
你的报错根源在于头文件用typedef定义的结构体别名,和你在.c文件里写的struct Car写法不匹配。
看你的头文件代码:
typedef struct { // ... } Config; typedef struct { // ... } Car;
这里是把匿名结构体直接typedef成Config和Car,编译器并没有生成名为struct Car或struct Config的结构体类型。但你在car.c里写的是:
struct Car importedCars[MAX_NUMBER_OF_CARS]; struct Config importedConfigs[MAX_NUMBER_OF_CARS];
还有fread(importedCars,sizeof(struct Car),MAX_NUMBER_OF_CARS,fp);
对编译器来说,struct Car是一个从未定义过的结构体类型,自然会报“不完整类型”错误。
两种解决方式:
方式1:直接用typedef的别名(推荐)
把car.c里所有struct Car改成Car,struct Config改成Config:
修改后的核心代码片段:
#define MAX_NUMBER_OF_CARS 10 Car importedCars[MAX_NUMBER_OF_CARS]; Config importedConfigs[MAX_NUMBER_OF_CARS]; // ... fread(importedCars,sizeof(Car),MAX_NUMBER_OF_CARS,fp);
方式2:给结构体加标签
修改头文件里的结构体定义,给匿名结构体加上标签,这样struct Car和Car两种写法都能用:
typedef struct Config { char fuelType[fuelLength]; char gearType[gearLength]; int numGears; char condition[conditionLength]; } Config; typedef struct Car { char make[makeLength]; char model[modelLength]; Config configuration; short power; float torque; float fuelConsumption; float co2PerKm; int price; } Car;
额外提两个小问题:
- 你的代码里
importedConfigs数组完全没用到,建议删掉避免冗余。 fclose(fp)要放在if(fp != NULL)的分支里,否则文件打开失败时fp是NULL,调用fclose会触发未定义行为。修正后的main函数片段:
int main( int argc, char* argv[]){ FILE *fp; fp = fopen("cars.bin","rb"); if(fp != NULL) { fread(importedCars,sizeof(Car),MAX_NUMBER_OF_CARS,fp); printf("1. Binary File read, structures of cars created.\n\n"); for(int i = 0; i < MAX_NUMBER_OF_CARS; i++) { printf("%s\t%s\t%s\t%d\t%f\t%f\t%f\t%d\n", importedCars[i].make, importedCars[i].model, importedCars[i].configuration.fuelType, importedCars[i].power, importedCars[i].torque, importedCars[i].fuelConsumption, importedCars[i].co2PerKm, importedCars[i].price); } fclose(fp); // 移到这里 } else { printf("cannot read file.\n"); } return 0; }
内容的提问来源于stack exchange,提问作者mr. yoxon
相关产品推荐
相关产品推荐

