预处理命令总结

来源:互联网 发布:搞笑词语网络流行语言 编辑:程序博客网 时间:2024/06/02 04:27

预处理命令总结(C语言)

预处理命令(preprocessor directives)不是C语言的一部分,不能直接对预处理命令编译,应在程序编译前进行预处理。预处理之后,程序不再包括预处理命令,编译程序对预处理后的源程序进行编译最后得到可执行的目标代码。

C提供的预处理功能包括3种:

  • 宏定义
  • 文件包含
  • 条件编译

宏定义

不带参数的宏定义一般形式:
# define 标识符 字符串
(1)宏名一般习惯用大写字母表示,以便与变量名进行区分,但也可使用小写字母。
(2)使用宏名代替一个字符串可以减少程序书写的工作量,同时提高程序的通用性。
(3)宏定义用宏名代替字符串,只做简单的置换操作,不做类型检查或正确性检查。
(4)宏定义不用在句末加分号,因为宏定义不是C语句。
(5)# define命令应出现在函数的外面,宏名的有效范围为定义命令之后到本源文件结束,通常#define写在文件的开头。
(6)可以使用# undef命令终止宏定义的作用域。
(7)在进行宏定义时可以引用已定义的宏名,可以层层置换。
(8)在程序中用“”括起来的字符串即使与宏名相同也不会被置换。
(9)宏定义专门用于预处理,它与定义变量的含义不同,只作字符替换不会分配内存。

带参数的宏定义

带参数的宏定义与函数的区别:
(1)函数调用先计算实参表达式的值然后带入形参,带参数的宏只是进行字符串的替换。
(2)函数调用在程序运行时进行,为形参分配临时的存储单元,宏展开在编译前进行,在展开时不会分配内存,不进行值得传递处理,也没有返回值的概念。
(3)函数中的实参和形参要定义类型,而且要求一致,不一致则进行类型转换。宏不存在类型问题,只是一个符号代表。
(4)调用函数只可得到一个返回值,使用宏可以得到几个结果。
(5)使用宏次数多时,宏展开源程序变长,每展开一次都会使程序增长,函数调用不会使源程序变长。
(6)宏替换不占用运行时间,只占编译时间,函数调用则占用运行时间(分配资源,保留现场,值传递,返回)。

文件包含处理

(1)文件包含指一个源文件可以将另外的源文件包含进来,C语言提供#include命令来完成文件包含。
(2)<>和”“都是合法的包含方式,使用尖括号时,系统到存放C库函数头文件的目录中寻找要包含的文件,这是标准方式。
(3)用双撇时,系统先在用户当前目录中寻找文件,找不到时利用标准方式。一般来说,如果调用库函数,使用尖括号以节省查找时间,使用用户自己编写的文件使用双撇符号,若文件不在当前目录中,应在双撇号内给出文件路径。
(4)被包含的文件与当前文件在预编译之后形成同一个文件,如果被包含文件里有全局变量可以直接使用,不用extern 作声明。

条件编译

条件编译形式有以下几种:
(1)
# ifdef 标识符
程序段1
# else
程序段2
# endif

或者

# ifdef 标识符
程序段1
# endif
(2)
# ifndef 标识符
程序段1
# else
程序段2
# endif
(3)
# if 表达式
程序段1
# else
程序段2
# endif
条件编译的工作可以通过if语句完成,但if语句目标程序长,运行时间长(在运行中对if语句进行测试),采用条件编译,可以减少被编译的语句,减少目标代码的长度,减少运行时间。当条件编译比较多时,目标代码可以大大地减少。

参考《C程序设计(第三版)》 谭浩强著

0 0
原创粉丝点击