跨头文件访问extern结构体成员的问题求助
解决跨头文件访问结构体成员的问题
嘿,我一眼就揪出你当前代码的问题啦!你现在的写法有个核心漏洞——结构体的定义被放在了cpp文件里,这就导致其他包含parseinput.h的文件根本不知道pitching_stat_struct到底有哪些成员,编译器自然会报错说没法访问结构体成员。你隐约记得的typedef确实能帮上忙,不过咱们先一步步把问题彻底解决:
第一步:把结构体定义移到头文件中
所有需要访问结构体成员的文件,都得先知道这个结构体的完整结构。所以你要把结构体的定义(或者加上typedef简化名称)放到parseinput.h里,而不是藏在cpp文件里。修改后的头文件可以是这样:
#ifndef PARSEINPUT_H #define PARSEINPUT_H // 完整定义结构体,让所有包含头文件的文件都能看到成员 struct pitching_stat_struct { char playerID[16] = { '\0' }; char teamID[16] = { '\0' }; unsigned short W = 0; // 这里补上你省略的其他成员 }; // 用typedef简化结构体名称(可选,但能让代码更简洁) typedef struct pitching_stat_struct PitchingStat; // 声明全局外部变量,告诉编译器这个变量在其他文件定义 extern PitchingStat pitching_home_player; // 要是不用typedef,就写成 extern struct pitching_stat_struct pitching_home_player; #endif
第二步:在cpp文件中只定义全局变量
现在parseinput.cpp里不需要再重复定义结构体了,直接包含头文件后定义全局变量就行:
#include "parseinput.h" // 定义全局变量,和头文件里的extern声明对应 PitchingStat pitching_home_player; // 不用typedef的话就写成 struct pitching_stat_struct pitching_home_player;
第三步:其他文件正常访问成员
现在只要在其他需要访问的文件里包含parseinput.h,就能直接通过pitching_home_player.playerID、pitching_home_player.W这样的方式访问结构体成员啦!
额外注意事项
- 你已经加了头文件保护(
#ifndef PARSEINPUT_H那套),这很好,能避免重复包含导致的编译错误。 - 结构体里的默认初始化(比如
= { '\0' })是C++11及以后的标准支持的,如果你的编译器版本比较老,可能需要把这些初始化移到cpp文件里去。 - 如果不想让全局变量被随意修改,可以考虑把结构体成员设为private,然后提供get/set接口,但要是你本来就需要全局可访问,上面的方法就完全够用。
内容的提问来源于stack exchange,提问作者jparanich
相关产品推荐
相关产品推荐

