我想在多个.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/

10-11 04:42