【发布时间】: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