C++的预编译(预处理),是指在C++程序源代码被编译之前,由预处理器对C++程序源代码进行的处理。这个过程并不对程序的源代码进行解析,但它把源代码分割或处理成为特定的符号用来支持宏调用。
程序的编译过程可以分为预处理、编译、汇编三部分,其中预处理是首先执行的过程,预处理过程扫描程序源代码,对其进行初步的转换,产生新的源代码提供给编译器。预处理过程读入源代码之后,会检查代码里包含的预处理指令,完成诸如包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码的工作。
总之,预编译程序的作用就是根据源代码中的预编译指令修改源代码。而预编译程序是由一系列和预编译相关的的命令符组成的。预编译指令以“#”作为起始标志,其后紧跟预编译指令关键字,之后是空格,空格之后是预编译指令的内容。
定义变量和取消定义变量
预编译程序是通过define和undef指令实现定义变量和取消定义变量的。undef的作用是取消该指令前面的的程序使用define定义的宏变量。
简单示例
#include "iostream"
using namespace std;
int main()
{
#define A 20
cout<<"A:"<<A<<endl;
#undef A
#define A 50
cout<<"A:"<<A<<endl;
system("pause");
return 0;
}
输出结果
A:20
A:50
请按任意键继续. . .
条件预编译指令
一般情况下,程序的每一行源代码都是要编译的。特殊情况下,只有满足一定条件的程序才需要编译,这就是条件编译。常用的条件编译关键字主要有#if、#ifdef、#ifndef、#else、#elif和#endif,这几个关键字的组合一般三种形式。
(1)第一种形式
这种组合形式的功能是当表达式的值为“真”(非零)时,编译程序段1;否则,编译程序段2。
#if 表达式
程序段1
#else
程序段2
#endif
(2)第二种形式
#ifdef 标识符
程序段1
#else
程序段2
#endif
(3)第三种形式
#ifndef 标识符
程序段1
#else
程序段2
#endif
简单示例
#include <iostream>
using namespace std;
#define ABCD 2
int main ()
{
//1
#ifdef ABCD
cout<< "1:yes\n" ;
#else
cout<< "1:no\n" ;
#endif
//2
#ifndef ABCD
cout<<"2:no\n ";
#elif ABCD == 2
cout<<"2:yes\n";
#else
cout<<"2:no2\n" ;
#endif
//3
#if !defined(DCBA)&&(ABCD<2*4-3)
cout<<"3:yes\n";
#endif
system("pause");
return 0;
}
输出结果
1:yes
2:yes
3:yes
请按任意键继续. . .
包含头文件指令
关键字include是最常见的预编译指令之一。其功能是将被包含的文件中的源代码放进源文件中,从而实现代码重用。
常见的形式为:
#include “文件名.h”
例如:
#include “stdio.h”
#include <iostream>
#line预编译指令
#line预编译指令的作用是修改代码行的行号以及编译源文件的名字。
特殊预编译指令
1、#error指令
#error指令可以强制停止编译程序,并给出提示信息。
2、#pragma指令
#pragma指令的参数有很多种形式,每种形式都代表了一种不同的功能,#pragma指令的参数的形式如下:
- message
- argsused
- exit/startup
- inline
- once
- warning
- code_seg和data_seg
- resource
- saveregs
- hdrstop/hdrfile
(1) #pragma message
#pragma message指令使用于提示一些有用的信息,程序编译的过程中,在编译信息窗口输出这些信息。
简单示例
(2)#pragma argsused
#pragma argsused指令仅允许出现在函数定义之间,且仅影响下一个函数,使警告信息被禁止或者无效。
(3)#pragma exit/startup
pragma startup指令可以实现设置程序启动之前需要执行的函数;pragma exit指令可以实现设置程序退出之前需要执行的函数。
简单示例
(4)#pragma once
#pragma once指令可以实现仅编译一次该头文件。一般#pragma once放在头文件的最开始。
(5)#pragma warning
#pragma warning可以实现设定提示信息的现实与否以及如何显示。例如:
#pragma warning (disable:4507 34)
功能:不显示4507和34号警告信息
#pragma warning (once:4385)
功能:仅显示一次4385号信息
#pragma warning (error:164)
功能:将164号警告信息作为一个错误信息显示
#pragma warning (push)
功能:保存所有警告信息的现有警告状态
#pragma warning (pop)
功能:从栈中弹出最后一个警告信息