博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c 编译器及#define和typedef
阅读量:4049 次
发布时间:2019-05-25

本文共 1225 字,大约阅读时间需要 4 分钟。

在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 
#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其实并没有多大帮助。

转载地址:http://bsnci.baihongyu.com/

你可能感兴趣的文章
在C++中使用Lua
查看>>
一些socket的编程经验
查看>>
socket编程中select的使用
查看>>
可以在线C++编译的工具站点
查看>>
关于无人驾驶的过去、现在以及未来,看这篇文章就够了!
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
为什么读了很多书,却学不到什么东西?
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.176 - LeetCode1309
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql truncate (清除表数据)
查看>>
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>
yuv420 format
查看>>
yuv420 还原为RGB图像
查看>>
LED恒流驱动芯片
查看>>
驱动TFT要SDRAM做为显示缓存
查看>>