---------------------- <a href="http://www.itheima.com"target="blank">iOS开发</a>、期待与您交流! ----------------------
一 、预处理指令-宏定义
宏定义可以分为2种:不带参数的宏定义和带参数的宏定义。
1. 不带参数的宏定义
一般形式: #define 宏名 字符串 比如 #define A 20
字符串也可以省略,比如 #define A
作用: 它的作用是在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常用来定义常量。
注意: 1> 宏名一般用大写字母,以便与变量名区别开来,但用小写也没有语法错误
2> 对程序中用双引号扩起来的字符串内的字符,不进行宏的替换操作。比如:
#define R 10
int main ()
{
char *s = "Read";
return 0;
}
3> 在编译预处理用字符串替换宏名时,不作语法检查,只是简单的字符串替换。只有在编译的时候才对已经展开宏名的源程序进行语法检查。
4> 宏名的有效范围是从定义位置到文件结束。如果需要终止宏定义的作用域,可以用#undef命令
5>定义一个宏时可以引用已经定义的宏名
#define R 2.0
#define Pi 3.14
#define L 2*Pi*R
2. 带参数的宏定义
一般形式: #define 宏名(参数列表) 字符串
作用:在编译预处理时,将源程序中所有宏名替换成字符串,并且将字符串中的参数用宏名右边参数列表中的参数替换
注意:1>宏名和参数列表之间不能有空格,否则空格后面的所有字符串都作为替换的字符串
2> 带参数的宏在展开时,只作简单的字符和参数的替换,不进行任何计算操作。所以在定义宏时,一般用一个小括号括住字符串的参数。
下面定义一个宏P(a),作用是返回a的平方:
* 如果不用小括号括住计算结果
#include <stdio.h>
#define Pow(a) (a) * (a)
int main(int argc,constchar * argv[]) {
int b =Pow(10) /Pow(2);
printf("%d", b);
return0;
}
最后的变量b为:100 // int b = 10 * (10/2) *2;
* 如果用小括号括住计算结果
将上面的第二行代码改为:#define Pow(a)((a)*(a))
那么第四行被替换为:int b = ((10)*(10))/ ((2)*(2));
最后输出的结果是:25
** 与函数的区别:
从整个使用过程可以发现,带参数的宏定义,在源程序中出现的形式与函数很像。但是两者是有本质区别的:
1>宏定义不涉及存储空间的分配、参数类型匹配、参数传递、返回值问题。
2>函数调用在程序运行时执行,而宏替换只在编译预处理阶段进行,所以带参数的宏比函数具有更高的执行效率
二 、预处理指令-条件编译
在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执行),这就是条件编译。
1. 基本用法
#if 条件1
...code1...
#elif 条件2
...code2...
#else
...code3...
#endif
1> 如果条件1成立,那么编译器就会把#if 与 #elif之间的code1代码编译进去
2> 如果条件1不成立、条件2成立,那么编译器就会把#elif 与 #else之间的code2代码编译进去
3> 如果条件1、2都不成立,那么编译器就会把#else 与 #endif之间的code3编译进去
4> 注意,条件编译结束后,要在最后面加一个#endif,不然后果很严重
5> #if 和 #elif后面的条件一般是判断宏定义而不是判断变量,因为条件编译是在编译之前做的判断,宏定义也是编译之前定义的,而变量是在运行时才产生的、才有使用的意义
2. 其他用法1> #if defined() 和 #if !defined()的用法
#if 和 #elif后面的条件不仅仅可以用来判断宏的值,还可以判断是否定义过某个宏,比如:
#if defined(Max)
....code....
#endif
如果前面已经定义过 Max这个宏,就将code编译进去,它不会管Max的值是多少,只要定义过Max,条件就成立。
条件也可以去反:
#if !defined(Max)
....code....
#endif
如果前面没有定义过Max这个宏,就将code编译进去。2> #ifdef 和 #ifndef的使用
* #ifdef的使用和#if defined()的用法基本一致
#ifdef Max
......code......
#endif
如果前面已经定义过 Max这个宏,就将code编译进去。
* #ifndef的使用和#if !defined()的用法基本一致
#ifndef Max
......code......
#endif
如果前面没有定义过Max这个宏,就将code编译进去。
三 、预处理指令-文件包含
1. #include <文件名> 直接到C语言库函数头文件所在的目录中寻找文件
2. #include “文件名” 系统会先在源程序当前目录下寻找,若找不到,再到操作系统的path路径中查找,最后才到C语言库函数头文件所在目录中查找
---------------------- <a href="http://www.itheima.com"target="blank">iOS开发</a>、期待与您交流! ----------------------