【发布时间】:2013-01-07 06:10:04
【问题描述】:
我开始用 C++ 编写一个简单的解释器,它具有我将在下面描述的类结构,但我退出并用 Java 重写了这个东西,因为头文件给我带来了困难。这是 C++ 中显然不允许的基本结构:
main.cpp 包含 main 函数,并包含一个我们可以调用 printer.h 的类的头文件(其单个 void 方法在 printer.h 中实现) cpp)。现在想象另外两个相同的类。两者都想打电话给Printer::write_something();,所以我在每个中都包含了printer.h。所以这是我的第一个问题:为什么我可以#include <iostream> 一百万次,甚至一个接一个,但我只能包含一次 my 标题? (好吧,我想我可以用我的做同样的事情,只要它在同一个文件中。但我可能是错的。)我理解声明和实现/定义之间的区别,但该代码给了我一个类重定义错误。我不明白为什么。这就是让我大吃一惊的事情(可能会告诉你为什么我什么都不明白):我不能只在 main.cpp 的顶部包含 printer.h 并使用我其他两个班级的班级。我知道我可以毫无问题地将 printer.h 包含在两个类(标题)中的 一个 中,但我不明白为什么这与仅包含它有什么不同在我将类包含在 main.cpp 之前(因为这样做会给我一个找不到类的错误)。
当我厌倦时,我考虑转向 C,因为我使用的 OOP 无论如何都非常强制,但除非我将所有内容都写在一个文件中,否则我会遇到同样的问题。知道 C++ 却因为编译问题而无法正确使用它令人沮丧。
如果您能帮我解决这个问题,我将不胜感激。谢谢!
【问题讨论】:
-
您是否熟悉包含/标题保护(请参阅en.wikipedia.org/wiki/Include_guard)。 iostream 库应该有它们,而您的 printer.h 标头很可能没有。标头保护试图确保只使用一个标头定义。
-
我最初尝试过,但没有成功。也许是因为我只在两个标题之一中使用了它们。
-
另外,作为重新阅读您的问题后的注释。这不是 C++ 独有的,如果printer.h 声明了一个函数并且printer.c 定义了它的实现(你仍然需要标头保护),你会在C 中遇到同样的问题。对于 C 中的类似问题,请参阅:stackoverflow.com/questions/5430019/…
标签: c++ header linker redefinition