CPP - 为什么监护人没有保护我免受多重定义的影响?

cpp - why didn't guardian protect me from multiple definitions?

本文关键字:定义 影响 为什么 监护人 保护我 CPP      更新时间:2023-10-16

我更喜欢JAVA,但当HI-Perf在需求列表中时,C/C++必须出现在表中。事实的确如此。不出所料,我在SO中偶然发现了一些我无法理解和挖掘的东西。那么,有人能解释我为什么监护人在下面的标题中不起作用吗?

// a0a.h
#ifndef _A0A
#define _A0A
class State {
public:
static State* A;
}
State* State::A = new State(); /* this is going to be troublesome */
#endif

B.h // #include "a0a.h"
C.h // #include "a0a.h"
XXX.h // #include "B.h"
XXX.h // #include "C.h"

编译给了我一个关于上面指出的行的多重定义错误。

我已经通过将这一行移到.cpp源文件中实现了这一点,但我仍然想理解为什么守护者没有保护我不在这里开枪?

我希望我不必说这只是一个反映我所做的事情的伪代码,而不是我正在写的实际代码。

编辑

在多个cpp中包含相同的头导致重复的多个定义错误并不能解释为什么。我的意思是,我没有从这些答案中了解情况——它们只是给出了建议(我不需要这些建议)。

当然,我可以深入阅读书籍,并可能了解所有这些是如何让编译器在我的控制台上打喷嚏的,但询问是SO要快得多,很可能会帮助其他人理解。

  1. "守护者"避免在同一文件中包含多个
  2. 每次包含标头时,都会包含State::A的定义。如果多次包含,则State::A将有多个定义,这是不合法的:链接器将发出错误。要避免这种情况,请在实现文件(*.cpp)中定义State::A