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

c++: #include and different file types

本文关键字:文件 类型 #include c++      更新时间:2023-10-16

不知何故,我无法理解这个想法,阅读文档对我没有帮助。

我的问题是:

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

我在Visual Studio 2010中尝试过这一切。至少没有语法错误。但我想解释一下。所以,我希望你能友善地帮助我。

标准和编译器并不真正关心文件是.cpp.h还是.monkeyface。将源代码结构化为实现和头文件背后的概念实际上是帮助管理源代码的公认方法。尽管如此,不以公认的方式构建源代码通常被认为是不正确或糟糕的C++。

#include所做的只是告诉预处理器将您指定的文件的内容包含在当前文件中。这就像将另一个文件复制粘贴到您的文件中。当你说#include "foo.h"时,它只包括foo.h的内容,根本不关心foo.cpp——它甚至不知道它的存在(也没有理由必须存在(。

在实现和头文件中构造源代码非常有用——它避免了依赖项和多个定义的问题,也在一定程度上缩短了编译时间。当您的代码使用另一个类时,您只需要#include该类的头文件。原因是你的代码不需要关心类的实现,它只需要知道它是什么样子(它的名称、成员、基类等(。它不关心成员函数是如何实现的。

扩展CCD_ 9和CCD_。有些人更喜欢将.hpp用于头文件。有些人甚至将.tpp用于模板实现。您可以随意命名它们——是的,您甚至可以包含一个.txt文件。您的编译器可能会试图从文件扩展名推断有关文件的信息(例如,将其编译为哪种语言(,但这通常是不可接受的。

那么,如果您的main.cpp包括foo.h,因为它使用了类foo,那么foo.cpp在什么时候参与进来?嗯,在main.cpp的编译中,它根本没有参与其中。main.cpp不需要知道类的实现,正如我们上面讨论的那样。但是,在编译整个程序时,您将把每个.cpp文件传递给编译器,以便单独编译。也就是说,你会做一些类似g++ main.cpp foo.cpp的事情。当foo.cpp被编译时,它将包括需要编译的头。

编译完每个.cpp文件(包括它们所依赖的头(后,它们就会链接在一起。在此阶段,main.cpp中成员函数foo::bar()的使用将与foo.cpp中给出的foo::bar()的实现相关联。

#include指令告诉预处理器读取文件。仅此而已。

预处理器在遇到#include指令时,只需插入给定文件的全部内容。

  1. 不,预编译器对.cpp文件一无所知

  2. 是,如果文件没有扩展名

  3. 您可以包含任何需要的文件。这并不意味着你会从中得到任何有用的东西

  4. 参见第3点。在上面

#include是一个简单的"在此处插入给定文件的内容"机制,因此预处理器将完全包括您指定的文件。如果包含.h文件,则预处理器和编译器都不会知道相应的.cpp文件——每个.cpp文件都是单独编译的(.h文件的目的是通知编译器当前.cpp文件之外存在哪些函数(。编译后,链接器被调用,只有这样,不同.cpp文件的编译结果才会组合在一起。