《VC编译预处理.ppt》由会员分享,可在线阅读,更多相关《VC编译预处理.ppt(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、编译预处理编译预处理 5.8.编译预处理编译预处理 编编译译预预处处理理是是一一种种指指令令,它它不不是是C+的的语语句句,因因此此不不属属于于C+的的语语法法范范围围。这这种种指指令令必必须须以以#开开头头,结结尾尾没没有有分分号号,一一个个指指令令占占一一行,故以键入回车结束。行,故以键入回车结束。根根据据不不同同用用途途,编编译译预预处处理理又又分分为为三三种种形形式式:文文件件包包含含、宏宏定定义义和条件编译。下面分别介绍。和条件编译。下面分别介绍。5.8.1 包含文件包含文件 将将一一个个源源程程序序文文件件的的全全部部内内容容引引入入到到当当前前使使用用的的程程序序中中,使使它它称
2、称为当前程序的一部分,这个引入的文件就称为包含的文件。例如为当前程序的一部分,这个引入的文件就称为包含的文件。例如#includevoid main().包含指令包含文件,用于管理I/O流的头文件与函数main()一起构成一个程序文件 5.8.编译预处理 通常,用括起来的包含文件是系统提供的预定义文件。C+也允许用户自己设计预定义文件,自己定义则用“”括起来。例如#includevoid main().#include“file.h”int x=200;float y=100;char a=a,b=b;file.h自编一个名为file.h的文件然后用预处理指令插入这个程序中int x=200;
3、float y=100;char a=a,b=b;这相当于 5.8.编译预处理编译预处理 通通常常,用用括括起起来来的的包包含含文文件件是是系系统统提提供供的的预预定定义义文文件件。C+也也允许用户自己设计预定义文件,自己定义则用允许用户自己设计预定义文件,自己定义则用“”括起来。例如括起来。例如#includevoid main().#include“file.h”int x=200;float y=100;char a=a,b=b;file.h自编一个名为file.h的文件然后用预处理指令插入这个程序中int x=200;float y=100;char a=a,b=b;这相当于 5.8.
4、编译预处理编译预处理 请请注注意意,预预处处理理文文件件被被包包含含后后就就成成为为临临时时文文件件,执执行行结结束束后后并并不不改变原文件的内容。其详细描述参阅改变原文件的内容。其详细描述参阅P88。#includevoid main().#include“file.h”int x=200;float y=100;char a=a,b=b;file.h 5.8.2 宏定义宏定义 这是这是C+提供的又一种编译预处理指令。请看下面举例:提供的又一种编译预处理指令。请看下面举例:#includevoid main()float v;.#define PI 3.14159coutPIn;宏定义指令宏
5、名标识符习惯用大写字符或字符串引用,称为宏展开输出结果是:3.14159 5.8.2 宏定义 这是C+提供的又一种编译预处理指令。请看下面举例:#includevoid main()float v;.#define PI 3.14159v=10*AREA#define R 5#define AREA PI*R*RcoutVvn;#define V “体积为:”宏名替换相当于:3.14159*5*5宏展开相当于:10*3.14159*5*5宏展开,输出结果是:体积为体积为:785.3975先定义后引用 5.8.2 宏定义 另一种宏定义:#includevoid main()float v;.#d
6、efine PI 3.14159#define VOLUMN(r,h)r*r*PI*h带参宏定义参数列表使用参数的字符或字符串与括号间不可有空格则为无参宏定义 5.8.2 宏定义#includevoid main()float v;.#define PI 3.14159v=VOLUMN(5,10);#define VOLUMN(r,h)r*r*PI*h宏展开,相当于:5*5*3.14159*10 另一种宏定义:宏定义的详细规则,请阅读P8891。5.8.3 条件编译条件编译 预处理指令还有一种形式就是条件编译,先举例说明预处理指令还有一种形式就是条件编译,先举例说明#define A 6flo
7、at area;a2.h#include“a2.h”#define B A*16a1.h 假如有两个头文件a1.h和a2.h,在文件a1.h中又包含了a2.h的全部内容。这相当于#define A 6 float area;#define B A*16a1.ha2.h文件的内容 如果对这两个头文件并不完全清楚,而在一个源程序中将a1.h、a2.h都作为包含文件,例如 5.8.3 条件编译 显然,标识符A被重复定义,这是系统所不允许的。如何解决呢?#define A 6float area;a2.h#include“a2.h”#define B A*16a1.h#include#include“
8、a1.h”#include“a2.h”#define PI 3.14159void main().a.cpp#define A 6 float area;#define B A*16a1.h简单的文件容易解决如果a1.h、a2.h很复杂,则可采用条件编译 5.8.3 条件编译 例如#ifndef _A2_H#define _A2_H#define A 6float area;#endifa2.h条件编译指令,表示如果文件a2.h未未编译过就编译下面的程序段其中n相当于no程序段文件a2.h的宏名格式条件编译结束指令 同理,文件a1.h也可采用条件编译,例如 5.8.3 条件编译#ifndef
9、_A2_H#define _A2_H#define A 6float area;#endifa2.h#include“a2.h”#ifndef _A1_H#define _A1_H#define B A*16#endifa1.h 例如 同理,文件a1.h也可采用条件编译,例如 这样,如果再在源程序中插入以上两个包含指令,就不会发生一个标识符重复定义的编译错误。例如:同时包含了a2.h中的所有内容 5.8.3 条件编译 当编译到a2.h时,#include#include“a1.h”#include“a2.h”#define PI 3.14159void main().a.cpp 由于a2.h中
10、存在条件编译,系统不再编译它 根据编译指令,条件编译共有三种形式,即:#ifndef 宏宏名名、#ifdef 宏名宏名、#if 表达式表达式,每种形式有两种结构:5.8.3 条件编译#ifndef 宏名宏名 程序段程序段#endif#ifdef 宏名宏名 程序段程序段#endif#ifndef 宏名宏名 程序段程序段1#else 程序段程序段2#endif#ifdef 宏名宏名 程序段程序段1#else 程序段程序段2#endif#if 表达式表达式 程序段程序段#endif#if 表达式表达式 程序段程序段1#else 程序段程序段2#endif 5.9 内部函数与外部函数多文件组织 前面已
11、经介绍,在一个程序文件中定义的全局量,如果不想让另一个程序文件引用,可将它定义为静态类型static,否则既可被另一个文件引用。如果文件fi1e2.cpp要引用fi1e1.cpp中允许引用的全局量,必须在fi1e2.cpp中对企图引用的全局量进行外部extern说明。上述关于全局量的规则,同样适用于函数。例如extern f1(flaot x,int y).static f2(flaot a,int b).fi1e1.cpp文件外部函数允许其它文件引用文件内部函数不允许其它文件引用不作extern定义,则默认为允许引用 5.9 内部函数与外部函数内部函数与外部函数多文件组织多文件组织 当当然然,若若有有两两个个或或两两个个以以上上的的文文件件需需要要互互相相交交换换数数据据时时,必必须须将将它它们们同同时时调调入入内内存存进进行行编编译译和和连连接接,称称为为多多文文件件组组织织。编译连接的详细描述,参阅P96 f1(flaot x,int y).static f2(flaot a,int b).fi1e1.cppextern f1(flaot,int)f3(int s).s=f1(2.5,s);fi1e2.cpp引用前的原型说明引用
限制150内