C++ C/C的基本结构&x2B+;项目(头文件和cpp文件)

C++ C/C的基本结构&x2B+;项目(头文件和cpp文件),c++,c,include,project,header-files,C++,C,Include,Project,Header Files,这是一个脑死亡的新手问题,但这里有: 什么决定了C/C++项目中包含哪些文件 我的理解是,编译器从包含main()的文件开始,该文件将包含#include,以获取包含其他h文件的各种h文件,以此类推,直到所有内容都包含在项目中 我的问题是: h文件和同名cpp文件之间的关系是什么?我的意思是,当然我理解,在代码方面,他们需要彼此,cpp文件总是(几乎总是?)35;包含h文件,但从编译器的角度来看,他们有相同的名称是重要的还是这只是一种惯例?我可以包括没有相应h文件的额外cpp文件吗 此外,在生成

这是一个脑死亡的新手问题,但这里有:

什么决定了C/C++项目中包含哪些文件

我的理解是,编译器从包含main()的文件开始,该文件将包含#include,以获取包含其他h文件的各种h文件,以此类推,直到所有内容都包含在项目中

我的问题是:

h文件和同名cpp文件之间的关系是什么?我的意思是,当然我理解,在代码方面,他们需要彼此,cpp文件总是(几乎总是?)35;包含h文件,但从编译器的角度来看,他们有相同的名称是重要的还是这只是一种惯例?我可以包括没有相应h文件的额外cpp文件吗

此外,在生成和链接项目时,如何知道要为哪些cpp/h文件生成对象文件?它是从包含“main()”的cpp文件开始,然后继续执行#include,直到它拥有所有需要的内容并构建所有这些内容,还是只构建用户在makefile或IDE项目文件中指定的所有内容

最后,当链接器最终出现并链接所有目标代码以生成一个可执行文件时,它是否有一个特殊的顺序来安排所有内容

感谢任何帮助、提示、解释。。 谢谢


--R

在网上搜索一下,你会得到很多答案。这里只有两个:

第二个很好

我也推荐C++编程语言第三版。有一个关于文件组织的伟大章节


至于编译器做什么,最好在另一篇文章中解释。简而言之,每个cpp文件都被编译成一个翻译单元(目标代码),然后链接器将所有内容连接到最终的可执行文件中。

将文件看作是一种简单的方法,可以拆分代码,使其更可重用和更可维护

您可以很容易地将整个应用程序放在一个大的源文件中,但您可能会发现该文件会变得相当大,导致编译器抱怨它(或者至少需要很长时间来编译它)

通常,您会将应用程序的一部分(如通用数据库访问层)划分到一个单独的源文件中,如
db.cpp
,并使用其API创建一个
db.h
文件。与其说此文件被
db.cpp
使用,不如说它被需要调用
db.cpp
中函数的所有其他文件使用。它可以包含在
db.cpp
中,但它通常是关于
db
代码的已发布信息

至于环境如何确定要编译/链接哪些内容:您往往有一个某种项目(makefile、IDE项目文件等),其中列出了您要编译的所有程序(通常不是头文件)

环境将编译它被告知要生成目标文件的每个源文件-此过程的一部分是将包含的头文件合并到每个源文件中,制作编译或翻译单元-该单元基本上是源文件,包含的头文件合并在
#include
的位置


然后,环境将链接所有对象文件以形成可执行文件。请记住,在这个过程中有一些变化,例如后期(动态)链接。请参阅,以了解这方面的描述。

头文件本质上是类及其所有成员属性和函数的前向声明,这将基本上使您的类更易于重用和访问。将其视为一个没有实现的接口,因此使用它的人不必担心该特定类的源代码。据我所知,相应的h文件和cpp文件需要具有相同的名称。一个cpp文件不需要总是有一个对应的h文件,您可以在一个cpp文件中包含所有源代码,而不需要任何h文件,只要所有内容都正确实现并正确原型化,所有内容都应该正常工作。

您的分析基本正确。。。所有包含的文件都展开到位,生成的代码(翻译单元)被编译成对象、库或应用程序

尽管如此,任何非平凡的项目都依赖于其他库中定义的符号(变量、函数),即使这些符号(变量、函数)仅用于语言或操作系统标准库提供的malloc()、socket()、file()、write()等。即使您不直接调用它们,它们也是new和iostream之类的实现所需要的

当您自己的项目变得更大时,您还需要将功能划分为不同的对象或库,因为这样可以使功能更可重用、更可独立测试,这意味着,在一些代码更改之后,您可以只重新编译那些因更改而无效的对象,然后重新链接,这比重新编译整个项目中的每一个代码位要快得多

<>你的C++编译器创建对象(可能有或可能没有额外的接口和代码,使它们成为库或应用程序)从转换单元(您提到的includes和cpp文件的串联)导入并结合现有静态库或编译器命令行上提到的其他对象中的符号

对于这些独立的对象,编译器需要能够告诉新代码如何访问和使用包含的符号;头文件用于此目的,宣传可用的对象内容

实现(cpp)文件几乎总是首先包含它们的头文件,因为编译器随后会抱怨它正在构建的对象内容与使用对象w进行编码的头文件广告内容之间是否存在差异