c - 目标文件的多重定义

标签 c struct definition

我有两个 *.c 文件。 fileA.cfileB.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 中使用的函数,但上面的这些结构是用于状态机控制的局部全局变量。

最佳答案

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

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

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

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

关于c - 目标文件的多重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56985904/

相关文章:

c++ - C++ 类成员的默认值是什么

c - 外部变量是如何定义的?

c - 如何将指针传递给函数并将值赋给C中指向的变量?

c - 为什么即使代码正确,该程序也会显示其他内容?

c - 为什么我们对对象使用指针而不是直接使用对象值?

c - 夹板:定义前使用的局部变量

typescript - 扩展 TypeScript 类时的方法链

c++ - 我如何调用/发送消息到 fastcgi 应用程序?

c - 执行 malloc() 期间的 EXC_BAD_ACCESS (KERN_INVALID_ADDRESS)

c - 为什么C : Array Implementation for Stack and Linked List Implementation for Stack?中的这两个代码之间会出现差异