在编写C++程序时,我们经常会用到#include、#define、#undef、#if、#ifdef、#ifndef、#error……等等预处理指令,这些指令是做什么用的呢?
在预处理过程中,扫描源代码,对其进行初步的转化,产生新的源代码提供给编译器,顾名思义,预处理过程先于编辑器对源代码进行处理。
在C语言中,并没有内在的机制来完成下面的一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码 。要完成这些工作就需要使用预处理程序。尽管目前大多数编译器中都包含了预处理程序,但通常认为它们是独立于编译器的。
预处理过程:读入源代码 - 检查包含预处理指令的语句和宏定义 - 对源代码进行相应的转换 ; 预处理过程还会删除程序中的注释和多余的空白字符;
预处理指令是以 # 开头的代码行,# 必须是此行除了空白字符以外的第一个字符,# 以后是关键字 , 整行语句构成一条预处理指令,该指令将在编译器进行编译之前对源代码进行某些转换;
指令 用途
# 空指令,无任何效果
#include 包含一个源代码文件
#define 定义宏
#undef 取消已定义的宏
#if 如果条件为真,则编译下面的内容
#ifdef 如果宏已经定义,则编译下面的内容
#ifndef 如果宏没有定义,则编译下面的内容
#elif 条件 #if 的条件不为真,当前条件为真,则编译下面内容
#endif 结束一个条件编译块
#error 停止编译,并显示错误信息
#pragma warning 屏蔽错误提示
一、文件包含(#include)
在程序中包含某个头文件可以有两种方式:#include<文件名> 或 #include"文件名"
第一种方法使用尖括号把头文件包含进来,这种格式告诉预处理程序在编译器自带的或外部库的头文件搜索被包含的头文件
第二种方法是使用双引号把头文件包含进来,这种格式告诉预处理程序在当前的被编译的应用程序源代码文件中搜索被包含的文件,如果找不到,再在编译器中搜索
采用两种包含的理由在于,编译器是安装在公共子目录下的,而被编译的程序是在他们私有的子目录下,一个程序既包含编译器公共头文件,也包含自定义的私有头文件,使用两种不同的包含格式,使得编译器在许多头文件中区别出一组公共的头文件;
简单说就是:该指令在编译时会将头文件的内容插入到当前文件中,使得当前文件可以引用头文件中声明的结构体、类、函数、宏等等。若是<头文件名>那么编译器将在工程的VC++包含目录中查找,若是"头文件名"那么编译器将优先在工程文件夹下查找。
二、宏(#define)
#define 用来定义宏,该指令格式:首先声明一个标示符,然后给出这个标示符对应的代码,在后面的源码中就用这些代码代替这个标示符
#define ONE 1
#define TWO 2
#define THREE (ONE + TWO)
int a = THREE * 3 ; // 在定义 THREE 时,为了谨慎起见,一定要加上一个括号
宏定义实质上是字符串替换,编译时所有的宏都将展开,定义宏可以方便大量重复的代码的修改,另外提高程序的可读性。
#include<iostream>
#define BEBUG 0
using namespace std ;
int main() {
#if BEBUG
cout << "YES" << endl ;
#elif !BEBUG
cout << "NO" << endl ;
#endif
return 0 ;
}