在编程过程中,是否有过疑问,#define M 4 和 int M=4 有什么区别呢?
以下是个人的理解:
C语言中,可以用 #define 定义一个标识符来表示一个常量。其特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个标识符就不存在了,都被所定义的常量所替代。而int 是申明了4个字节的内存空间的,就算是定义为0也是需要占空间的。
预编译:C语言从编写到运行都要经过编译,汇编和链接这三个阶段,我们一般将前两个阶段统称为编译阶段,具体流程如下图:

编译:对源程序进行词法语法分析,继而将高级语言(C、C++)转换为具有相同功能的汇编语言。
编译第一阶段----预处理:对源程序的宏定义进行替换,生成一个没有预处理指令的文件,该文件同之前的文件相比功能一致,内容有所不同。就是在源程序进行正式编译之前,程序使用预处理指令(#开头,如 #include,宏定义#define等)修改,修饰内部源程序代码内容。#include将头文件内部的代码放入源程序中。 预处理指令主要包括三种:1.宏定义指令(#define、#undef)2.条件编译指令(#ifdef、#ifndef、#else、#elif、#endif等)3.头文件包含指令(#include<系统提供>、#include“自定义”)4.特殊符号(LINE、FILE)
编译第二阶段----编译、优化:编译---确认所有指令都符合词法、语法规则以后将其翻译为等效的汇编代码。优化----优化代码本身结构以及结合硬件优化代码内容结构以提高代码的运行效率。
汇编:将汇编代码转换为目标机器语言代码。
链接:将彼此关联的目标文件进行链接以使得程序能够成文一个可执行的整体系统(将一个文件中引用的符号同该符号在另一个文件中的定义连接起来)。按照连接方式可以分为:静态链接(所有目标文件的集合,占内存空间大)和动态链接(映射方式,占内存小)
用 #define 定义标识符的一般形式为:
#define 标识符 常量 //注意, 最后没有分号
#define 和 #include 一样,也是以“#”开头的。凡是以“#”开头的均为预处理指令,#define也不例外。
#define又称宏定义,标识符为所定义的宏名,简称宏。标识符的命名规则与前面讲的变量的命名规则是一样的。#define 的功能是将标识符定义为其后的常量。而定义变量后,变量还能够重新进行定义。
| 宏定义 | 变量 |
| 宏所表示的常量可以是数字、字符、字符串、表达式。其中最常用的是数字。 | 定义不同类型的变量需要使用不同的申明 |
| 方便程序修改 | --- |
| 简化较长的常量 | --- |
| #define作用域: 从定义起到源程序结束 | 有代码块区分 |
| 终止作用域:#undef 命令(作用域:#define----#undef ) | 无 |
| 节省空间 | 最少2个字节 |
| 标识符全部用大写 | ---- |
| 注意:'‘标识符'’,表示字符,不要视为宏 | ---- |
本文解释了C语言中#define与int=4的区别:#define定义的常量不占内存,仅作为符号存在,而int占用内存;并详细描述了预编译过程,包括宏定义、编译阶段和链接机制。

583

被折叠的 条评论
为什么被折叠?



