C++学习:C++是如何运行的

news2025/3/10 14:45:20

        C++ 是一种强类型的编程语言,支持面向对象、泛型和低级内存操作。它的工作机制包括从编写源代码到生成可执行文件的一系列步骤。C++与文件无关,文件只是容纳运行内容的载体,需要对文件以目标系统的规则编译后,才能在目标系统中运行。

 预处理

        在编译之前,预处理器会处理源代码中的预处理指令(例如 #include#define 等)。预处理器会执行以下操作: 

  • 文件包含:处理 #include 指令,将头文件内容插入到源文件中,可被理解是一种简单复制。

例如,在test.h中只写一个 } ,此时下面两种情况的结果是一致的,“#include”只是将目标文件的代码粘贴在当前代码中,并不会做其他任何操作。

  • 宏替换:处理 #define 指令,替换宏定义,即将关键词替换为指定内容。

下图中,可以使用“INTEGER”代替“int”,编译运行正确,这是因为,在编译之前,即预处理时,“INTEGER”就已经被替换为“int”了,因此编译器根本就不知道"INTEGER"的存在,也就不会发生编译错误。

  • 条件编译:处理 #if#ifdef#ifndef 等指令,控制哪些部分的代码会被编译。

#if 0”代表禁用,即不会被编译器编译。

 “#ifdef”代表如果宏定义了某个参数,则执行内部的代码,否则跳过。

“#ifndef”代表如果没有宏定义某个参数,则执行内部的代码,否则跳过。

预处理的结果是一个纯粹的 C++ 源代码文件,没有任何预处理指令。

编译

        编译器将预处理后的 C++ 源代码转换为目标代码(通常是机器码)。

  • 语法分析:检查代码的语法是否正确。
  • 语义分析:检查代码的语义是否正确(例如类型检查)。
  • 代码生成:生成目标代码,即机器码。

编译的输出通常是一个或多个目标文件( .obj 或 .o文件)。

链接

        为了便于维护和程序的简洁性,需要在多个cpp文件中对用户自定义的各种函数进行定义,此时就需要使用链接器将目标文件和库文件链接在一起,生成最终的唯一的可执行文件(.exe)。链路器会检查执行程序内需要使用的外部函数,即不在本文件内被声明定义的函数。然后将他们与被执行程序链接在一起。于是,在执行程序时,如果遇到了本文件内无声明定义的函数,就可以根据链接找到对应的文件里调用执行了。

        在链接时,并不是将所有cpp文件都与被执行程序链接。如果被执行程序中,没有使用这个外部函数,它就不会将这个函数链接进来。一个例外是,在被执行的程序中,如果这个函数在另一个被声明的函数体里,则即便它没有被使用,也会被链接。这是因为即便这个文件不使用这个函数,链接器不能确定其他文件里不会使用它,所以会被链接。

        如下图所示,log.h中声明和定义了函数log,在主函数中将log嵌套在另一个函数printfunc中。如果不包含头文件log.h,则会报错:log未被声明。这其实很奇怪:因为我们注释了printfunc,即在主函数中不使用它,也就不使用log函数,但它依然会在链接时报错(link error),原因是不确定其他翻译单元使用printfunc函数。

如果不嵌套函数,也不包含头文件,同时不使用函数log,则不会报错。

链接的结果是一个可执行文件,可以在操作系统中运行。

运行

        生成的可执行文件可以在目标操作系统上运行。运行时,操作系统会加载程序,将其分配到内存,并开始执行程序的入口点,通常是 main函数,但也可以设置成其他函数,只是需要有一个入口点,但不一定是main。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1969133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

红酒与情感:品味中的情感共鸣

在生活的细微之处,情感如涓涓细流,无声无息却又深深地影响着我们。而红酒,这瓶中的液体,仿佛是情感的载体,让我们在品味中感受那些难以言说的情愫。当定制红酒洒派红酒(Bold & Generous)与情…

有什么快速进行同声传译的软件?6个软件帮助你快速进行同声传译

有什么快速进行同声传译的软件?6个软件帮助你快速进行同声传译 同声传译是将一种语言的讲话即时翻译成另一种语言的过程,对于跨语言沟通非常重要。以下是六款可以帮助你快速进行同声传译的软件,每款软件都有其独特的功能和优势。 语音翻译…

智能计算模拟: DFT+MD+ML 深度融合及科研实践应用

智能计算模拟: DFTMDML 深度融合及科研实践应用 第一 部分 DFTMDML基础 1. 理论内容: 理论内容: 1.1. 计算模拟发展:MD, MC, DFT三大部分 1.2. 人工智能时代背景: 大数据与大模型对模拟计算的影响 1.3. 人工智能…

【免费】如何考取HarmonyOS应用开发者基础认证和高级认证(详细教程)

