如果.h包含在多个.cpp中,则.h中的结构不起作用?

时间:2015-08-09 18:26:46

标签: 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;

#endif

2 个答案:

答案 0 :(得分:2)

Callbacks callbacks;

这是定义。由于#include的工作方式与文本替换类似,因此在包含标题的每个源文件中都会定义一个(单独的,不同的)结构实例。

因此,当最终将编译的目标文件链接在一起时,它们中的每一个都包含一个自己的实例和关联的符号callbacks,从而导致所描述的链接器错误。

要拥有结构的单个实例,您需要将上述定义放入单个源文件中。

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

extern Callbacks callbacks;

这是您需要放入标题的内容。

答案 1 :(得分:0)

在标题中声明

extern Callbacks callbacks;

并在某个cpp文件中定义对象。

Callbacks callbacks;

否则,您拥有尽可能多的对象定义,因为许多cpp文件都包含此标题。