c++ #include,嵌套include是如何工作的

C++ #include, how does nested includes work?

本文关键字:工作 何工作 #include 嵌套 include c++      更新时间:2023-10-16

所以我正在学习c++,并学习在我的实践中使用SQLite进行跨应用程序运行的数据持久化,这很有趣。

但是我碰到了这个问题:

程序是一个Grade Book,经典的Ditel c++ Book练习。我的类结构如下:

~/classes/Database.h/cpp // A small wrapper for sqlite3
~/classes/Student.h/cpp // The Student object with name and grades (Uses Database)
~/classes/GradeBook.h/cpp // Takes care of most of the application logic and UI (Uses Database and Student)
~/main.cpp // contains just the main function and base Instances of Database and GradeBook

这样我就可以从main()实例化单个数据库对象,并通过引用将其传递给GradeBook和Student,以便它们可以使用数据库函数。我尝试了所有可能的包含顺序,结果只有这个顺序对我有效。

Student includes Database.
GradeBook includes Student, gets access to Database.
main.cpp includes GradeBook, gets access to both Database and Student.

问题是,这对吗?包含似乎从最深层的类向后"级联"到main.cpp文件,这似乎完全违反直觉,换句话说,我这样做对吗,还是我遗漏了什么?

如果是这样的话,一些关于这个"级联"是如何工作的解释或指针将是非常棒的。

谢谢!

首先,你的头文件应该使用include守卫来防止多重包含:

#ifndef MY_HEADER_H
#define MY_HDEADER_H
// code...
#endif  // this file will only ever be copied in once to another file
其次,你应该显式地包括所有的头文件,你需要做你想做的事情。依靠头A来包含头B对你来说只是笨拙的,因为你使用了包含保护,你永远不必担心包含同一个文件两次。

所以,回答你的问题,不,它不是"正确的",因为它可以"更好"。main.cpp应该包含它需要的所有头文件。所有的。#include是一种简单的文本替换机制。当你#include一个文件,它是字面上粘贴。就是这样。