c ++:#include和不同的文件类型

Pep*_*ork 1 c++

我莫名其妙地无法抓住这个想法,阅读文档并没有帮助我.

我的问题是:

  1. 当我包含头文件#include"general.h"时,在我的项目目录中有两个文件general.h和general.cpp,这是否意味着我预编译器会自动找到.cpp文件?
  2. 我可以包含没有扩展名的文件:#include"general"?
  3. 我可以包含没有任何头文件的文件:#include"general.cpp"?
  4. 我可以包含一个txt文件:#include"general.txt"?

我在Visual Studio 2010中尝试了这一切.至少没有语法错误.但我想解释一下.所以,我希望你会善良并帮助我.

Jos*_*eld 6

标准和编译器并不真正在意文件是否.cpp.h.monkeyface.将源代码构建到实现和头文件背后的概念实际上只是可以帮助管理源代码的方法.尽管如此,不以可接受的方式构造源代码通常被认为是错误的或错误的C++.

所有#include这一切都告诉预处理器包含您在当前文件中指定的文件的内容.这就像将其他文件复制并粘贴到您的文件中一样.当你说#include "foo.h",它只包括内容foo.h而不关心foo.cpp它 - 它甚至不知道它存在(并且没有理由它必须存在).

在实现和头文件中构建源代码非常有用 - 它避免了依赖关系和多个定义的问题,并且还在一定程度上改善了编译时间.当您的代码使用另一个类时,您只需要该类#include的头文件.原因是因为您的代码不需要关心类的实现,它只需要知道它的外观(它的名称,成员,基类等).它并不关心成员函数的实现方式.

这些扩展.cpp.h仅仅是惯例.有些人更喜欢使用.hpp头文件.有些人甚至.tpp用于模板实现.你可以随意命名 - 是的,你甚至可以包含一个.txt文件.您的编译器可能会尝试从文件扩展名中推断出有关文件的内容(例如,将其编译为哪种语言),但这通常是可重写的.

因此,如果您的main.cpp包含foo.h因为它使用了类foo,那么foo.cpp涉及到什么时候?好吧,在汇编中main.cpp,它根本没有涉及.main.cpp我们不需要知道类的实现,如上所述.但是,在编译整个程序时,您将把每个.cpp文件传递给编译器以便单独编译.也就是说,你会做类似的事情g++ main.cpp foo.cpp.当foo.cpp被编译,这将包括头需要编译.

.cpp编译完每个文件后(包括它们所依赖的标题),然后将它们链接在一起.使用成员函数foo::bar()main.cpp这个阶段将与实施foo::bar(),在被赋予foo.cpp.