第10章 预处理
10.1预处理指令
指令 | 含义 | 实例 |
#define | 定义宏 | #define_DEBUG |
#undef | 取消宏的定义 | #undef_DEBUG |
#if | 判断 | #if defined_DEBUG |
#else |
| cout<<”debug”<<endl; |
#elif |
| #else |
#endif |
| cout<<”release”<<endl;#endif |
#error | 输出错误信息 | #error INVALID PARAMETER |
#include | 包含文件 | #include<iostream> |
10.2宏指令
又称替换指令
10.2.1宏
#define指令用以定义一个宏(macro),如:
#define MAX 9 //预处理之后,这些MAX将会被替换成9
预处理语句不需要分号“;”
也可以将宏定义为一个表达式,如:
#define MAX 9
#define MAX2 MAX*MAX
10.2.2 带参数的宏
宏可以包含参数,如:
#define SQUARE(x) x*x
int main()
{
cout<<”99的平方是:”<<SQUARE(99)<<endl;
return 0;
}
定义宏函数的时候没建议将参数和表达式加上尽可能多的“()”,如:
#define SQUARE(x) ((x)*(x))
也可以定义包含多个参数的宏函数,如:
#define ADD(a,b) ((a)+(b))
宏函数的有点,避免了C++的强类型检测
10.2.3 宏与常数、函数*
P163
10.2.4 #操作符 ??
如果宏定义中出现#,预处理器会将其#后面的参数括成一个字符串进行替换
10.2.5 ##操作符
##用以将2侧的参数合并成一个,如:
#define RGB (rr,gg,bb) 0x##rr##gg##bb
int red = RGB(FF,00,00);
该语句会被替换为
int red = 0xFF0000;
10.2.6 取消宏
宏不允许被重新定义
#define SIZE 10
#define SIZE 12 //error
要修改宏的值,必须先取消他,“#undef”用以取消指定名字的宏,如:
#define SIZE 10
#undef SIZE
#define SIZE 12 //ok
10.2.7 C++预定义宏
以下宏不需要定义,已经定义好了
宏名称 | 含义 |
__LINE__ | 整数,代表当前代码所在行数 |
__FILE__ | 字符串,代表当前代码所在的文件路径 |
__DATE__ | 字符串,代表当前文件的编译日期,格式“Mmm dd yyyy” |
__TIME__ | 字符串,代表当前文件的编译时间,格式“hh:nn:ss” |
__STDC__ | 代表是否为标准C |
__cplusplus | 长整数,代表当前的C++版本 |
10.3 条件编译指令
10.3.1 #if…#endif
类似与流程控制中的if语句
10.3.2 #else
#else 与#if配套使用,与流程控制一样,它指定#if条件不符合时候的操作
10.3.3 #elif
#elif为#else #if的组合
10.3.4 #if defined 和#if !defined
#if defined 用以检测指定的宏是否已定义,如:
#if defined VERSION
cout << “软件版本:”<< VERSION << endl;
#else
cout << “未指定版本” << endl;
#endif
可以使用!操作符,指定某个宏没有被定义的情形,如:
#if !defined VERSION
cout << “未指定版本” <<endl;
#endif
10.4文件包含指令
10.4.1 #include
当#include指令后的文件名用“<>”括起来,它只是预处理器从与舍得标准路径中搜索指定的头文件
另一种用“""”括起来的表示从相对路径搜索
C标准库的头文件包括:
<cassert>:assert宏的定义
<cctype>:字符操作函数的声明
<cerrno>:错误码的定义
<cmath>:数学函数库
<csetjmp>:错误处理库
<cstdarg>:可变参数处理宏的定义
<stdio>:标准输入输出函数的声明
<stdlib>:梳子函数、内存管理函数、系统函数、随机函数的声明
<cstime>:时间、日期操作函数声明
<cstring>:C类型的字符串的操作函数声明
C++标准库的头文件包括:
<string>:字符串
<iostream>:流操作
<fstream>:文件流
<complex>:复数
<stdexcept>:标准异常
STL:标准模板库
10.4.2 合理使用头文件
被包含的文件通常被成为“头文件”
一般设计头文件的时候加入一下部分可以避免重定义的发生
#ifndef __HEADER_POINT_H__
#define__HEADER_POINT_H__
结构
#endif
HEAD_H部分可以随便换
10.5其他标准指令
10.5.1 #error
当编译器遇到#error指令时,他会听下来,并在编译窗口(不是运行窗口)输出#error后面的信息
10.5.2 #line
用以改变当前行的行号和文件名,如:
#line 100
#line 100 “core.cpp”
10.5.3 #pragma
每个编译器可以定义属于他自己的#progma指令