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

        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.rhkb.cn/news/388703.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java算法递归算法练习-数组之和

简单找个题目练习一下递归算法,输入一组数组,使用递归的方法计算数组之和。其实这个题目,用循环的方式也很简单就能解决,直接循环遍历一下相加就行了,但是我们用来练习一下递归。 先来找基线条件和递归条件 基线条件…

springboot+webSocket对接chatgpt

webSocket对接参考 话不多说直接上代码 WebSocket package com.student.config;import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; import org.springfram…

matplotLib在图中标出最后一个点的值

import matplotlib.pyplot as plt import numpy as np# 生成100个随机数据 data np.random.rand(100)# 绘制数据 plt.plot(data, labelData Points)# 获取最后一个数据点的位置和值 last_x len(data) - 1 last_y data[-1]# 用红圈标出最后一个点 plt.plot(last_x, last_y, r…

STM32-寄存器DMA配置指南

配置步骤 在STM32F0xx中文参考手册中的DMA部分在开头给出了配置步骤 每个通道都可以在外设寄存器固定地址和存储器地址之间执行 DMA 传输。DMA 传输的数据 量是可编程的,最大达到 65535。每次传输之后相应的计数寄存器都做一次递减操作,直到 计数为&am…

jdk环境、tomcat环境

回顾复习 安装nodejs,和jdk一样的软件运行环境 yum -y list installed|grep epel #是否安装epel yum -y install nodejs node -v #查看版本号 下载对应的nodejs软件npm yum -y install npm npm -v #查 npm set config ....淘宝镜像 安装vue/cli…

[ACTF2020 新生赛]BackupFile1

打开题目 利用disearch扫描&#xff0c;发现源文件index.php.bak 下载下来 打开文件 代码审计&#xff0c;翻译一下 翻译代码为&#xff1a; <?php include_once "flag.php"; //这一行使用 include_once 函数来包含&#xff08;或插入&#xff09;另一个 PHP …

Win11系统文件资源管理器鼠标右键卡顿解决方法

引用链接&#xff1a; Windows 11文件资源管理器崩溃怎么解决&#xff1f;看看这7个解决办法&#xff01;

Redis的集群 高可用

文章目录 Redis基本概念主从复制哨兵模式故障切换集群 Redis基本概念 Redis集群三种模式 主从复制&#xff1a;奇数台 3&#xff1a; 一主两从 哨兵模式&#xff1a;3&#xff1a; 1主两从 cluster&#xff1a;6 主从复制&#xff1a;和mysql的主从复制类似&#xff0c;主…

C++ string类

目录 为什么要有string类&#xff1f; auto和范围for 1. auto 2. 范围for 一. 标准库中string类的简单使用 二. string类的常用接口说明 1. string类对象的常见构造 2. string类对象的容量操作 3. string类对象的访问及遍历操作 4. string类对象的修改与查找操作 插入…

【Web 前端开发】vue3开发环境部署

1、安装 Node.js 和 npm 访问 Node.js 官网 下载并安装最新的 LTS 版本。 安装完成后&#xff0c;打开命令行工具&#xff0c; 输入 node -v 和 npm -v 检查安装是否成功。 node -vnpm -v 如下图&#xff1a; 2、安装 Vue CLI 在命令行工具中输入以下命令安装 Vue CLI&…

微信小程序开发:宿主环境—组件

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

详解DDR3原理以及使用Xilinx MIG IP核(app 接口)实现DDR3读写测试

系列文章目录 &#xff08;1&#xff09;详解SDRAM基本原理以及FPGA实现读写控制 文章目录 系列文章目录一、DDR简介1.1 什么是 SDRAM、DDR、DDR2、DDR31.2 SDRAM、DDR、DDR2、DDR3核心频率、工作频率以及等效频率的计算1.3 DDR3带宽以及容量的计算 二、MIG IP核的介绍三、MIG…

机器学习 第8章-集成学习

机器学习 第8章-集成学习 8.1 个体与集成 集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务&#xff0c;有时也被称为多分类器系统(multi-classifersystem)、基于委员会的学习(committee-based learning)等。 图8.1显示出集成学习的一般结构:先产生一组“…

【附安装包】CentOS7(Linux)详细安装教程(手把手图文详解版)

目前流行的虚拟机软件有VMware、Virtual Box和Virtual PC等等&#xff0c;其中最常用的就是VMware。 而centos是Linux使用最广泛的版本之一。 教程开始教程有许多不完备之处&#xff0c;大佬请忽略。。。 1.安装VMware 首先需要准备VMware的安装包以及Ubuntu的ISO镜像&#…

鸿蒙系统开发【设备安全服务-应用设备状态检测】安全

设备安全服务-应用设备状态检测 介绍 本示例向您介绍如何在应用中获取DeviceToken用于对应用的设备状态进行检测。 需要使用设备安全服务接口 kit.DeviceSecurityKit。 效果预览 Sample工程的配置与使用 在DevEco中配置Sample工程的步骤如下 [创建项目]及[应用]。打开Sam…

数据结构与算法 - 递归

一、递归 1. 概述 定义&#xff1a;在计算机科学中&#xff0c;递归是一种解决计算问题的方法&#xff0c;其中解决方案取决于同一类问题的更小子集。 比如单链表递归遍历的例子&#xff1a; void f(Node node) {if(node null) {return;}println("before:" node…

Animate软件基础:在时间轴中添加或插入帧

FlashASer&#xff1a;AdobeAnimate2021软件零基础入门教程https://zhuanlan.zhihu.com/p/633230084 FlashASer&#xff1a;实用的各种Adobe Animate软件教程https://zhuanlan.zhihu.com/p/675680471 FlashASer&#xff1a;Animate教程及作品源文件https://zhuanlan.zhihu.co…

软件测试--python基础

一、python基础 (1)第一个python (2)python解释器 (3)基础语法 ①字面量 什么是字面量 常用的值类型 字符串 ②注释 ③变量 什么是变量 变量的特征 变量的目的是存储运行过程的数据 存储的目的是为了&#xff1a;重复使用 ④数据类型 type()语句 变量有类型吗&#xff1f;…

在欧拉系统中安装数据库

在欧拉系统中的安装 &#xff08;禁止超级用户root登录&#xff09; yum install mariadb-server -y #下载命令 systemctl enable --now mariadb #设置为开机自启&#xff0c;并立即启动该服务 mysql_secure_installation #安全设置&#xff0c;初始化 修…

C语言数据在内存中的存储超详解

文章目录 1. 整数在内存中的存储2. 大小端字节序和字节序判断2. 1 什么是大小端&#xff1f;2. 2 为什么会有大小端&#xff1f;2. 3 练习 3. 浮点数在内存中的存储3. 1 一个代码3. 2 浮点数的存储3. 2. 1 浮点数存的过程3. 2. 2 浮点数取的过程3. 3 题目解析 1. 整数在内存中的…