如何让typedef struct跨多文件正常使用?解决未定义类型错误
解决C语言typedef struct跨文件访问的问题
这个问题我之前也踩过坑——本质是编译器在function.c里看不到结构体的完整定义,你只写了一个前向声明,它知道有个struct data类型,但不知道里面有哪些成员,所以访问data[c].tp时就会报错。
下面是具体的解决步骤:
1. 新建头文件统一管理结构体和函数原型
创建一个名为reactor.h的头文件,把完整的结构体定义和函数原型都放在这里,同时加上头文件保护防止重复包含:
#ifndef REACTOR_H #define REACTOR_H // 完整的结构体typedef定义 typedef struct data { int t; float tp, tf, tt; } reactorData; // 函数原型声明 void reactorOutput(reactorData *data); #endif
2. 修改main.c,包含头文件替代本地定义
把main.c里原来的结构体定义删掉,换成包含头文件:
#include "reactor.h" int main() { reactorData reactorOne[21]; // 这里可以正常初始化或使用数组 reactorOutput(reactorOne); // 调用输出函数 // other stuff }
3. 修改function.c,包含头文件并移除前向声明
删掉function.c里的typedef struct data reactorData;,换成包含头文件,同时记得包含stdio.h(因为用到了printf):
#include "reactor.h" #include <stdio.h> void reactorOutput(reactorData *data) { int c; for (c = 0; c < 21; c++) { printf(" %3d\t %.0f\t %.0f\t %.0f\n", c, data[c].tp, data[c].tf, data[c].tt); } }
为什么原来的写法不行?
你在function.c里写的typedef struct data reactorData;属于前向声明,它只能告诉编译器“存在这个类型”,允许你用它声明指针(比如函数参数reactorData *data),但一旦要访问结构体的成员(比如.tp),编译器必须知道结构体的完整布局(成员类型、偏移量),这时候就必须要有完整的定义——头文件就是用来统一提供这个定义的。
内容的提问来源于stack exchange,提问作者Starch Wars
相关产品推荐
相关产品推荐

