C 对象文件的多重定义

C 对象文件的多重定义,c,struct,definition,C,Struct,Definition,我有两个*.c文件fileA.c和fileB.c我在两个文件中定义了一个名称相同的结构,但它们都作为全局变量在每个文件中本地存在 例如: 文件A.c typedef struct { int a; }MyHandler_t; MyHandler_t myHandler = { .a = 0, }; 文件B.c typedef struct { int a; }MyHandler_t; MyHandler_t myHandler; 问题是,如果我尝试在文件B的结构中初始化变量a,我会得到

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

例如:

文件A.c

typedef struct
{
int a;
}MyHandler_t;

MyHandler_t myHandler =
{
.a = 0, 
};
文件B.c

typedef struct
{
int a;
}MyHandler_t;

MyHandler_t myHandler;
问题是,如果我尝试在文件B的结构中初始化变量a,我会得到“myHandler”的多个定义。 即使我试着把它放在空括号里,我也会得到同样的错误。 为什么会这样


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

typedef
移动到
.h
头文件。在这两个.C Giles中都包含头文件。在其中一个C文件中,生成变量
extern
,并删除初始化。在整个项目中,同一变量只能进行一次初始化


Yuo也可以同时使用静态变量和全局变量,它们在编译单元范围(即文件)中都是全局变量。在C中没有“局部全局变量”这样的东西。
myHandler
是一个全局变量,在两个源文件中都有定义。这是无效的,因为每个全局变量只能有一个定义

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

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

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

这似乎就是答案!谢谢这也是一个很好的解决方案,但我想修改每个文件的结构,我的意思是有些文件可能需要额外的变量,所以我倾向于重用它,直到找到更好的方法。