如何用extern实现结构体数组跨文件访问?解决类型未识别错误
问题解决方法
错误原因很明确:main.c 编译时,通过 global.h 只看到了 extern NameMap nameMap[] 的声明,但NameMap这个结构体类型的定义只存在于global.c中,编译器无法识别这个类型,因此抛出Unknown type name NameMap错误。
解决步骤如下:
将结构体类型定义移至头文件
global.h
所有需要使用NameMap类型的源文件(比如main.c)都必须先看到该类型的声明,所以要把结构体的typedef放到头文件里,同时加上头文件保护避免重复包含:#ifndef GLOBAL_H #define GLOBAL_H typedef struct NameMap { const char *from; const char *to; } NameMap; extern NameMap nameMap[]; #endif // GLOBAL_H修改
global.c文件
只需包含global.h,然后直接定义数组即可(此时NameMap类型已经通过头文件引入):#include "global.h" NameMap nameMap[] = { {"blah", "blah"}, {"blah", "blah"}, // 其他元素... };main.c正常使用
包含global.h后,就可以直接访问nameMap数组,也能使用NameMap类型:#include "global.h" #include <stdio.h> int main() { // 示例:访问第一个元素 printf("from: %s, to: %s\n", nameMap[0].from, nameMap[0].to); return 0; }
这样修改后,编译器在编译main.c时,会先从global.h中获取NameMap的类型定义,再识别extern声明的数组,编译链接都能正常通过。
内容的提问来源于stack exchange,提问作者codeology
相关产品推荐
相关产品推荐

