我想在多个.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
答案 0 :(得分:2)
Callbacks callbacks;
这是定义。由于#include
的工作方式与文本替换类似,因此在包含标题的每个源文件中都会定义一个(单独的,不同的)结构实例。
因此,当最终将编译的目标文件链接在一起时,它们中的每一个都包含一个自己的实例和关联的符号callbacks
,从而导致所描述的链接器错误。
要拥有结构的单个实例,您需要将上述定义放入单个源文件中。
为了能够从其他源文件中使用该实例,他们需要能够引用它(“知道它的名字”)。这是声明(“给出一个名字”)的目的:
extern Callbacks callbacks;
这是您需要放入标题的内容。
答案 1 :(得分:0)
在标题中声明
extern Callbacks callbacks;
并在某个cpp文件中定义对象。
Callbacks callbacks;
否则,您拥有尽可能多的对象定义,因为许多cpp文件都包含此标题。