IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 预处理详解 -> 正文阅读

[C++知识库]预处理详解

翻译环境的具体内容

在C语言中的,我们知道通过编译器运行代码可以获得一个黑窗程序,但我们却不知道这中间转换的过程是什么,下面我们就要给大家介绍一下这个转换的详细过程。
首先,我们知道一个C语言代码例如test.c,是通过翻译环境转换为可执行程序的。而这个翻译环境又是什么呢?

翻译环境:
翻译环境分为编译和链接,而编译又分为预编译,编译和汇编,所以我们就要研究一下这三个步骤对test.c干了什么,有什么作用,下面我们就对这三个步骤进行分析。

一.预编译的作用:

  1. 头文件展开
  2. 去掉注释
  3. 对#define定义的符号进行替换

前两条我们都可以理解,毕竟就是先将头文件中具体的内容进行展开并替换,之后将有注释的地方删除,那么第三条中的#define是什么呢?这就不得不要提出预处理的相关知识了,这个我们在下面会具体的讲解一下。

二.编译的作用
编译的具体作用就是将C代码翻译成汇编代码而在这过程中编译器做了以下这些事情:

  1. 语法分析
  2. 词法分析
  3. 语义分析
  4. 符号分析

三.汇编的作用
之前编译的过程中将C代码转换成了汇编代码并在其中对符号进行了分析,而在汇编阶段其实就是将分析好的符号进行汇总,最后形成一个符号表,以便于查找所需符号,具体为:

  1. 合并段表
  2. 符号表的合并与重定义

预处理中的宏定义与其他预处理指令

什么是宏呢?
其实宏就是一中预处理指令,是c语言标准允许在程序中用一个标识符来表示一个字符串。标识符就是宏名

宏替换:宏替换就是宏定义。在编译预处理中,将程序中所有的宏名用相应的字符串来替换,这个过程称为宏替换。

在预处理中宏分为两种,一种是无参数的,一种是有参数的
在这里插入图片描述
在这里插入图片描述
那么我们可以看出来这有参宏其实和函数有点相似啊,就是少了返回值和参数类型而已,那么我们是用函数好呢,还是用宏定义好呢?
其实两种定义方法都是有好有坏,下面具体和大家聊一下:
一. 宏相对于函数的优点

  1. 宏因为相对于函数来说不需要调用栈帧,也不需要进行返回,所以宏相对于函数时间开销更小,更高效
  2. 因为宏是没有参数类型的,所以宏可以做一些函数做不了的事。

二.宏相对于函数的缺点

  1. 宏不能调试,函数可以调试
  2. 宏不能递归,函数可以递归
  3. 宏由于与类型无关,所以不够严谨
  4. 当要实现的一个复杂的功能时候,宏可能会造成程序长度的增加,会降低可读性。
  5. 宏可能会由于运算符优先级而带来的问题,导致程序结果出错。

三.宏定义中的#符号与##符号

  1. #符号
    当前#符号的作用就是将传过来的参数不进行值转换,直接取参数的名字如:
    在这里插入图片描述
    上面这代码中的#data当运行代码之后就是直接输出参数的名字。
    在这里插入图片描述
  2. ##符号
    此符号其实就是一个连接符号,他会将传过来的两个参数的名字进行连接,连接之后会在程序中寻找是否有与连接之后的名字相同的变量,如:
    在这里插入图片描述
    在这里插入图片描述
    如上,当定义宏CAT之后,传参之后我们将C和H进行连接,连接之后我们得到了CH,而在程序查找我们找到了名字为CH的变量,所以此时我们输出的就是当前变量所指的值1000。

条件编译

一.#ifdef与#ifndef

  1. #ifdef表示判断后面的表达式是否被定义过,如果被定义过就执行下面的语句,如果没有被定义过就不执行如:
    在这里插入图片描述
    此时表示当前__DEBUG__如果被定义了就执行printf(“hehe\n”);语句,此处的#endif和#ifdef是配对的,用来结束条件编译。

  2. #ifndef和上面的#ifdef正好相反的,如果其后面的表达式没有被定义过,那么我们就执行下面的语句,如果被定义过就不执行如:
    在这里插入图片描述
    上面的代码就是表示如果没有定义__DEBUG__就执行下面的语句。

二.#if
#if后面加常量表达式,如果后面的常量表达式是0的时候就跳过下面的语句,当后面的常量表达式不是0的时候就执行下面的语句。例如:
在这里插入图片描述
而这里得条件编译在语法方面上其实和C语言中得if判断语句是基本上一样的,所以我们可以写出以下的这种语法也是可以的:
在这里插入图片描述
上面的代码也和if else语句的语法是一样的,上面的代码中执行3 - 1下面的那条语句,虽然2也是满足的但是已经执行了3 - 1,所以不会执行2那条语句。

三.#if defined () 和 #if !defined()

  1. #if defined(printd),此语句就是表示的是如果printd被定义了就执行下面的语句,如果没有定义就跳过该下面的语句。如:
    在这里插入图片描述
    上面的语句就是因为之前定义了print,所以就执行下面的输出语句。本质u上和#ifdef的意思是一样的。

  2. #if !defined(printd),此语句就是如果printd没有被定义的时候就执行下面的语句,如果已经被定义了就跳过下面的语句,不进行执行。如:
    在这里插入图片描述
    上面的语句就是因为上面已经定义了print,所以此时就跳过下面的输出语句,本质上和#ifndef是一个意思。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 08:54:26  更:2021-08-29 08:56:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:34:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码