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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 03:23:15