C++ 如果.h包含在多个.cpp中,则.h中的结构不工作?
我想在多个.cpp中使用此回调对象,但如果我包含多次,则VS会给出“找到一个或多个多定义符号”错误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
#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{…}回调中;回调回调我的源文件中的code>似乎会导致回调重新定义错误,是谁让您在源文件中放置typedef struct…
?将typedef放入头文件,放入extern Callbacks Callbacks在头文件中,放入Callbacks Callbacks源文件中的代码>。如果仍然不起作用,那么发布你的新代码。首先,请理解定义和声明之间的区别。谢谢!这就是问题所在。
extern Callbacks callbacks;