1.开始
预处理器指示符
预处理器指示符用“#”号标识, 这个符号将放在程序中该行的最起始一列上。处理这些指示符的程序被称做预处理器(preprocessor)(通常捆绑在编译器中)。
#include指示符读入指定文件的内容,它有两种格式:
#include <some_file.h>
#include "y_file.h"
如果文件名用尖括号“<”和“>”括起来,表明这个文件是一个工程或者标准头文件,查找过程会检查预定义的目录。我们可以通过设置搜索路径环境变量或命令行选项来修改这些目录。(在不同的平台上这些方法大不相同)
如果文件名用一对引号括起来,则表明该文件是用户提供的头文件,查找该文件时将从当前文件目录开始。
标准C++头文件没有后缀,因为在各种C++实现中,头文件的后缀各不相同。
由于嵌套包含头文件的原因,一个头文件可能会被多次包含在一个源文件中。条件指示符可以防止这种头文件的重复处理。例如:
#ifndef BOOKSTORE_H
#define BOOKSTORE_H
/* Bookstore.h的内容*/
#endif
条件指示符#ifndef检查BOOKSTORE_H在前面是否已经被定义。这里,BOOKSTORE_H是一个预编译器常量。(习惯上预编译器常量往往被写成大写字母。)如果BOOKSTORE_H在前面没有被定义,则条件指示符的值为真,于是从#ifndef到#endif之间的所有语句都将被包含进来处理。相反,如果#ifndef指示符的值为假,则它与#endif指示符之间的行将被忽略。
只要不存在两个必须包含头文件要检查一个同名的预处理器常量这样的情形,这个策略就能够很好的运作。
编译C++程序时,编译器自动定义了一个预处理器名字__cplusplus
(注意前面有两个下划线)。因此可以根据它判断该程序是否为C++程序。
编译标准C时,编译器将自动定义名字__STDC__
。当然,_cplusplus
与__STDC__
不会痛失被定义。
另外几个比较有用的预定义名字是:__LINE__
:记录文件已经被编译的行数,__FILE__
:包含正在被编译的文件的名字,__TIME__
:包含当前被编译文件的编译时间,__DATE__
:包含当前被编译文件的日期。
assert()是C语言标准库中提供的一个通用预处理器宏。在代码中常利用assert()来判断一个必需的前提条件。如果条件为假,断言失败,则程序输出错误信息,然后终止。
使用头文件的C名字,或者C++名字,两种情况下头文件的#include预处理器指示符的效果也会不同。下面的#include指示符:
#include <cassert>
将cassert的内容读入到我们的文本文件中,但是由于所有的C++库名字是在名字空间std中被定义的,因而在我们的程序文本文件中,它们是不可见的,除非用下面的using指示符显式地使其可见:
using namespace std;
使用C头文件的#include指示符:
#include <assert.h>
就可以直接在程序文本文件中使用名字assert(),而无需使用using指示符。
注释
注释对/*和*/不能嵌套,即一个注释对不能出现在另外一个注释对之中。
注释符双斜线//可用来注释一个单行。
输入/输出初步
C++的输入/输出功能由输入/输出流(iostream)库提供。输入/输出流库是C++中一个面向对象的类层次结构,也是标准库的一部分。
终端输入与cin绑定在一起,常与输入连接符>>连用;终端输出与cout绑定在一起,常与输出连接符<<连用;终端错误信息与cerr绑定在一起,常与输出连接符<<连用。
任何想要使用iostream库的程序必须包含相关的系统头文件:
#include <iostream>
iostream库也支持文件的输入和输出。所有能应用在标准输入和输出上的操作符,也都可以应用到已经被打开的输入或输出文件上。打开一个文件供输入或输出需要增加头文件:
#include <fstream>
本文只是对C++ Primer第一章知识点的我认为的重点进行概括,方便今后复习。希望能在阅读这本书的过程中留下些什么,有所收获。