前言:大家好,这里是YY;此篇博客主要是程序的编译/链接/预处理详解的知识点;包含【程序的翻译环境和执行环境】【编译和链接的过程】【编译的几个阶段】【运行环境】【预定义符号】【define/undef】【#define替换规则】【#和##的应用】【带副作用(功能)的宏参数】【宏与函数的对比】【条件编译(预处理指令)】【文件包含过程】【解决嵌套头文件包含问题方法】
PS:创作不易,每个知识点都有例题或者图帮助理解;如果对你有帮助,希望能够得到您的关注,赞,收藏,谢谢!
在ANSI C的任何一种实现中,存在两个不同的环境




1.形成符号表的过程:

2.段表的合并和重定位随后进行链接:

程序执行的过程:

define的两个用法:
undef:用于移除宏定义


1.define定义符号时,语法要求:


2.define定义宏时,语法要求:



1.#作用:把一个宏的参数变成对应的字符串

2.##的作用: 可以把位于其两端的(分离片段)符号合成一个符号


1.宏的优点: 1.小型工作时反应速度更快 2.不需要指定特定类型(宏是类型无关的)
2.宏的缺点: 1,用一次,会在文本中插入一次代码 2,无法调试 3,与参数类型无关,不够严谨 4,可能存在运算符优先级的问题
3.宏能做到而函数做不到的例子:

4.宏和函数全面对比一览:


例如:



if defined(symbol)/ifdef symbol if !defined(symbol)/ifndef symbol



1.例题: include"test.h"与include <test.h>有什么区别? 答:两者查找策略不同
在进行大项目制作时,常常会出现如下情况:comm.h同时通过左右被重复包含,造成冗余

1.两种解决方案:

2.例题:头文件中的ifndef/define/endif是干什么用的? 答:防止头文件被重复包含