1.2.1.3 头文件与名字空间的概念

  • 头文件是后缀名为.h的文件,通过文件包含指令(即 #include 指令),可以在编译期间将指定头文件的内容包含进当前的文件中。不同的头文件包含不同的功能,可以提供给程序设计者使用,节省程序设计人员的重复劳动。程序设计者只需用一行#include命令就可以使用这些功能,大大地提高了编程效率。
  • 在源文件中,任何形如#include "filename"#include<filename>的行都将被替换为 filename 指定的文件的内容。如果 filename 用双引号括起来,则在源文件所在的位置查找该文件。如果在该位置没有找到文件,或者 filename 是用<>括起来的,则在系统目录中查找该文件。如果找不到文件,编译系统将显示出错信息。被包含的文件本身也可以包含 #include 指令。
  • C++语言支持 ANSI 标准定义的函数库(简称标准库),标准库中的函数、类型和宏在标准头文件中定义。在 C++ 语言中可以包含标准模板库(standard template library),使程序设计者更方便地编写程序。
  • 在算法竞赛中,使用bits/stdc++.h较为流行,这个头文件中包含了几乎所有C++库中的头文件,因此一般只需要包含这一个头文件就能满足所有的需求,简单便捷。但从另一个角度来看,由于包含了所有头文件,因此编译的速度自然就稍慢一些,增加了编译时间。而且这不是 C++ 的标准库,因而不是所有的编译系统都有。
  • C++ 语言是在 C 语言的基础上开发的,早期的 C++ 语言编译器是将 C++ 程序转换C 程序,再通过 C 编译器完成编译。当时 C++ 使用 C 语言的函数库,C++ 头文件仍然以 .h 为后缀,它们所包含的类、函数、宏等都是全局范围的。但如果有多人开发软件,由于各自分工,可能会出现变量或函数命名冲突的问题。为了解决这类问题,C++引人了命名空间(namespace)的概念。
  • namespace 是 C++中的关键字,用来定义一个命名空间。命名空间由{}包围,可包含变量、函数、类等。:: 称为域解析操作符,在 C++ 中用来指明要使用的命名空间。除了直接使用域解析操作符,还可以采用 using 声明。
  • 自 C++ 引入了命名空间的概念后,为了保持兼容性,C++ 语言保留原来的头文件保证其在 C++ 中可以继续使用,然后再把原来的函数库复制一份,并在此基础上稍加修改,把变量、函数、类等纳人命名空间 std(std 意为 standard)下,即”标准命名空间”这两份相似的函数库就可以分别被不同时期开发的程序同时使用,不会产生冲突。
  • 为了避免头文件重名,原来 C 语言的头文件的名字前添加了字母 c,比如 stdio.h 变成了 cstdio.h。C++ 函数库也对头文件的命名做了调整,去掉了后缀 .h,比如iostream.h变成了iostream。一般来说,对于不带 .h 的头文件,其变量、函数都位于命名空间 std 中,使用时需要声明命名空间 std。而对于带 .h 的头文件,则没有使用任何命名空间,所有符号都位于全局作用域中。