************************************************************
C程序设计 知识纲要--预处理命令小结
Edit By Rogers At 2003-11-01 22:53
共同进步! Rogers ' Email: acegeng@sohu.com
************************************************************
【预处理命令】
预处理命令不是C语言本身的组成部分,不能直接对它们进行编译(编译程序不能识别它们)。所以必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预处理”。
C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。
C提供的预处理功能主要有以下三种:
1.宏定义
2.文件包含
3.条件编译
为了与一般的C语句相区别,这些命令以符号 "# "开头。
1.宏定义:
[不带参数的宏定义]:用一个指定的标识符来代表一个字符串。其一般形式为:
#define 标识符 字符串
如: #define PI 3.1415926
把这个标识符称为“宏名”,在预编译时将宏名替换成字符串的过程称为“宏展开”。#define为宏定义命令。
宏名一般习惯用大写字母表示,以便与变量名相区别。
宏定义是用宏名字代替一个字符串,也就是做简单的置换,不做正确性检查。预编译时不做任何语法检查。
宏定义不是C语句,不必在行末加分号。否则,会连分号一起进行置换。
可以使用 #undef 命令终止宏定义的作用域。
在进行宏定义时,可以引用已定义的宏名,可以层层置换。
对程序中用双括号括起来的字符串内的字符,即使与宏名相同,也不进行置换。
宏定义只做字符替换,不分配内存空间。
[带参数的宏定义]:不是进行简单的字符替换,还要进行参数替换。其一般形式为:
#define 宏名(参数表) 字符串
如: #define S(a,b) a*b
宏定义时,在宏名与带参数的括号之间不应加空格,否则将空格以后的字符都作为替代字符串的一部分。
一般用宏来代表简短的表达式比较适合。
2.文件包含:
所谓“文件包含”处理是指一个源文件可以另外一个源文件的全部内容包含近来,即将另外的文件包含到本文件之中。
其一般形式为: #include "文件名 "
#include <文件名>
包含文件编译时并不是作为两个文件进行连接的,而是作为一个源程序编译,得到一个目标(.obj)文件。因此被包含的文件也应该是源文件而不应该是目标文件。
这种常用在文件头部的被包含的文件称为“标题文件”或“头部文件”,常以 "h "为后缀,当然不用 ".h "位后缀,而用 ".c "为后缀或者没有后缀也是可以的。
头文件除了可以包括函数原型和宏定义外,也可以包括结构体类型的定义
一个#include命令只能指定一个被包含文件
文件包含是可以嵌套的。
在#include 命令中,文件名可以用双引号或尖括号括起来。用尖括号时,系统到存放C函数库头文件所在的目录中寻找要包含的文件,这称为标准方式。
用双引号时,系统先在用户当前目录中寻找要包含的文件,若找不到,再按标准方式查找。
所以,如果为调用库函数而用#include 命令来包含相关的头文件,则用尖括号,以节省查找时间。如果要包含的是用户自己编写的文件,一般用双引号。
3.条件编译
有以下几种形式:
(1) #ifdef 标识符
程序段1
#else
程序段2
#endif
(2)
#ifndef 标识符
程序段1
#else
程序段2
#endif
(3)
#if 表达式
程序段1
#else
程序段2
#endif
采用条件编译,可以减少被编译的语句,从而减少目标程序的长度,减少运行时间。
*****************************************
参考书籍:C程序设计
*****************************************
C程序设计 知识纲要--预处理命令小结
Edit By Rogers At 2003-11-01 22:53
共同进步! Rogers ' Email: acegeng@sohu.com
************************************************************
【预处理命令】
预处理命令不是C语言本身的组成部分,不能直接对它们进行编译(编译程序不能识别它们)。所以必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预处理”。
C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。
C提供的预处理功能主要有以下三种:
1.宏定义
2.文件包含
3.条件编译
为了与一般的C语句相区别,这些命令以符号 "# "开头。
1.宏定义:
[不带参数的宏定义]:用一个指定的标识符来代表一个字符串。其一般形式为:
#define 标识符 字符串
如: #define PI 3.1415926
把这个标识符称为“宏名”,在预编译时将宏名替换成字符串的过程称为“宏展开”。#define为宏定义命令。
宏名一般习惯用大写字母表示,以便与变量名相区别。
宏定义是用宏名字代替一个字符串,也就是做简单的置换,不做正确性检查。预编译时不做任何语法检查。
宏定义不是C语句,不必在行末加分号。否则,会连分号一起进行置换。
可以使用 #undef 命令终止宏定义的作用域。
在进行宏定义时,可以引用已定义的宏名,可以层层置换。
对程序中用双括号括起来的字符串内的字符,即使与宏名相同,也不进行置换。
宏定义只做字符替换,不分配内存空间。
[带参数的宏定义]:不是进行简单的字符替换,还要进行参数替换。其一般形式为:
#define 宏名(参数表) 字符串
如: #define S(a,b) a*b
宏定义时,在宏名与带参数的括号之间不应加空格,否则将空格以后的字符都作为替代字符串的一部分。
一般用宏来代表简短的表达式比较适合。
2.文件包含:
所谓“文件包含”处理是指一个源文件可以另外一个源文件的全部内容包含近来,即将另外的文件包含到本文件之中。
其一般形式为: #include "文件名 "
#include <文件名>
包含文件编译时并不是作为两个文件进行连接的,而是作为一个源程序编译,得到一个目标(.obj)文件。因此被包含的文件也应该是源文件而不应该是目标文件。
这种常用在文件头部的被包含的文件称为“标题文件”或“头部文件”,常以 "h "为后缀,当然不用 ".h "位后缀,而用 ".c "为后缀或者没有后缀也是可以的。
头文件除了可以包括函数原型和宏定义外,也可以包括结构体类型的定义
一个#include命令只能指定一个被包含文件
文件包含是可以嵌套的。
在#include 命令中,文件名可以用双引号或尖括号括起来。用尖括号时,系统到存放C函数库头文件所在的目录中寻找要包含的文件,这称为标准方式。
用双引号时,系统先在用户当前目录中寻找要包含的文件,若找不到,再按标准方式查找。
所以,如果为调用库函数而用#include 命令来包含相关的头文件,则用尖括号,以节省查找时间。如果要包含的是用户自己编写的文件,一般用双引号。
3.条件编译
有以下几种形式:
(1) #ifdef 标识符
程序段1
#else
程序段2
#endif
(2)
#ifndef 标识符
程序段1
#else
程序段2
#endif
(3)
#if 表达式
程序段1
#else
程序段2
#endif
采用条件编译,可以减少被编译的语句,从而减少目标程序的长度,减少运行时间。
*****************************************
参考书籍:C程序设计
*****************************************