C语言中如何声明外部结构体?已实现外部int变量
问题描述
我已在头文件中通过extern int GLOBAL_RETURNVAL;声明了一个外部int变量,现在想以同样方式声明一个包含该int变量和char*类型成员的外部结构体,尝试了如下代码:
extern struct S_GLOBAL { int GLOBAL_RETURNVAL; char *PWD; };
解决方案
你这段代码的问题是仅用extern修饰了结构体类型的定义,并没有声明一个外部的结构体变量——这样写只是定义了struct S_GLOBAL这个类型,无法直接通过它访问全局的结构体实例。
下面是两种正确的实现方式:
方式一:类型定义与变量声明分离(推荐)
在头文件中先定义结构体类型,再用extern声明对应的全局变量:
// 定义结构体类型,所有包含该头文件的源文件都能共用这个类型 struct S_GLOBAL { int GLOBAL_RETURNVAL; char *PWD; }; // 声明外部结构体变量,告诉编译器这个变量在其他源文件中定义 extern struct S_GLOBAL g_global_data;
然后在某一个源文件(比如global.c)中定义这个结构体变量的实体:
struct S_GLOBAL g_global_data;
之后在其他源文件中,只要包含该头文件,就可以通过g_global_data.GLOBAL_RETURNVAL和g_global_data.PWD访问结构体成员。
方式二:合并类型定义与外部变量声明(不推荐)
如果想在一行代码里完成类型定义和外部变量声明,可以写成:
extern struct S_GLOBAL { int GLOBAL_RETURNVAL; char *PWD; } g_global_data;
但这种写法存在隐患:如果头文件被多个源文件包含,每个源文件都会重新定义struct S_GLOBAL类型,部分编译器会认为不同源文件中的该类型是独立的,最终引发链接错误。因此更推荐使用方式一。
另外需要注意:如果原本单独的GLOBAL_RETURNVAL全局变量要被结构体成员替代,要修改所有原直接使用GLOBAL_RETURNVAL的代码,改为访问结构体成员,避免出现未定义引用错误。
内容的提问来源于stack exchange,提问作者VictordeLeusse
相关产品推荐
相关产品推荐

