You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

额外提两个小问题:

  1. 你的代码里importedConfigs数组完全没用到,建议删掉避免冗余。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:10:36