0

我更喜欢 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 源文件来使其工作,但我仍然想了解为什么监护人不保护我免于在这里开枪?

我希望我不必说这只是一个反映我所做的虚拟代码——而不是我正在编写的实际代码。

编辑

在多个 cpps 中包含相同的标头导致重复的多个定义错误不能解释为什么。我的意思是我没有从任何这些答案中得到图片——他们只是给出建议(我都不需要)。

当然,我可以深入阅读书籍,并可能了解所有这些如何使编译器在我的控制台中打喷嚏,但询问是否如此更快,并且很可能会帮助其他人理解。

4

1 回答 1

0
  1. “监护人”避免在同一个文件中包含多个内容。
  2. 每次包含标题时,State::A都会包含 的定义。如果您包含多次,您将有多个定义State::A,这是不合法的:链接器将发出错误。为避免这种情况,请State::A在实现文件 (*.cpp) 中进行定义。
于 2017-01-24T20:04:09.340 回答