C语言篇——小谈预处理命令

预处理简单来说:就是C语言中用于提高效率,把一些重复性的调用内容定义一个公用部分。这个公用部分可以是单个的储存值得常量,也可以是储存一段定义代码的文件,也可以是对一些条件的判断执行。

专业来说:预处理命令目的是改进程序设计环境,提高编程效率。这些预处理命令是由ANSI C统一规定的,不是C语言本身的组成部分,不能直接对他们进行编译(因为编译程序不能识别他们)。C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。


预处理功能主要有:宏定义,文件包含,条件编译,为了区别一般C语言,这些命令以符号“#”开头


这部分需要注意的问题很多,所以只有在实践中慢慢体会。这里先简单的总结一下预处理的大体形式。

1、宏定义

     不带参数

一般形式:#define 标识符 字符串 例如:#define PI 3.1415926

通常#define命令写在文件开头,函数之前,作为文件的一部分,在此文件范围内有效。

标识符也称为宏名,即用户可以用一个简单的名字来代替一个长的字符串。

说明:
(1)宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间。
(2)宏名一般习惯用大写字母表示。
3)使用宏名来代替一个字符串,可以减少程序中书写某些字符串的工作量,而且需要改变某个常量时,可以只改变#define命令行,一改全改,很大提高了效率。
4)宏定义不是C语句,不必在行末加分号。
5)可以用#undef命令终止宏定义的作用域。


      带参数

一般形式:#define 宏名(参数表) 字符串。例如:#define S(a,b)a*b …  area=S(3,2)

带参数的宏和函数的区别

(1)函数调用时,先求出实参表达式的值,然后带入形参,是在程序运行时处理的,为形参分配临时的内存单元。而使用宏展开只是进行简单的字符替换,作用在编译前进行的,展开时并不分配内存单元。

2)对函数中的实参和形参都要定义类型,二者的类型要求一致。而宏展开不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。

3)调用函数只可得到一个返回值,而用宏可以设法得到几个结果。

4)宏替换不占用运行时间,只占编译时间,而函数调用则占运行时间。一般用宏代表简短的表达式比较合适。
如果善于利用宏定义,可以实现程序的简化,例如可以事先把程序中的“输出格式”定义好,以减少在输出语句中每次都要写出具体的输出格式的麻烦。可以自己编写一个格式库,这样在写大程序时,可以很方便。

2、文件包含

定义:一个源文件可以将另一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。

一般形式:#include"文件名"

或者 #include <文件名>

" "<>的区别:用<>例如:<stdio.h>形式,系统到存放C库函数头文件的目录中寻找要包含的文件,者称为标准方式。用" ",系统先在用户当前目录中寻找要包含的文件,若找不到,再用标准方式查找。如果调用库函数用<>来查找,以节省查找时间。如果是用户自己编写的文件(这种文件一般都在用户当前目录中)一般用" "

3、条件编译

(1)#ifdef 标识符
                 程序段 1
           #else
                 程序段2
           #endif

如果标识符被#define定义过执行程序段1,否则执行程序段2

2
           #ifndef 标识符
                 程序段 1
           #else
                 程序段2
           #endif

如果标识符未被#define定义过执行程序段1,否则执行程序段2

3
           #if 表达式
                 程序段 1
           #else
                 程序段2
           #endif
当指定表达式为真就编译程序段1,否则编译程序段2.

 





评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值