C++库的头文件到底如何包含的?

Posted 茉莉爸爸微课堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++库的头文件到底如何包含的?相关的知识,希望对你有一定的参考价值。

今天在讲课当中遇到了一个有趣的问题。学生问我,为什么在代码中没有书写#include <string>,也可以直接使用string类?其实这个问题是比较复杂的,最终的答案和编译器有关。


前文回顾:


- 正式开始 -

-01-

头文件的意义

基本上我们写C/C++程序的第一行都是头文件包含。以前学习C语言的时候,第一句总是#include <stdio.h>,而C++的第一句通常是#include <iostream>。

然后我们在学习过程中会需要使用各种各样的库函数,这时就需要记住对应的头文件的名字。比如初学者通常需要使用<cmath>、<ctime>、<cstring>、<cstdlib>、<string>等,而学习使用STL时,又需要使用<vector>、<stack>、<queue>等库文件。

一般说来,头文件当中主要包含了相关的函数声明,我们可以在cplusplus.com查询到这些库当中各种函数的用法。

但有时我们会发现,没有写对应的头文件,居然也能运行?这又是为什么呢?

-02-

头文件的间接包含

其实我们只要包含了一个头文件,往往会间接包含到其它的头文件,但具体如何包含取决于编译器的库实现。

例如微软的VS系列,和之前我们介绍的GCC就各不相同,而在苹果的MacOS系统中通常安装的编译器前端是Clang,它和标准GCC也是不完全一样的。

关于这三种编译器的区别,以后给大家再单独介绍。

我现在的苹果系统为例,C++的库安装在如下目录中:

/Library/Developer/CommandLineTools/usr/include/c++/v1

打开目录当中的iostream,我们看到了如图1的内容。

这里的LLVM是和Clang配套的编译器后端,同时我们看到了其授权协议里面提到了伊利诺伊大学,这是因为LLVM的作者就是出自该大学的大神克里斯·拉特纳。关于LLVM和大神本人,我们以后再单独进行介绍。


▼ 图1 iostream截图 ▼



在该文件第20行,有 #include <ostream>;

在ostream的第142行,有 #include <bitset>;

在bitset的第120行,有 #include <string>。

至此真相终于大白,我们明白了为什么可以不写#include <string>了。

-03-

正确的应对方法

之前提过,不同的编译器其库的组织是不完全相同的,也许在某处可以通过的代码换一个环境就不可以了。因此,出于稳妥起见仍然建议大家明确写出对应的头文件。

毕竟这样提高了程序的稳定性和兼容性,是值得的。





以上是关于C++库的头文件到底如何包含的?的主要内容,如果未能解决你的问题,请参考以下文章

围绕 C++ 库的 C 包装器,没有不必要的头文件

string和cstring头文件的区别

c++关于multiset的头文件包含问题。

linux下编写c++,include的那些头文件在啥地方

QT中头文件带不带.h的问题

C++ 的头文件和源文件组织