黑马程序员---iOS基础---C语言中的预处理命令
2015-07-30 21:34
260 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.预处理的概念
ANSIC标准规定可以在C源程序中加入一些“预处理命令”
,以改进程序设计环境,提高编程效率。
这些预处理命令是由ANSIC统一规定的,但是它不是C语言本身的组成部分,不能直接对它们进行编译(因为编译程序不能识别它们)。
必须在对程序进行通常的编之前,先对程序中这些特殊的命令进行“预处理”
经过预处理后程序可由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。
2.C语言中的预处理功能
C语言提供的预处理功能主要有一下三种:
宏定义;
#define 标识符 字符串
(1) 宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母。
(2) 使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。
(3) 宏定义是用宏名代替一个字符串,只作简单置换,不作正确性检查。只有在编译已被宏展开后的源程序时才会发现语法错误并报错。
(4) 宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换。
(5) #define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函数之前,作为文件一部分,
在此文件范围内有效。
(6) 可以用#undef命令终止宏定义的作用域。
(7) 在进行宏定义时,可以引用已定义的宏名,可以层层置换。
(8) 对程序中用双撇号括起来的字符串内的字符,即使与宏名相同,也不进行置换。
(9) 宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间。
#define宏名(参数表) 字符串
带参数的宏定义不是简单的替换,展开时还要进行参数的替换。
#define S(a, b) a*b
area = S(1,1) => area = 1*1
#include <stdio.h>
#define PI 3.1415926
#define S(r)PI*r*r
void main()
{
float a,area;
a=3.6;
area=S(a);
printf("r=%f\narea=%f\n",a,area);
}
宏定义不占运行时间,只是占用编译的时间,而函数占用运行时间,但是宏定义的展开可能使程序变长,而函数则不会。
文件包含;
所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来。C语言提供了#include命令用来实现“文件包含”的操作。
#include<>代表包含的文件是系统提供的,而#include“”表示包含的文件是自己定义的。
文件在编译时,不是把每个文件单独编译然后连接在一起,而是一个文件包含另一个文件后生成一个新的文件进行编译。
文件的包含是可以嵌套的。
条件编译
所谓“条件编译”,是对部分内容指定编译的条件,使其只在满足一定条件才进行编译。
#ifdef
标识符
程序段1
#else
程序段2
#endif
如果定义了这样的宏,就执行语句
#ifndef
标识符
程序段1
#else
程序段2
#endif
如果没有定义这样的宏名,就执行语句
1.预处理的概念
ANSIC标准规定可以在C源程序中加入一些“预处理命令”
,以改进程序设计环境,提高编程效率。
这些预处理命令是由ANSIC统一规定的,但是它不是C语言本身的组成部分,不能直接对它们进行编译(因为编译程序不能识别它们)。
必须在对程序进行通常的编之前,先对程序中这些特殊的命令进行“预处理”
经过预处理后程序可由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。
2.C语言中的预处理功能
C语言提供的预处理功能主要有一下三种:
宏定义;
#define 标识符 字符串
(1) 宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母。
(2) 使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。
(3) 宏定义是用宏名代替一个字符串,只作简单置换,不作正确性检查。只有在编译已被宏展开后的源程序时才会发现语法错误并报错。
(4) 宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换。
(5) #define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函数之前,作为文件一部分,
在此文件范围内有效。
(6) 可以用#undef命令终止宏定义的作用域。
(7) 在进行宏定义时,可以引用已定义的宏名,可以层层置换。
(8) 对程序中用双撇号括起来的字符串内的字符,即使与宏名相同,也不进行置换。
(9) 宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间。
#define宏名(参数表) 字符串
带参数的宏定义不是简单的替换,展开时还要进行参数的替换。
#define S(a, b) a*b
area = S(1,1) => area = 1*1
#include <stdio.h>
#define PI 3.1415926
#define S(r)PI*r*r
void main()
{
float a,area;
a=3.6;
area=S(a);
printf("r=%f\narea=%f\n",a,area);
}
宏定义不占运行时间,只是占用编译的时间,而函数占用运行时间,但是宏定义的展开可能使程序变长,而函数则不会。
文件包含;
所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来。C语言提供了#include命令用来实现“文件包含”的操作。
#include<>代表包含的文件是系统提供的,而#include“”表示包含的文件是自己定义的。
文件在编译时,不是把每个文件单独编译然后连接在一起,而是一个文件包含另一个文件后生成一个新的文件进行编译。
文件的包含是可以嵌套的。
条件编译
所谓“条件编译”,是对部分内容指定编译的条件,使其只在满足一定条件才进行编译。
#ifdef
标识符
程序段1
#else
程序段2
#endif
如果定义了这样的宏,就执行语句
#ifndef
标识符
程序段1
#else
程序段2
#endif
如果没有定义这样的宏名,就执行语句
相关文章推荐
- c++ 控制台流和字符串流
- c++ 控制台流和字符串流
- C/C++单链表的一些操作
- A*算法C/C++代码
- C++模板类继承中的Name Lookup
- C语言之strncpy函数原型
- 场景管理:BSP算法C++实现
- C++第五节:重载操作符
- C语言基本知识点
- 场景管理:八叉树算法C++实现
- 场景管理:四叉树算法C++实现
- 黑马程序员--iOS基础知识---C语言中的函数
- 一份C++线程池的代码(转)
- C++类的访问问题
- 控制台下的计算器——C++实现
- 增量式PID算法的C语言代码
- C++ 全局变量、局部变量、静态全局变量、静态局部变量的区别
- C++中的四种cast
- c语言中的函数指针
- 读书笔记MoreEffectiveC++(35)