当前位置: 首页 > news >正文

C++知识点复习(面向面试7)

我们开始今天的复习:

31.C++生成可执行文件的四个步骤

32.什么是悬挂指针?

33.什么时候会出现悬挂指针

34.#defineconst有什么区别

35.include<> 和include" "的区别

好的,我们从第31条开始。

31.C++生成可执行文件的四个步骤

📜 预处理(Preprocessing)

  • 核心任务:纯文本替换与展开。
  • 具体动作
    • 处理#include:把头文件(如<iostream>)的内容完整地拷贝到源文件中。
    • 处理#define:把代码中所有的宏(比如#define PI 3.14)替换成具体的值。
    • 处理条件编译:根据#ifdef#if等指令决定保留或剔除哪些代码。
    • 去除注释:把代码里写的注释全部删掉。
  • 产出物:生成一个后缀为.i的预处理文件(依然是纯文本,但代码量会因为头文件展开变得非常大)。

⚙️ 编译(Compilation)

  • 核心任务:将高级语言翻译成汇编语言。
  • 具体动作
    • 这是编译器真正开始“理解”代码的阶段。它会进行词法分析、语法分析、语义分析(比如检查你有没有把字符串赋值给整型变量)。
    • 如果发现语法错误,就会在这一步报错并终止。
    • 确认代码无误后,将其翻译成特定 CPU 架构(如 x86 或 ARM)的汇编指令。
  • 产出物:生成一个后缀为.s的汇编代码文件(依然是人类可读的文本)。

🔢 汇编(Assembly)

  • 核心任务:将汇编语言翻译成机器语言(二进制)。
  • 具体动作
    • 汇编器(Assembler)把.s文件里的每一条汇编指令,逐行翻译成 CPU 能直接识别的 0 和 1(机器码)。
    • 此时会生成“目标文件”(Object File),里面包含了二进制机器码,以及符号表(记录了函数名、全局变量名等信息,但此时它们的内存地址还是临时的)。
  • 产出物:生成一个后缀为.o(Linux/Unix)或.obj(Windows)的目标文件(已经是二进制,人类不可读)。

🔗 链接(Linking)

  • 核心任务:拼积木,生成最终可执行文件。
  • 具体动作
    • 符号解析:如果你在main.cpp里调用了printf或者另一个文件里的函数,链接器会负责找到这些函数的具体定义在哪里。
    • 地址重定位:把各个目标文件中函数的临时地址,替换成程序运行时的真实内存地址。
    • 合并库文件:把你用到的标准库(比如iostream相关的库)或者第三方库合并进来。
  • 产出物:生成最终的可执行文件(如 Linux 下的a.out或 Windows 下的.exe)。

💡 实战中的命令对应(以 Linux g++ 为例)

在实际开发中,我们通常一条命令就搞定了(比如g++ main.cpp -o app),但编译器内部其实默默按顺序执行了上述四步。如果你想手动拆解体验一下,可以使用以下命令:

  1. 预处理g++ -E main.cpp -o main.i
  2. 编译g++ -S main.i -o main.s
  3. 汇编g++ -c main.s -o main.o
  4. 链接g++ main.o -o app

32.什么是悬挂指针?

悬挂指针,也叫野指针,是指指向非法内存地址的指针,即无法正常使用的指针。
33.什么时候会出现悬挂指针
使用未初始化的指针:在定义指针变量后没有对其进行初始化,这是出现悬挂指针
最典型的情形。
指针所指的对象已经消亡:当指针指向的对象的生命周期结束后,对象已经消亡,
但仍然使用该指针访问该对象,就会出现运行时错误
指针释放后未置空:指针被free或者delete释放后,没有置为NULL,此时指针指
向的是垃圾内存。
C语言中,realloc函数使用不当:如果原内存后面没有足够的空间来将原有空
间扩展成一个连续的新大小,realloc函数会从堆中重新找一块新内存,并把原来通
malloc函数得到的内存空间中的内容复制到这块新内存中,此时数据发生了移
动,那么原指针所指向的内存空间实际上已经被释放,这样就会产生原指针的悬
挂。
34.#defineconst有什么区别
define定义的常量没有类型,const定义的常量有类型的名字
编译器对其处理不同,define定义的宏在预处理阶段被替换可能有多个拷贝,const
义的变量在编译时确定值,只有一个拷贝(为什么会有一个拷贝参考const修饰的变量
能被修改cast_const<>()
35.include<> 和include" "的区别
#include <>:用于包含系统标准头文件。编译器会在系统指定的标准头文件目录中查
找要包含的头文件。例如<iostream>等。
#include " ":通常用于包含用户自己编写的头文件。编译器会先在当前源文件所在目
录查找。
http://www.cnnetsun.cn/news/2592230.html

相关文章:

  • 别再手动配OPC UA了!用Node-RED的opcua节点,5分钟搞定工业数据采集
  • 告别闪烁!用STM32F030的HAL I2C驱动CH455G实现稳定数码管显示
  • 零基础学网络安全,最大的误区不是笨,是学错了顺序
  • Python分布式锁实现:构建高并发环境下的资源保护机制
  • Rust内存管理模式:深入理解所有权系统
  • C语言联合体与枚举详解
  • 【OpenCV零基础保姆级入门】一篇吃透计算机视觉预处理!全套实战代码,适配YOLO/深度学习
  • AI写的毕业论文初稿双率超标?怎么选靠谱的降重降AI工具
  • 大模型AI校招核心考点解析:从Transformer到工程实践,助你拿下Offer!
  • Docker部署Nginx实战:宿主机端口映射详解与避坑指南
  • 私教服务 | 一场差点吵起来的测试环境搭建咨询,暴露了90%测试人的认知盲区
  • OPC中国是谁?智能体来了旗下开源共创社区全面介绍​
  • 别再混淆了!SAP库存转移全解析:MIGO 301/303 vs. UB STO到底怎么选?
  • 为什么企业都在做智能体战略?OPD 一人部门是最低成本路线
  • 可恢复流式传输:构建可靠AI应用的核心机制与实现挑战
  • 无耳洞星人狂喜[特殊字符]终于找到本命“耳饰”啦!
  • 嵌入式AES加密的机器学习安全防护系统设计
  • AMBA CHI协议DEACT状态下的Flit传输机制与工程实践
  • 小鹏汽车团队打造了一个专门测试AI“耳朵“的考场
  • 主动学习数据集划分
  • JAVA基于SSM/Vue/Springboot的家用电器在线销售系统的设计与实现 LW
  • 从零构建AI记忆系统:基于向量数据库与LLM的持久化上下文实践
  • 构建367引擎自治系统:自动化价值创造与社区互助的技术实践
  • TypeScript与Zapier SDK构建智能HubSpot公司信息补全工作流
  • 多模态时代下AI软硬件产业链的投资边界与配置权重
  • 具身智能计算方案与感知-决策-控制一体化
  • AI代理在生产数据库运维中的五大认知盲区与实战校正
  • 20260526_204029_RAG外部检索是多余的,英伟达最新成果颠覆认知
  • LLM网关:从成本失控到智能路由,构建AI应用的核心基础设施
  • RAG检索结果不够准?揭秘“双塔+单塔“组合背后的精准秘诀!秒懂工业级RAG架构核心!