【问题标题】:cpp - why didn't guardian protect me from multiple definitions? [duplicate]cpp - 为什么监护人不保护我免受多重定义的影响? [复制]
【发布时间】:2017-06-09 19:30:47
【问题描述】:

我更喜欢 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 没有解释为什么。我的意思是我没有从任何这些答案中得到图片——他们只是给出建议(我都不需要)。

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

【问题讨论】:

  • 静态必须在实现文件(*.cpp)中定义。
  • 为什么监护人不保护我免受多重定义的影响?因为包含保护只防止在同一个翻译单元中多重包含(cpp源文件)。
  • 还要注意_A0A是一个非法的符号供你使用,因为这样的标识符是为编译器保留的。让它A0A_H 或类似的东西。而且“C/C++”不是一种语言。您显然只对 C++ 感兴趣,而不对 C 感兴趣。
  • 每个源文件都是单独编译的。使用它包含的标题。
  • 简而言之 - 头文件用于声明,而不是用于定义。

标签: c++ header conditional-compilation ifndef


【解决方案1】:
  1. “监护人”避免在同一个文件中包含多个内容。
  2. 每次包含标题时,都会包含State::A 的定义。如果您包含多次,您将有多个State::A 定义,这是不合法的:链接器将发出错误。为避免这种情况,请在实现文件 (*.cpp) 中定义 State::A

【讨论】:

  • 不是编译器。
  • @SergeyA 是的,对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2012-04-05
  • 2018-07-24
  • 1970-01-01
  • 2010-10-06
相关资源
最近更新 更多