在编译器对源程序进行实际编译之前,首先要由预处理器对程序文本进行预处理。预处理器提供了一组编译预处理指令和预处理操作符。预处理指令可以根据需要出现在程序的任何位置。
1.#include指令
也称为文件包含指令,其作用是将另一个源文件嵌入到当前源文件该点处。
#include指令可以嵌套使用,假设有嵌入一个头文件file1.h,file1.h中又可以含有#include”file2.h“这条嵌入指令。
2.#define和undef指令
#define有两个作用:
一是:定义一个常量,就和const一样
#define pi 3.14;
const double pi=3.14;
//选用下面的那种写法更好。
二是:简单点来说就是 做标记,给文件的状态做标记。
#define FILE1_H
这样写的目的,仅仅表是(FILE1_H这个文件已经定义过)这样一种文件状态,就和病毒侵染文件一样,在文件上留下一个标记方便判断。通常该符号配合条件编译一样使用。
3.条件编译指令
使用该指令,可以限定程序中的某些内容在满足一定条件的情况下才参与编译。因此,利用条件编译可以使同一个源程序在不同的编译条件下产生不同的目标代码。
(说白了就和我们长用的if—else语句一样,可以产生不同的效果)
c++中非0代表成立,0代表不成立。
写法(1)
#if 常量表达式 (常量表达式和下面的标识符要区分开)
程序段一 //当常量表达式非零时编译此程序段
#else
程序段二 //当常量表达式为零时编译此程序段,#else也可以不写,只写一个#if也可以
#endif
void test01() {
int a = 0;
#if a==0
cout << "条件成立" << endl;
#else
cout << "条件不成立" << endl;
#endif
}
写法(2)
多种选择。
#if 常量表达式1
程序段一 //当常量表达式1非零时编译此程序段
#elif 常量表达式2
程序段二 //当常量表达式1为零,常量表达式2非零时编译此程序段
.
.
.
#else
程序段n+1 //上面情况都不满足时编译本程序段
#endif
写法(3)
#ifdef,下面还有一个类似的#ifndef,中间多了个n,意思恰恰相反。
#ifdef 标识符(注意这里换了,不是常量表达式了)
程序段一
#else
程序段二
#endif
//如果标识符经过#define定义,且没有被undef删除,则编译程序段一,否则编译程序段二 ,如果没有程序段二,#else可以省去
如果还有程序段三,四.......,则加上#elif
#define DEBUG
int main()
{
#ifdef DEBUG
cout << "条件成立,DEBUG已经定义了!" << endl;
#else
cout << "条件不成立,DEBUG还没定义" << endl;
#endif
return 0;
}
下面是inndef的情况,上面的写法可以等价为下面的写法
#ifndef 标识符(注意这里换了,不是常量表达式了)
程序段一
#else
程序段二
#endif
#define DEBUG
int main()
{
#ifndef DEBUG
cout << "条件不成立,DEBUG已经定义了!" << endl;
#else
cout << "条件成立,DEBUG还没定义" << endl;
#endif
return 0;
}
//要注意的是,如果是#define 宏名, #define DEBUG,这时候就必须使用#ifdef或#ifndef与之对应,#if不行
//如果是#define 宏名 宏体,如 #define NUM 1,#if 和#ifdef都可以使用。