我想在多个.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
最佳答案
Callbacks callbacks;
这是定义。由于
#include
的工作方式类似于文本替换,因此在每个包含 header 的源文件中,都会定义一个(单独的,不同的)结构实例。因此,当最终将编译后的目标文件链接在一起时,每个文件都包含一个自己的实例和关联的符号
callbacks
,从而导致描述的链接器错误。要具有结构的单个实例,需要将以上定义放入单个源文件中。
为了能够从其他源文件使用该实例,他们需要能够引用该实例(“知道它的名称”)。这就是声明(“给定名称”)的目的:
extern Callbacks callbacks;
这是您需要放入标题中的内容。
关于c++ - 如果.h包含在多个.cpp中,则.h中的结构不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31907472/