版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Richard__Ting/article/details/84843891
C++之编译预处理
引言
想必学习C++的朋友们对这个是十分熟悉的了。一个 C++ 程序需要经过编译器编译成功后生成目标代码,再结合链接库,形成链接程序,最后经运行调试,才能得到正确的程序。
这里讲得就是关于编译预处理的一些基础知识。
在编辑器对源程序进行编译之前,首先要由预处理器对程序文本进行预处理。
预处理器提供了一组编译 预处理指令 和 预处理操作符 。
预处理指令
所有预处理指令在程序中都是以 “#” 引导,独占一行,无需分号结束,可出现在程序任意位置。
1. #include 指令
文件包含指令,作用是将另一个源文件嵌入到当前源文件中。
包含两种格式:
- #include<文件名>
按照标准方式搜索(文件谓语系统目录的 include 子目录下) - #include “文件名”
首先在当前目录中搜索,若没有,再按标准方式搜索。
#include
可以嵌套使用。所以,你有可能在一个头文件 myhead.h
中看到:
#include "file1.h"
#include "file2.h"
2. #define 指令和 #undef 指令
- 定义符号常量(但是一般推荐 const 修饰)
#define PI 3.14
- 定义空符号
#define MYHEAD_H
这种方式一般配合条件编译指令一起使用,后面会提到。
# undef
作用是删除由# define
定义的宏,使其不起作用。
3. 条件编译 指令
可以限定程序中的某些内容要在满足一定条件的情况下才参与编译。利用条件编译可以使同一个源程序在不同的编译条件下产生不同的目标代码。
大致形式:
# if 常量表达式
程序段 //当“常量表达式”非0时编译本段程序段。
# endif
预处理操作符
defined 操作符
先看看怎么用吧。
#if!defined(MYHEAD_H)
#define MYHEAD_H
...
#endif
等同于 (下面的常用些):
#ifndef MYHEAD_H
#define MYHEAD_H
...
#endif
大致意思是,若 “标识符” 在此前经过 # define
定义过,并且未被 # undef
删除,则上述表达式非 0 ,非则为 0 。
例子
例如有个工程。
//main.cpp
#include "file1.h"
#include "file2.h"
int main(){
...
}
//file1.h
#include "head.h"
...
//file2.h
#include "head.h"
...
//head.h
...
class Point{
...
}
...
合起来,也就是:
//main.cpp
#include "file1.h"
#include "head.h"
...
class Point{
...
}
#include "file2.h"
#include "head.h"
...
class Point{
...
}
int main(){
...
}
同时包含了两次 head.h
,不可取。
修改如下:
//head.h
#ifndef HEAD_H
#define HEAD_H
...
class Point{
...
}
...
#endif
这样可以保证刚开始判断 HEAD_H
是否被定义过,如果没有被定义,则可以参与编译。
总结
预处理指令 | 作用 | 预处理操作符 | 作用 |
---|---|---|---|
#include 指令 | 将另一个源文件嵌入到当前源文件中 | defined 操作符 | 看例子吧 |
#define 指令和 #undef 指令 | 定义符号常量,删除宏 | ||
条件编译 指令 | 可以限定程序中的某些内容要在满足一定条件的情况下才参与编译 |