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,
};
请注意,通过这种方式,其他源文件中的代码无法通过名称访问该变量。这似乎就是答案!谢谢这也是一个很好的解决方案,但我想修改每个文件的结构,我的意思是有些文件可能需要额外的变量,所以我倾向于重用它,直到找到更好的方法。