我正在讨论这个article,它讨论了编译过程(预处理,编译,链接)。据我所知,包括警卫只是解决了在同一翻译单元中防止多个包含的问题。如果我有以下情况:
File : Common.h
----------------
#ifndef External_Header
#include "iostream"
#define External_Header
std::string R = "dsds";
#endif
现在我有两个cpp文件,它们都包含这个头文件。我理解为什么我会收到链接器错误"fatal error LNK1169: one or more multiply defined symbols found".
我很好奇的是,当我定义一个struct而不是一个字符串时,为什么我没有得到相同的链接器错误。
任何可能澄清这一点的想法或想法。
File : Common.h
----------------
#ifndef External_Header
#include "iostream"
#define External_Header
struct mystruct
{
int a;
};
#endif
答案 0 :(得分:2)
问题可能在于您在一种情况下创建变量,但在另一种情况下定义新类型。要验证这一点,可以尝试以下代码。
struct mystruct
{
int a;
} myTestVar;
答案 1 :(得分:1)
这是因为struct
不是符号。
C ++标准明确允许我们重新定义不同翻译单元中的类型......只要它们的定义不会改变。
[C++11: 3.2/1]:
任何翻译单元都不得包含任何变量,函数,类类型,枚举类型或模板的多个定义。
[C++11: 3.2/3]:
每个程序应该只包含该程序中使用的每个非内联函数或变量的一个定义;无需诊断。 [..]
注意前一条规则中提到的类型如何,而后者则不然。稍后会明确说明:
[C++11: 3.2/5]:
在程序中可以有多个类类型 [..] 的定义,前提是每个定义出现在不同的翻译单元中,并且如果定义满足以下要求。鉴于在多个翻译单元中定义了名为D
的实体,那么
D
的每个定义应由相同的令牌序列组成;- [..]
如果没有这种区别,交叉翻译单元编程将是不可能的。