目标文件的多重定义

时间:2019-07-11 09:24:50

标签: c struct definition

我有两个*.c文件。 fileA.cfileB.c我在两个文件中定义了一个具有相同名称的结构,但是它们在每个文件中都作为全局变量在本地存储。

例如:

fileA.c

typedef struct
{
int a;
}MyHandler_t;

MyHandler_t myHandler =
{
.a = 0, 
};

fileB.c

typedef struct
{
int a;
}MyHandler_t;

MyHandler_t myHandler;

问题是,如果我尝试在文件B中的结构中初始化变量a,则会得到multiple definition of "myHandler"。 即使我尝试将其放在空括号中,也会遇到相同的错误。 为什么会这样?

两个文件都包含main函数中main.c中使用的函数,但是以上这些结构是用于状态机控制的局部全局变量。

2 个答案:

答案 0 :(得分:3)

在C中没有“局部全局变量”之类的东西。myHandler是在两个源文件中都定义的全局变量。这是无效的,因为每个全局变量只能有一个定义。

如果您希望每个源文件都有其自己的本地文件myHandler变量,则必须将其声明为static

static MyHandler_t myHandler =
{
.a = 0, 
};

请注意,通过这种方式,其他源文件中的代码无法按名称访问该变量。

答案 1 :(得分:0)

typedef移至.h头文件。在两个.C Giles中都包含头文件。在一个C文件中,创建变量extern并删除初始化。在整个项目中,您只能对同一变量进行一次初始化

Yuo也可以兼具静态性,它们在编译单元范围(即文件)中是全局的