——- android培训、java培训、期待与您交流! ———-
预处理指令:编译C语言之前,先对预处理指令做解释
所有预处理指令都以符号'#'开头,并且结尾不用分号
预处理指令可以出现在程序的任何位置,且有作用范围
预处理指令主要有
1.宏定义
a> 不带参数的宏定义:
b> 带参数的宏定义
2.条件编译
3.文件包含
宏定义
a.不带参数的宏定义 : 将源程序中所有”宏名”替换为右边的”字符串”,常用来定义常量
形式:#define 宏名 字符串
注意:宏名一般都用大写字母,且对程序中”“号括住的同名宏名不会替换
b.带参数的宏定义:将源程序中所有宏名替换成字符串,并且将字符串中的参数用宏名右边参数替换
形式:#define 宏名(参数列表) 字符串
注意:宏名和参数列表之间不能有空格,否则空格后面的所有字符串都作为替换的字符串
带参数的宏在展开时,只作简单的字符和参数的替换,不进行任何计算操作,所以为了防止展开后出现计算错误一般用小括号括住字符串的参数并且将计算结果做好也用括号括起来。
宏定义与函数的区别
1> 宏定义不涉及存储空间的分配、参数类型匹配、参数传递、返回值问题
2> 函数调用执行在程序运行时,而宏替换只在编译预处理阶段。所以带参数的宏比函数效率更高
条件编译:部分代码只有在条件成立时才进行编译,否则不参与编译(参与编译的代码才会被执行)
形式:
#if 条件1
...code1...
#elif 条件2
...code2...
#else
...code3...
#endif
:: #if 和 #elif 后面的条件一般是判断宏定义而不是判断变量。编译时期没有变量。
另外还有 #if defined() 和 #if !defined()
与其对应有 #ifdef 和 #ifndef 用法一致
文件包含: #include ,其功能为将一个文件的全部内容拷贝到另一个文件中
形式
1> #include <文件名> 直接到 C语言库函数头文件
2> #include "文件名" 到 源程序当前目录->操作系统path路径->C语言库函数头文件
注意:#include 指令允许嵌套包含,但是不允许递归包含
使用 #include 可能导致多次包含同一个头文件,降低编译效率
理解:
首先 #include 导入的是函数的声明
而通过条件编译限制的是声明文件:.h文件
思路如下:
在 .h文件 开头: #ifndef 文件名大写_H //判断 文件名大写_H 这个常量不存在吗?
执行语句为1 : #define 文件名大写_H //不存在,执行预处理定义一个该常量
执行语句为2 : 函数的声明; //并且声明函数;
在 .h文件 结尾: #endif //条件编译结束
typedef : 为各种数据类型定义一个新名字(别名)
使用:
1> 基本数据类型
2> 指针
3> 构造体
4> 枚举
格式: typedef 已经存在的类型 新名字;
5> 指向函数的指针 :这是一个例外
格式: typedef 返回值类型 (*别名)(参数类型表,不需要变量名);
typedef 和 #define 的区别
typedef : 相当于定义了一种新的类型
#define : 纯粹是字符串替换
例如:
char * str1,st2;
typedef char *String ;
#define String char *
——- android培训、java培训、期待与您交流! ———-