浅谈C语言中预处理
2016-11-18曾祥宇王璐瑶张珂鹭
曾祥宇 王璐瑶 张珂鹭
摘 要:C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。C语言在很多方面都可以用,不仅仅是在软件开发上,各类科研都是需要用到C语言的。具体应用比如我是学硬件的,单片机以及嵌入式系统都可以用C来开发。C语言发展如此迅速,而且成为最受欢迎的语言之一,主要因为它具有强大的功能。许多著名的系统软件,如DBASE Ⅲ PLUS、DBASE Ⅳ 都是由C 语言编写的。用C语言加上一些汇编语言子程序,就更能显示C语言的优势了。
关键词:C语言;预处理;宏定义
编译预处理是C语言一个重要且特别的功能.在进行C语言程序设计时,灵活使用编译预处理技术可使源程序模块化结构好,更加清晰和便于阅读,并易于调试和移植。所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所做的工作。预处理是C语言的一个重要功能, 它由预处理程序负责完成。当对一个源文件进行编译时,系统把自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。在嵌入式系统编程中不管是内核的驱动程序还是应用程序的编写,涉及大量的预处理与条件编译,这样做的好处主要体现在代码的移植性强以及代码的修改方便等方面。因此引入了预处理与条件编译的概念。
在C语言的程序中可包括各种以符号#开头的编译指令,这些指令称为预处理命令。预处理命令属于C语言编译器,而不是C语言的组成部分。通过预处理命令可扩展C语言程序设计的环境。
1 预处理的工作方式
预处理的行为是由指令控制的。这些指令是由#字符开头的一些命令。
#define指令定义了一个宏——用来代表其他东西的一个命令,通常是某一个类型的常量。预处理会通过将宏的名字和它的定义存储在一起来响应#define指令。当这个宏在后面的程序中使用到时,预处理器“扩展”了宏,将宏替换为它所定义的值。
#include指令告诉预处理器打开一个特定的文件,将它的内容作为正在编译的文件的一部分“包含”进来。例如,下面这行命令:
#include
2 宏定义命令——#define
使用#define命令并不是真正的定义符号常量,而是定义一个可以替换的宏。被定义为宏的标示符称为“宏名”。在编译预处理过程时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。
在C语言中,宏分为有参数和无参数两种。
2.1 无参数的宏
其定义格式如下:
#define宏名 字符串
在以上宏定义语句中,各部分的含义如下:
第一,#:表示这是一条预处理命令(凡是以“#”开始的均为预处理命令)。第二,define:关键字“define”为宏定义命令。第三,宏名:是一个标示符,必须符合C语言标示符的规定,一般以大写字母标示宏名。第四,字符串:可以是常数,表达式,格式串等。在前面使用的符号常量的定义就是一个无参数宏定义。
Notice:
预处理命令语句后面一般不会添加分号,如果在#define最后有分号,在宏替换时分号也将替换到源代码中去。在宏名和字符串之间可以有任意一个空格。
Eg:#define PI 3.14
在使用宏定义时,还需要注意以下几点:
第一,宏定义是宏名来表示一个字符串,在宏展开时又以该字符串取代宏名。这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。第二,宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。第三,宏名在源程序只能够若用引号括起来,则预处理程序不对其作宏替换。第四,宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层替换。第五,习惯上宏名可用大写字母表示,以方便与变量区别。但也允许用小写字母。
2.2 带参数的宏
#define命令定义宏时,还可以为宏设置参数。与函数中的参数类似,在宏定于中的参数为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,还要用实参去代换形参。
带参宏定义的一般形式为:
#define 宏名(形参表) 字符串
在定义带参数的宏时,宏名和形参表之间不能有空格出现,否则,就将宏定义成为无参数形式,而导致程序出错。
Eg:#define ABS(x) (x)<0?-(x):(x)
以上的宏定义中,如果x的值小于0,则使用一元运算符(-)对其取负,得到正数。
3 文件包含——include
当一个C语言程序由多个文件模块组成时,主模块中一般包含main函数和一些当前程序专用的函数。程序从main函数开始执行,在执行过程中,可调用当前文件中的函数,也可调用其他文件模块中的函数。
如果在模块中要调用其他文件模块中的函数,首先必须在主模块中声明该函数原型。一般都是采用文件包含的方法,包含其他文件模块的头文件。
文件包含中指定的文件名即可以用引号括起来,也可以用尖括号括起来,格式如下:
#include<文件名>或#include“文件名”
如果使用尖括号<>括起文件名,则编译程序将到C语言开发环境中设置好的 include文件中去找指定的文件。
因为C语言的标准头文件都存放在include文件夹中,所以一般对标准头文件采用尖括号;对编程自己编写的文件,则使用双引号。如果自己编写的文件不是存放在当前工作文件夹,可以在#include命令后面加在路径。
#include命令的作用是把指定的文件模块内容插入到#include所在的位置,当程序编译链接时,系统会把所有#include指定的文件链接生成可执行代码。文件包含必须以#开头,表示这是编译预处理命令,行尾不能用分号结束。
4 结语
随着计算机网络技术全球化热潮的不断推进,人类社会进入了一个新的信息时代,网络技术被广泛应用到经济发展的各个领域中,网络技术已经成为促进企业快速健康发展、推动区域经济增长乃至使一个国家的经济发展迈上一个新台阶的重要推动力。
参考文献:
[1] 王波.关于C语言中预处理的应用技巧[J].计算机时代,2003(6).
[2] 魏灿秋,蒲小琼. C语言中的编译预处理技术及其灵活运用[J].计算机应用,1998(6).
作者简介:曾祥宇(1995—),男,辽宁辽阳人,沈阳理工大学学生。
王璐瑶(1996—),男,山东东营人,沈阳理工大学学生。
张珂鹭(1995—),男,辽宁凌源人,沈阳理工大学学生。