c++关于multiset的头文件包含问题。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++关于multiset的头文件包含问题。相关的知识,希望对你有一定的参考价值。
规定,就像你要用 cout 不会写 #include <cout> 而是写 #include <iostream> 一样 参考技术A multiset只是set的一个特例而已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++关于multiset的头文件包含问题。的主要内容,如果未能解决你的问题,请参考以下文章