预处理是C语言的一个重要功能, 它由预处理程序负责完成。当对一个源文件进行编译时, 系统自动引用预处理程序对源程序中的预处理部分作处理, 处理完毕自动进入对源程序的编译。
格式:
C语言提供了多种预处理功能,如宏定义、文件包含、 条件编译等。合理使用预处理功能可令程序便于阅读、修改、 移植和调试,也有利于模块化程序设计。
为了区分预处理指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用分号(;)
预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾。习惯上我们尽可能将预处理指令写在源程序开头,这种情况下,它的作用范围就是整个源程序文件。
1.宏定义 #define
不带参数格式:
#define ABC 23
作用:编译时将源程序中的ABC替换成23,常用来定义常量。
带参数格式:
#define AVG(a,b) (((a)+(b))/2)
作用:AVG(3,5),(((3)+(5))/2),输出结果为:4;
类似于函数,但不涉及储存空间分配,参数类型匹配,参数传递,返回值等问题,在编译预处理阶段执行,比函数效率更高。
使用习惯注意:宏一般用大写字母,以便与变量名区分开来;
使用带参数的宏注意将参数和计算结果用括号包起来,确保计算结果正确
2.条件编译 #if、#elif、#else、#endif
#if 条件1
code1
#elif 条件2
code2
#else 条件3
code3
#endif
使用习惯注意:#if 和 #elif 后面的条件一般为宏而不是判断变量,因为条件编译是在编译之前做的判断,宏定义也是编译之前定义的,而变量是 在运行时才产生的、才有使用的意义;
条件编译结束后一定要加#endif;
#if defined(),#if !defined()判断是否定义过某个宏;
#ifdef 等同于#if defined(), #ifndef等同于#if !defined() ;
条件编译与宏结合使用可用于iOS版本适配。
3.文件包含 #include
格式1:
#include <xxx.h>
<div style="color: rgb(51, 51, 51); font-family: 'courier new', courier; font-size: 14px; line-height: 25.2000007629395px; margin: 0px; padding: 0px; background-color: rgb(254, 254, 242);">格式2:</div><div style="color: rgb(51, 51, 51); font-family: 'courier new', courier; font-size: 14px; line-height: 25.2000007629395px; margin: 0px; padding: 0px; background-color: rgb(254, 254, 242);"><pre name="code" class="objc">#include "xxx.h"
作用:将一个文件的全部内容copy到另一个文件中
使用#include容易引起重复包含文件,降低编译效率,可结合条件编译#ifndef使用,避免重复包含(一般OC中使用#import解决该问题,这 里稍作了解就可以了)