c 编译器及#define和typedef

来源:互联网 发布:中国知网专利数据库 编辑:程序博客网 时间:2024/06/05 21:54

在C语言中,在对程序作预处理前,编译器会对它进行几次翻译处理。

1. 编译器首先把源代码中出现的字符映射到源字符集。
2. 编译器查找反斜线后紧跟换行符的实例并删除这些实例。

printf("That's wond\erful!\n");

转换成一个逻辑行:

printf("That's wonderful!\n");

3. 编译器将文本划分成预处理的语言符号(token)序列和空白序列及注释序列。注意的一点是编译器用一个空格字符代替每一个注释。

int/*这不是空格*/num;

将变成:

int num;

4. 程序进入预处理阶段,预处理器寻找可能存在的预处理指令。这些指令由一行开始处的#符号标识。

常用的几个预处理指令是:#include,#define,#if

1.文件包括

#include <stdio.h>#include "toc.h"

2.宏替换

#define P 3.1415926

3.条件包含

#ifdef H#endif

typedef工具是一种高级数据特性,它可以为某一种类型创建自己的名字。在这个方面,它可以和#define相似,但是它们具有3个不同之处:

  1. 与#define不同,typedef给出的符号名称仅限于对类型,而不是对值。
  2. typedef的解释由编译器,而不是预处理器执行。
  3. 虽然它的范围有限,但是在其范围内,typedef比#define更加灵活。

typedef是一种有趣的声明形式,它为一种类型引入了新的名字,而不是为变量分配空间。
使用#define可以实现typedef的一部分功能。例如:

#defien BYTE unsigned char 

这使预处理器用unsigned char 代替BYTE。但是也有#define实现不了的功能,例如:

typedef char *STRING;

如果没有关键字typedef,该例将STRING视为一个指针,有了这个关键字,使STRING成为char指针的标识符。因此:

STRING name,sign;   ->    char* name,*sign;

但是,如果这样:

#define STRING char*

那么:

STRING name,sign;   -> char* name ,sign;

此时,只有name是一个指针。

也可以对结构使用typedef:

typedef struct student  {    int num;  }Stu;

于是在声明变量的时候就可:Stu stu1;
如果没有typedef就必须用struct Student stu1来声明。
这里的Stu实际上就是struct Student的别名,Stu=struct Student。

不过这也是它的缺点,对于结构,除了可以在书写时省掉struct关键字之外,typedef 并不能提供显著的好处,而少些一个struct其实并没有多大帮助。

0 0