请查看以下代码
Main.cpp的
#include <iostream>
using namespace std;
int main()
{
Class1 c;
}
Class1.cpp
#include <iostream>
using namespace std;
class Class1
{
public:
void click1()
{
cout << "Click 1" << endl;
}
};
Class2.cpp
#include <iostream>
using namespace std;
class Class2
{
public:
void click2()
{
cout << "Click 2" << endl;
}
};
如果我将头文件添加到上面的类,它们可以工作。为什么C ++在没有头文件的情况下不理解不同文件中的类?
答案 0 :(得分:6)
在C ++中,源文件称为翻译单元。每个翻译单元彼此分开,基本上不了解彼此的存在。您必须明确告诉编译器翻译单元应该了解的内容。
这是通过声明来完成的。而不是在许多文件和地方使用相同的声明,而是将它们放在所有源文件包含的单个头文件中。
答案 1 :(得分:1)
为什么C ++在没有头文件的情况下不理解不同文件中的类?
为什么要这样?没有约定要求以某种方式命名文件名,或者每个文件包含一个公共类。您可以将整个类层次结构放在单个头文件中,只要它在逻辑上有意义即可。例如,<algorithms>
标题不包含任何名为"algorithms"
的内容,但名称非常直观。
最后,C ++中没有要求内部类或类模板的内容。您可以拥有充满命名空间级C风格函数声明的文件。没有合理的命名约定来支持这种性质的文件。
#include
指令解决了这个问题,并且您可以灵活地按照自己的方式命名文件。
答案 2 :(得分:1)
为什么C ++在没有头文件的情况下不理解不同文件中的类?
这就是C ++(坏)编译模型的工作原理。
编译器分别处理每个翻译单元(.cpp
文件) ;然后,链接器合并处理各个编译单元所产生的所有obejct文件,以创建程序的可执行文件。
在处理一个翻译单元时,编译器将看不到在处理其他翻译单元时已解析的实体。
如果我将头文件添加到上面的类中,它们可以正常工作
这是因为#include
相应的标题使得每个翻译单元对这些实体的声明(或定义)可见,需要使用它们。
答案 3 :(得分:1)
头文件的目的主要是声明项目。在C ++中,必须始终声明任何类,变量等。如果不提供这些,则编译器无法找到相应的类,变量等。
请参阅SO。