cpp - 为什么没有监护人保护我免受多重定义?

时间:2017-01-24 19:48:37

标签: c++ header conditional-compilation ifndef

我更喜欢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源文件来实现它,但我仍然想知道为什么守护者不保护我在这里自己射击?

我希望我不必告诉我这只是一个反映我所做事情的虚拟代码 - 而不是我写的实际代码。

修改

Repeated Multiple Definition Errors from including same header in multiple cpps没有解释为什么。我的意思是我没有得到任何答案的图片 - 他们只是提出建议(我都不需要)。

当然,我可以深入了解书籍,并且可能会了解所有这些如何让编译器在我的控制台中打喷嚏,但是要求SO更快,最有可能帮助其他人理解。

1 个答案:

答案 0 :(得分:0)

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