C++ 如果.h包含在多个.cpp中,则.h中的结构不工作?

C++ 如果.h包含在多个.cpp中,则.h中的结构不工作?,c++,visual-studio,struct,header,C++,Visual Studio,Struct,Header,我想在多个.cpp中使用此回调对象,但如果我包含多次,则VS会给出“找到一个或多个多定义符号”错误 #ifndef HEADER_H #define HEADER_H typedef struct { void(__cdecl *callbackOne)(bool val); void(__cdecl *callbackTwo)(bool val); void(__cdecl *callbackThree)(bool val); } Callbacks; Callbacks callbacks

我想在多个.cpp中使用此回调对象,但如果我包含多次,则VS会给出“找到一个或多个多定义符号”错误

#ifndef HEADER_H
#define HEADER_H

typedef struct {
void(__cdecl *callbackOne)(bool val);
void(__cdecl *callbackTwo)(bool val);
void(__cdecl *callbackThree)(bool val);
} Callbacks;
Callbacks callbacks;

#endif
在标题中声明

extern Callbacks callbacks;
并在某个cpp文件中定义对象

Callbacks callbacks;
否则,对象定义的数量与包含此标头的cpp文件的数量相同

Callbacks callbacks;
这是一个定义。由于
#include
的工作原理类似于文本替换,因此在包含标头的每个源文件中,都会定义一个(单独的、不同的)结构实例

因此,当最终将编译后的对象文件链接在一起时,每个文件都包含自己的实例和关联的符号
回调
,从而导致所述链接器错误

要获得结构的单个实例,需要将上述定义放入单个源文件中

为了能够从其他源文件使用该实例,他们需要能够引用它(“知道它的名称”)。这就是声明的目的(“给出一个名字”):


这就是你需要放在标题中的内容。

你应该阅读关于删除和定义之间的区别想想看:当你在多个源文件中包含标题时,你会将标题内容(一次)复制到其中。多个结构描述不是问题,但是对象
回调
,因为这是全局可见的,并且链接对象文件会发现此冲突。
错误C2086:“int callbacks”:重新定义
我在某些cpp中定义对象时遇到此错误file@theman这只意味着您还在其他cpp文件中定义了对象。您应该按照我描述的那样做。
extern Callbacks Callbacks在我的头和
typedef struct{…}回调中;回调回调似乎会导致回调重新定义错误,是谁让您在源文件中放置
typedef struct…
?将typedef放入头文件,放入
extern Callbacks CallbacksCallbacks Callbacks。如果仍然不起作用,那么发布你的新代码。首先,请理解定义和声明之间的区别。谢谢!这就是问题所在。
extern Callbacks callbacks;