HarmonyOS应用开发者认证考试PC网址 基础:华为开发者学堂 高级:华为开发者学堂 注:免费认证,其中基础认证有免费的课程,浏览器用Edge。 文章目录 目录 HarmonyOS应用开发者认证考试PC网址 前言 一、备考流程 1、注册…

【题解】【数学】—— [CSP-J 2023] 小苹果

【题解】【数学】—— [CSP-J 2023] 小苹果 [CSP-J 2023] 小苹果题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 1.题意分析2.代码 [CSP-J 2023] 小苹果 前置知识:数学分组思想,整体思想。 [CSP-J 2023] 小苹果 题目描述 小 Y 的桌子上…

家庭出游新宠儿!格瑞维亚改装大赛给出行带来无限可能

近期,格瑞维亚改装共创大赛的盛大开启,推动着改装领域前进的步伐。这场盛宴汇聚了400余份创意火花,每一款改装格瑞维亚都是对“家”的重新诠释,它们不仅仅是车轮上的风景,更是梦想与生活的完美融合。 大赛中&#xff0…

Day15--Servlet后端之Jsp了解学习(数据展示分页的实现)

JSP(Java Server Pages)是一种基于Java的动态网页开发技术,主要用于创建能够动态生成内容的Web应用程序。他可以前后端语言混合编写,用在编译后会变成一个类,你也可以理解为jsp文件就是一个servlet类,只是j…

2024第18届中国西部体育博览会诚邀代理招展

2024第18届中国西部体育博览会诚邀代理招展 2024第18届中国西部体育博览会诚邀全国各关联商会、协会,联盟、各专业会展公司、各关联产业园区、各关联网站报纸杂志及平台等资源方组团参展,组委会将给予最优惠的代理招展政策,群策群力共同把中…

pycharm无法导入pyside2模块;“ModuleNotFoundError: No module named ‘PySide2“

参考博客: 1)pycharm中配置pyqt designer和pyside2【功能是在pycharm中可以打开designer,并且可以把.ui文件转换为.py文件】 https://blog.csdn.net/kuntliu/article/details/117219237 2).ui转化为.py后,点击运行,报错…

C++为何难以割舍历史包袱?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「c++的资料从专业入门到高级教程」,点个关注在评论区回复“666”之后私信回复“666”,全部无偿共享给大家!!! 你以为…

Llama 3.1:Meta 的开源 AI 巨兽,智能新高度

在人工智能的世界里,大型语言模型(LLMs)就像是会魔法的巨人,它们能读懂我们的心思,帮我们解决问题。最近,Meta 公司(就是 Facebook 的母公司)发布了一个叫做 Llama 3.1 的超级智能模…

科学碳目标的制定流程

科学碳目标(Science-Based Target,简称SBT)的制定流程是一个系统而严谨的过程,旨在确保企业或组织设定的温室气体减排目标与气候科学的最新研究成果和《巴黎协定》的目标相一致。以下是科学碳目标制定流程的主要步骤: …

java springboot Reflections工具扫描项目中带有某个注解的方法(类似@SpringBootApplication扫描各种注解)

文章目录 java springboot Reflections工具扫描项目中带有某个注解的方法(类似SpringBootApplication扫描各种注解)简单示范EnableDistributeDelayTask配置路径扫描示范(类似于SpringBootApplication) java springboot Reflection…

Jupyter Notebook的配置基础

Jupyter Notebook的配置基础 Tab 补全 和 * 任意字符 在 Python 的 IPython 或 Jupyter Notebook 环境中,使用 Tab 补全来快速找到内置函数的方法如下: 开始输入:在代码单元格中开始输入一个函数的名称,可以是内置函数的名称的任…

物联网开发中是否必须了解嵌入式技术?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 1,首先要跟上…

(python)multiprocessing子进程(Process类的使用)总结教程

Python提供了multiprocessing模块来开启子进程,并在子进程中执行我们定制的任务。 (python)multiprocessing子进程(Process类的使用) 两种使用方法第一种方法:使用Process类第二种方法:使用mul…

Spring框架和Maven项目搭建

Spring Spring框架是一个用于构建企业级应用程序的开源Java框架。它提供了一个全面的编程和配置模型,用于开发现代化的Java应用程序。 Spring从早期的大量XML配置逐渐演变为采用注解和自动配置的方式,显著减少了配置的工作量。同时,Maven的…

为什么Transformer需要进行 Multi-head Attention?

目录 1. 前言 2. 基本概念 2.1. Word2Vec 2.2. Attention is all you need 2.3. Self-attention 2.3.1. 概述self-attention 2.3.2. 训练细节 2.4. Multi-head Attention 2.4.1. 多头理论细节 2.4.2. 多头代码实现 2.5. 总结 3. 讨论观点 3.1. 观点1: …

Canto - hackmyvm

简介 靶机名称:Canto 难度:简单 靶场地址:https://hackmyvm.eu/machines/machine.php?vmCanto 本地环境 虚拟机:vitual box 靶场IP(Canto):192.168.130.53 windows_IP:192.1…