三、C++预处理器
C++和C语言一样,也使用一个预处理器,在程序进行主编译之前对源文件进行处理,有些C++实现使用翻译器程序将C++程序转化为C语言程序,虽然翻译器也是一种预处理器,但是这里不讨论这种预处理器。而是只讨论以#
打头的预处理指令。
(1)头文件名
C++中预处理指令#include
所包含的文件名,被称为头文件(header file),C++编译器自带了很多头文件,每个头文件都支持一些特定的工具。C语言的传统是头文件使用拓展名.h
,但是C++的用法变了,C++对老式的C语言头文件保留了拓展名.h
(C++程序仍然可以使用这种头文件),而C++头文件则没有拓展名。有些C语言头文件被转化成C++头文件,这些头文件被重新命名,去掉了拓展名.h
(使之称为C++的风格的名称),并在文件名前面加上前缀c
(表明来自C语言),例如,C++版本的math.h
为cmath
。
(2)名称空间
名称空间支持是一项C++特性,旨在编写大型程序以及将多个厂商的现有代码组合起来的程序时更加容易,有助于组织程序。按照这种方式,类、函数和变量都是C++编译器的标准组件,它们现在都被放置在名称空间std
中。仅当头文件没有扩展名h
时,情况才是这样的。这意味着在iostream
中定义的用于输出的cout
变量实际上是std::cout
,而endl
变量实际上是std::endl
。为了简化这种操作,可以使用using
编译指令使得std
名称空间中的所有名称都可用,而不必再添加std::
前缀。例如:
#include <iostream> //未使用using编译指令
std::cout << "Hello World!";
std::cout << std::endl;
#include <iostream> //使用using编译指令
using namespace std;
cout << "Hello World!";
cout << endl;
using namespace std;
这条using
编译指令使得std
名称空间中的所有名称都可用。这其实是一种偷懒的做法,在大型项目中有一个潜在的问题。更好的方法是,只使所需的名称可用,这可用通过使用using
声明来实现:
using std:: cout; //make cout avaliable
using std:: endl; //make endl avaliable
用这些编译指令后,便可用使用cout、endl
,而不必加上std::
前缀。
当前通行的理念是,只让需要访问名称空间std
的函数访问它是最好的选择,下面是不同的访问std
名称空间的方法:
1、将
using namespace std;
放在函数定义之前,让文件中所有的函数都能够使用名称空间std
中所有元素。2、将
using namespace std;
放在特定的函数定义中,让该函数能够使用名称空间std
中的所有元素。3、在特定的函数中使用类似
using std::cout;
这样的指令,而不是使用using namespace std;
让该函数能够使用特定的元素,如cout
。4、完全不使用编译指令
using
,而在需要使用名称空间std
中的元素时,使用前缀std::
。