一、预处理
1、如包含命令#include <stdio.h>,宏定义命令#define PI 3.1415926等。
在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,它们称为预处理部分。
2、 包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。例如以下写法都是允许的:
#include"stdio.h"
#include<math.h>
但是这两种形式是有区别的:使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找;
使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。用户编程时可根据自己文件所在的目录来选择某一种命令形式。
3、预处理程序提供了条件编译的功能。可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。
#ifdef 标识符
程序段1
#else
程序段2
#endif
如果标识符已被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编译。
4、预处理功能是C语言特有的功能,它是在对源程序正式编译前由预处理程序完成的。在程序中用预处理命令来调用这些功能。
宏定义是用一个标识符来表示一个字符串,这个字符串可以是常量、变量或表达式。在宏调用中将用该字符串代换宏名。
宏定义可以带有参数,宏调用时是以实参代换形参。而不是“值传送”。
#define 宏名(形参表) 字符串
#define M(y) yy+3y //宏定义
……
k=M(5); //宏调用
……
为了避免宏代换时发生错误,宏定义中的字符串应加括号,字符串中出现的形式参数两边也应加括号。
二、typedef
- 为基本数据类型定义新的类型名
typedef unsigned int COUNT; - 为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称
typedef struct tagPoint
{
double x;
double y;
double z;
} Point; - 为数组定义简洁的类型名称
typedef int INT_ARRAY_100[100];
INT_ARRAY_100 arr; - 为指针定义简洁的名称
对于指针,我们同样可以使用下面的方式来定义一个新的别名:
typedef char* PCHAR;
PCHAR pa;
#define是在预编译时处理的,它只能作简单的字符串替换,而typedef是在编译时处理的。实际上它并不是作简单的字符串替换,而是采用如同定义变量的方法那样来声明一个类型。