宏替换、文件编译和头文件的展开

程序执行的几个步骤:

1.预处理:

①将头文件展开②宏替换③条件编译④去掉注释

2.编译:

①语义语法纠错②将.c文件编译成汇编语言

3.汇编:将汇编语言变成二进制机器语言

4.链接:将所有的目标文件和依赖的库文件进行汇总,得到最终的可执行程序
以下开发工程中经常用到的部分预处理指令:

#define <#macro#> // 定义宏

#undef <#macro#> // 取消宏

#if <#condition#> // 如果给定的condition为真,则编译下面的代码

#ifdef <#macro#> // 如果宏已定义,则编译下面的代码

#ifndef <#macro#> // 如果宏没有被定义,则编译下面的代码

#elif <#condition#> 如果前面的#if给定条件为假,当前的条件为真,则编译下面的代码

#endif // 结束一个#if…#else条件编译块

#error <#message#> // 停止编译并显示错误信息

宏的定义

#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏或定义宏。

宏替换

步骤:
①在调用宏时,首先对参数进行检查,看看是否包含了任何由#define定义的符号。如果是它们首先被替换。
②替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替代。
③最后,再次对文本结果进行扫描,看看是否包含了任何由#define定义的符号。如果是就重复上述处理过程。
这样,宏定义参数和#define定义可以包含其他#define定义的符号。但是,宏不可以出现递归。
例如:

#define PRINT(Val) printf(#Val " = %d\n", Val)
//期望打印的值是://10+20 = 30PRINT(10+20);//相当于printf("10+20" " = %d\n", 10 + 20);

宏中的运算符

在定义宏时,经常会出现的两个运算符 # 和 ##

#:出现在宏定义中的#运算符,会将其后面参数转化为一个字符串。我们把这种用法的成为字符串化运算符。
##:常用于把多个参数连接在一起。

条件编译指令

1、#if 指令用于检测后面的常量表达式,如果为真,则编译接下来的代码,直到出现 #else、#elif、#endif为止;否则就不编译。

2、#endif 指令用于终止#if预处理指令。

// 由于定义的AXE_TAG宏代表0,#if条件为假,不编译后面的代码,直到#endif,最后只输出
BB。去掉 #define AXE_TAG 0语句,效果也是一样的。
#if AXE_TAGprintf("AA\n");
#endifprintf("BB\n");}return 0;
}

3、#ifdef和#ifndef

#define _FBI_WARNING_int main(int argc, const char * argv[]) {#ifdef _FBI_WARNING_printf("YES\n");
#endif#ifndef _FBI_WARNING_printf("NO\n");
#endif/*等价于*/#if defined(_FBI_WARNING_)printf("YES\n");
#endif#if !defined(_FBI_WARNING_)printf("NO\n");
#endif        }return 0;
}

4、#else指令

#define _FBI_WARNING_int main(int argc, const char * argv[]) {
#ifdef _FBI_WARNING_printf("YES\n");
#elseprintf("NO\n");
#endif}return 0;
}

5、#elif指令
#elif预处理指令综合了#if和#else指令的作用

#define _FBI_WARNING_int main(int argc, const char * argv[]) {
#ifdef _FBI_WARNING_printf("YES\n");
#elif FBI_WARNINGprintf("Unknown\n");
#elseprintf("NO\n");
#endif}return 0;
}

头文件的展开

①#include指令使另外一个文件被编译:预处理器先删除这条指令,并用包含文件的内容替换。这样一个文件被包含10次,那就实际被编译10次。
②库文件一般用 < > 包含;本地文件一般用 “ ” 包含。
③文件开头写:#pragma once 可以避免头文件的重复引入。
以上总结,有不足和有误的地方还望指出!

