欢迎来到天天文库
浏览记录
ID:4153175
大小:503.27 KB
页数:25页
时间:2017-11-29
《跟我学c程序设计--编译预处理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、跟我学C程序设计预处理是C语言的一个重要功能,它由预处理程序负责完成。所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。本章将具体介绍C语言中预处理的3种形式:宏、文件包含和条件编译。252编译预处理11◎编译预处理的功能和分类。◎C语言中宏的定义和应用。◎C语言中文件包含的应用。◎C语言中条件编译的应用。11.1预处理概述在前面各章的示例程序中,已多次使用过以“#”号开头的预处理命令。如包含命令#include,宏定义命令#de
2、fine等。在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,它们称为预处理部分。简单来说,预处理就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译。这样做的好处是,经过处理后的代码,将会变得很精短。为让用户更好地使用预处理,C语言提供了丰富的预处理命令,主要包括#define、#if、#else、#endif、#ifdef、#ifndef等。由上述命令读者可以看出,每个预处理指令均带有符号“#”。简单来说,上面的这些预处理命令可以划分为宏、文件包含、条件编译等3个大类。¾宏替换(#define)是最常见的用法,其可以定义符号常
3、量、函数功能、重新命名、字符串的拼接等各种功能。¾文件包含(#include)是一种最为常见的预处理,主要是作为文件的引用组合源程序正文。¾条件编译(#if,#ifndef,#ifdef,#endif,#undef等)也是比较常见的预处理,主要是进行编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制、防止对文件重复包含的功能。253跟我学C程序设计读者可以看出,C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。11.2宏宏是程序设计语言中使用较为广泛的一个概念,简
4、单来说,宏是一种以相同的源语言执行预定义指令序列的指令。在C语言中,通过宏的使用,可以将一个表达式定义成宏,并在C语言的源程序中随意调用。11.2.1宏概述在C语言源程序中,允许用一个标识符来表示一个字符串,称为“宏”。被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为宏替换或宏展开。与变量和函数的使用相同的,宏在使用前也必须先定义。一般来说,在C语言中,使用宏时要注意如下的事项。¾宏名一般用大写。¾使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如,数组大小常用宏定义。¾预处理是在编译
5、之前的处理,而编译工作的任务之一就是语法检查,预处理不作语法检查。需要注意的是,宏定义是由源程序中的宏定义命令完成的,宏替换是由预处理程序自动完成的。在C语言中,宏分为无参数和有参数两种,因此宏定义也分为无参宏定义和带参宏定义两种。11.2.2无参宏定义所谓无参宏也即不带参数的宏,定义不带参数的宏称为无参宏定义,其宏名后不带参数。在C语言中,其定义的一般形式为:#define标识符字符串其中,参数定义如下。¾“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令,“#define”为宏定义命令。¾“标识符”为所定义的宏名。254编译预处理11¾“字符串”可
6、以是常数、表达式、格式串等。例如,下面示例定义了一个宏Y,其表示一个表达式(i*i+3*i),示例代码如下。01#defineY(i*i+3*i)/*无参宏定义*/02voidmain()03{04ints,i;05printf("Pleaseinputanumber:");06scanf("%d",&i);/*输入整型变量i的值*/07s=3*Y+4*Y+5*Y;/*调用宏*/08printf("s=%d",s);/*输出运算结果*/09}该程序通过语句定义宏#defineY(i*i+3*i)定义了Y表达式,在编写源程序时,所有的(i*i+3*i)都可由Y代
7、替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(i*i+3*i)表达式去置换所有的宏名Y,然后再进行编译。在TC2.0中编译运行上述程序后,其运行结果如图11-1所示。图11-1无参宏定义读者可以看出,上例程序中首先进行宏定义,定义Y表达式(i*i+3*i),在s=3*Y+4*Y+5*Y中作了宏调用。在预处理时经宏展开后该语句变为:s=3*(i*i+3*i)+4(i*i+3*i)+5(i*i+3*i);在宏定义中,表达式(i*i+3*i)两边的括号不能少。否则会发生错误。例如上述代码中,将宏定义改为以下定义:#defineYi*i+3*i在宏展开时将得到
8、下述语句:
此文档下载收益归作者所有