C++学习笔记(16)
1.预处理指令不是C++语句,但它们可以改善程序的组织和管理,以“#”号开始,每条指令独占一行,可以出现在程序的任何地方。
2.文件包含:在编译之前把指定文件的文本抄写在该指令所在位置,用于支持多文件形式组织的C++程序。
#include<文件名> //用于C++提供的系统标准头文件;
#include"文件名" //一般用于程序员自己定义的头文件;
3.宏定义:用来指定正文替代程序中出现的标识符。
#define 标识符 文本
不带参数用来定义常量,带参数用来定义函数。
4.条件编译:可以用一个常量的值作为判断条件来决定源程序中某一段代码是否参与编译。
有三种形式:
①
#if 常量表达式
程序文本
#endif
若“常量表达式”的值为真,则“程序文本”参与编译;
②
#if 常量表达式
程序文本1
#else
程序文本2
#endif
若“常量表达式”为真,则“程序文本1”参与编译;否则,“程序文本2”参与编译。
“常量表达式”必须在编译时(程序执行之前)就有确定值,不能在“常量表达式”中进行强制类型转换,不能进行sizeof计算,不能是枚举变量。
③
#ifndef 标识符
#define 标识符
程序文本
#endif
若“标识符”没有定义,则“程序文本”被编译,若已被定义则忽略。
第一二种形式通常用于程序调试阶段注释掉一大段待调试的代码:
#if 0
待调试代码
#endif
//当需要时改为“#1”就可以了。
第三种形式用于避免include指令嵌入文本导致联编时出现重定义的错误,可以起到编译时阻隔作用。
声明语句可以在同一个文件重复出现。
5.程序的其他文件也能够访问全局变量,但必须在使用该全局变量的每个文件中用关键字extern声明。
函数原型默认为extern,因此函数原型声明和函数定义可以放在不同文件。
如果想限制全局变量或函数的作用范围仅仅在定义它的文件中,则可以使用存储说明符static,此时其他文件无法访问。
6.命名空间是类、函数、对象、类型和其他名字声明的集合。
std是C++的标准命名空间,包含了标准头文件中各种名字的声明。
C++标准头文件有:
iostream iomanip limit
fstream string typeinfo
stdexcept
标准头文件没有拓展名,使用时需要指定命名空间。
using namespace std;
其中namespace是关键字,用于说明命名空间;
若不用using声明命名空间,则要在使用时指定(例:using std::cin;或 std::cin)
对于C语言的标准头文件:stdlib.h
math.h asser.h string.h ctype.h
可以在头文件名加上前缀c从而去掉文件拓展名。
注意区分:
cstring:为了调用C的串处理函数;
string:为了使用标准类库中的string类及其操作;
7.namespace和using机制:命名空间用于创建程序包,其中所有定义的名字都是命名空间的元素,可以用作用域运算符指明,从而防止意义模糊。同样遵守先说明再使用的原则。
定义命名空间:
namespace 标识符
{语句序列}
namespace是关键字;
标识符是用户定义的命名空间的名字;
语句序列可以包括类、函数、对象、类型和其他命名空间的说明和定义。
使用命名空间:
using namespace 命名空间;
或
using 命名空间::元素;
8.C++除了return语句可以终止函数执行,还有:
①abort函数
函数原型:void abort(void);
中断程序执行,返回C++系统的主窗口,在iostream
和cstdib头文件中说明。
当选择“重试”时将会在程序代码中标识断点。
②assert函数
函数原型:void assert(int expression);
计算expression的值,若该值为false则中断程序执行,显示中断执行所在文件和程序行,返回主窗口。在cassert头文件中说明。
触发assert()时会直接输出
Assertion failed:()内的条件
且会指出所触发的assert函数在程序正文的第几行。
③exit函数
函数原型:void exit(int status);
中断程序执行,返回退出代码(将status返回操作系统,通常为0或1,该参数可以省略),回到主窗口。在iostream和cstdlib头文件中说明。