宏替换、条件编译、头文件展开相关推荐

  1. VS(visual studio)如何查看预处理后的文件?(查看宏定义展开,头文件展开等)(注意如果要运行或调试代码,要把第一步的改回来!!!!)

    如图,右键点击项目,选择属性: 找到预处理器–>预处理到文件,选择是,点击应用 找到项目中需要查看预处理后的文件,点击编译 打开被编译文件所在文件夹 进入debug文件夹 这个main.i就是我 ...

  2. 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  3. 头文件中能否进行函数的定义

    通常我们使用头文件时都是在头文件中进行声明,在源文件中定义,哪我们能否在头文件中进行函数的定义 我们先进行一个测试,先声明一个test.h和一个test.cpp文件,并且在test.h中定义一个函数和 ...

  4. C++ | Qt 常用头文件及容器类

    目录 一.Qt常用头文件 1. <QtGlobal>头文件 (1) Qt 中的数据类型定义 (2) 常用函数 (3) 常用宏 2.<QMath>头文件 二.Qt容器类 1.顺序 ...

  5. C语言编程规范 — 头文件、函数

    0 编码规范说明 0.1 前言 为了提高产品或项目代码质量,软件开发人员编写出简洁.可靠.可维护.可测试.高效.可移植的代码,树立良好的编程规范是非常有必要的,良好的编程规范能提高编程效率,规避很多编 ...

  6. 【C 语言】文件操作 ( 文件加密解密 | 使用第三方 DES 加密解密库 | 头文件导入 | 兼容 C++ 语言 | 加密解密函数说明 )

    文章目录 一.导入第三方库头文件 二.头文件说明 1.兼容 C++ 语言 2.头文件导入限制 3.加密解密函数说明 一.导入第三方库头文件 对文件进行加密 , 将文件中的数据分成若干块 , 一块一块的 ...

  7. 【C 语言】文件操作 ( 配置文件读写 | 框架搭建 | 头文件定义 | 头文件导入限制 | 兼容 C++ 语言 | 函数形参输入输出属性注释)

    文章目录 一.头文件定义 1.头文件导入限制 2.兼容 C++ 语言 3.函数形参输入输出属性 4.代码示例 一.头文件定义 1.头文件导入限制 头文件导入限制 : 防止头文件多次导入 , 将头文件的 ...

  8. C语言 define 防止头文件重复包含 - C语言零基础入门教程

    目录 一.头文件重复包含编译器报错 1.简单的理解头文件重复包 2.老流氓的理解头文件重复包 二.通过宏定义解决头文件重复包含 1.通过 #ifndef / #define 解决头文件重复包含 2.通 ...

  9. 【C语言】标准库(头文件、静态库、动态库),windows与Linux平台下的常用C语言标准库

    一.Introduction 1.1 C语言标准库 1.2 历代C语言标准 1.3 主流C语言编译器 二.C语言标准库 2.1 常用标准头文件 2.2 常用标准静态库 三.windows平台 四.Li ...

最新文章

  1. 没有好看的 Terminal 怎么能够快乐地写代码
  2. VoxelNet: 基于点云的三维空间信息逐层次学习网络
  3. 轨道角度分布图_高分五号:大气气溶胶多角度偏振探测仪
  4. (三)Docker四种网络模式
  5. 启动Cognos时报0106错误
  6. RHEL5U8配置Centos yum源
  7. Java的接口及实例
  8. spring源码分析第六天------spring经典面试问题
  9. iOS开发:导入字体库
  10. it新员工入职培训总结
  11. LEDE 源码下载与编译
  12. HTML入门笔记12-HTML中备注写法
  13. 由DatePicket和TimePicker扩展延伸其他控件
  14. java时钟课程设计,Java课程设计-时钟图形模拟
  15. 转载:渗透测试方法论(阅读)
  16. C程序设计语言第二版·新版,C程序设计语言(第2版·新版) PDF扫描版[19MB]
  17. 水平型微指令与垂直型微指令
  18. AAAI-2020 Neural Cognitive Diagnosis for Intelligent Education Systems
  19. ***菜鸟要学会的几个cmd ddos命令
  20. Android TCP socket通信

热门文章

  1. 中国命理学史论-第一章传统命理学的现代诠释
  2. 网页设计中的安全字体
  3. Kggle比赛之Artifical Neural Networks Applied to Taxi Destination Prediction
  4. 基于java的bus公交查询系统——计算机毕业设计
  5. 计算机远程病理会诊准确率,数字病理远程诊断
  6. 基于KNN的分类模型-预测美团外卖城市等级
  7. Blender 小记之简单操作:初始化与变换(多图杀猫预警)
  8. c语言虚数变量,C语言中虚数如何表示
  9. java 导出批量图片_Java Poi 导出excel(含图片及多个sheet)
  10. 这10个安全测试工具,优秀且免费