C++程序如何编译运行

2023-11-06

下面是C++入门的hello world程序源码

#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
	cout << "hello world" << endl;

	return 0;
}

你可以在将上述源码复制粘贴到我的在线编译上执行。

程序各行解析

  1. #include <iostream>
    引入iostream头文件。

  2. using namespace std
    使用std命令空间,命令空间可防止名称污染。

  3. int main(int argc, char* argv[])
    入口函数定义,入口函数是由操作系统调用的。

  4. cout << "hello world" << endl
    在控制台打印hello world字符串,cout中控制台输出设备抽象出来的对象,<<是cout的输出运算符(也可以理解为输出设备的print方法),endl是换行标志。

  5. return 0
    向操作系统返回一个整形处理结果,操作系统会捕获这个整形数,一般程序执行成功会返回0,执行异常会返回负数。

hello world程序如何运行

编程语言编写的源代码实际上是人类可以理解自然语言,但计算机只认识二进制指令,所以我们要将源代码翻译成二进制机器码,这样计算机才能知道你的意图。这个将源代码翻译成二进制机器码的过程我们称之为编译。C++的整个编译过程又可细分为以下步骤:

  1. 预处理
    预处理可以简单理解为编译器将源码中的预处理指定(以#号开头行)转换成相应代码。如#include指令就是将#include指定的文件直接包含进来。

  2. 将源文件转换成目标文件
    将源文件(.cpp文件)转换成目标文件(.o文件),这个过程就是前源代码转换成二进制机器码,但针对源代码中引用其他类库的变量、函数编译器只知道他们的声明(一般包含在头文件中)也不知道其定义,所以编译只会检查变量、函数是否已声明,函数调用参数与声明是否一致,做完这些操作后编译器的任务就完成了,最终编译输出目标文件(.o文件)。

  3. 目标文件与库文件进行链接
    将目标文件中引用其他库的变量、函数等与二进制库文件中定义变量进行替换或建立关联关系。如果是变量、函数在静态库中定义,则链接器会将静态库中变量、函数定义打包复制一份到最终程序文件中,然后修改变量、函数的指向程序中的具体偏移地址。如果是变量、函数在动态库中定义,则链接器会将变量、函数指向动态库中具体地址。完成上面操作后生成可执行文件。

  4. 执行可执行文件
    在控制台输入可执行文件路径或在资源管理器中双击可执行文件就可运行可执行程序,程序实际上是操作系统装载运行的,操作系统能理解程序的二进制文件格式,然后分配程序执行所需的栈空间、代码段、静态存储区、映射堆空间地址等,操作系统会创建一个进程结构体来管理进程,然后将进程放入就绪队列,等待CPU调度运行。进程的内存模型大致如下:
    在这里插入图片描述

上面hello word程序中的main函数实际上是操作系统调用的,main函数执行完成会返回一个整形变量给操作系统。我们可以认为main函数是程序执行入口函数,但main并不是程序执行开始,全局变量的初始化(构造函数)是在进入main函数之前进行,相应的main函数return语句也是程序执行的最后代码,全局变量的销毁(析构函数)是在main函数结束之后执行的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++程序如何编译运行 的相关文章

随机推荐

  • 用批处理写修改注册表的命令

    一般书写格式 reg add 注册表路径 v 值名 t 要修改的数值类型 d 想要输入的数据 f 这个选项可根据情况自行添加 意为不用提示就强行改写现有注册表项 如果在批处理中不想显示出命令执行过程可以再reg前面加入 后面加上 gt nu
  • 使用python安装nginx

    肯定有小伙伴疑问哈 安装nginx仅仅需要几条命令如果只是单单安装简单使用os system os Popen几乎就足以完成 那么为什么要写这么多呢 笔者在写这段代码的时候一个是想让代码更加美观 显得比较专业 另一方面无论安装什么 配置什么
  • 前端 js实现模糊搜索

    前端 js实现模糊搜索 template
  • 全世界最好的编辑器VIM之Windows配置(gvim)

    全世界最好的编辑器VIM之Windows配置 gvim vundle插件管理 NERDTree插件 ctrlp插件 vim nerdtree tabs插件等 vim本来就是很强大 很方便的编辑器 再加上这些杀手级的插件 那就真的无敌了 官方
  • Caused by:org.springframework.beans.factory.NoSuchBeanDefinitionException:No qualifying bean of type

    今天使用Junit单元测试写了个测试spring的AnnotationConfigApplicationContext 的测试方法 代码如下 public class TestApplicationContext Test 较为经典的容器
  • 大数据学习-4.Hadoop运行环境搭建(二)

    文章目录 一 下载JDK和Hadoop安装包 二 安装JDK 三 安装Hadoop 1 单机模式搭建 2 分布式模式搭建 一 下载JDK和Hadoop安装包 下载地址 阿里云 提取码 q6y6 二 安装JDK 测试主机是否有java环境 如
  • 电磁场与电磁波第二章 电磁场的基本规律

    文章目录 第二章 电磁场的基本规律 电荷守恒定律 1 电荷与电荷密度 2 电流与电流密度 3 电荷守恒定律 电流连续性方程 真空中静电场的基本规律 1 库仑定律 电场强度 1 电场强度 2 几种典型电荷分布的电场强度 2 静电场的散度与旋度
  • 博弈论中存在的先动优势和后动优势

    博弈论中存在的先动优势和后动优势 完全信息动态博弈 Stackel berg寡头竞争模型属于先动优势 轮流出价的讨价还价模型 当均衡结果与T无关的时候且 1 贴现因子 2 1 双方无限的耐心 时 存在后动优势 因为他将拒绝任何自己不能得到全
  • idea中java源码英文注释的翻译

    效果展示 操作步骤两步 安装translation插件 设置翻译引擎 安装translation插件 选择该插件 安装好后重启idea即可使用 设置翻译引擎 这里用有道翻译演示 注册好后在业务里面创建翻译接口 创建好后把id和密钥复制填上去
  • 入门深度学习——基于全连接神经网络的手写数字识别案例(python代码实现)

    入门深度学习 基于全连接神经网络的手写数字识别案例 python代码实现 一 网络构建 1 1 问题导入 如图所示 数字五的图片作为输入 layer01层为输入层 layer02层为隐藏层 找出每列最大值对应索引为输出层 根据下图给出的网络
  • java手工注入bean,Spring注入Bean的一些方式总结

    通过注解注入Bean 背景 我们谈到Spring的时候一定会提到IOC容器 DI依赖注入 Spring通过将一个个类标注为Bean的方法注入到IOC容器中 达到了控制反转的效果 那么我们刚开始接触Bean的时候 一定是使用xml文件 一个一
  • 常见数据库安装

    简介 本文记录了常用数据库 MySQL PostgreSQL MSSQL Oracle Redis MongoDB在Windows 及Linux Ubuntu 下 MSSQL Oracle除外 的安装 macOS可参考前两者 解决了Orac
  • win10家庭版找不到组策略gpedit.msc的解决方法

    废话不多说 直接上方法 注意的事项我会再后面讲到 1 打开记事本 在记事本中保存如下批处理内容 echo off pushd dp0 dir b systemroot Windows servicing Packages Microsoft
  • Windows系统调用架构分析—也谈KiFastCallEntry函数地址的获取

    Windows系统调用架构分析 也谈KiFastCallEntry函数地址的获取 windows api 汇编 hook 存储 system 目录 为什么要写这篇文章 1 因为最近在学习 软件调试 这本书 看到书中的某个调试历程中讲了Win
  • proj.4的下载和编译

    简介 下载 编译 生成lib 简介 没啥好说的 地图坐标转换的库 下载 https github com OSGeo PROJ 选择tags下的最新版7 2 0 安装方法参考git下的安装说明 gt https proj org insta
  • Web3.0是什么?只需要记住这三个关键词

    作者 赛联区块链教育张群 2020年以后 科技发展一日千里 稍有不慎我们就会被社会淘汰 区块链 Web3是2022年最大风口 也是互联网未来发展趋势 Web3 0到底是什么 在给学员讲区块链课时我给大家用了这这三个词 保证你瞬时就能深刻理解
  • 2、k8s pod原理详解

    2 k8s pod原理详解 Kubernetes Pod 介绍 Pod 介绍与原理 POD操作实战 POD的创建和删除 pod的生命周期管理 资源的配额和限制 静态pod Init Containers k8s健康检查 POD镜像升级 po
  • 软件测试用例模板和例子_如何设计一个好的测试用例

    什么是测试用例 测试用例也叫测试案例 是在执行测试之前由测试人员编写的指导测试过程的重要文档 主要包括 用例编号 测试目的 测试步骤 预期结果等 注意 不同公司使用的用例模板可能存在差异 但都大同小异 为什么要写测试用例 1 防止测试点的遗
  • 数百款惠普打印机易受严重RCE漏洞影响

    聚焦源代码安全 网罗国内外最新资讯 编译 代码卫士 惠普发布了关于三个严重漏洞的安全公告 它们影响数百款 LaserJet Pro Pagewide Pro Office Jet Enterprise Large Format 和 Desk
  • C++程序如何编译运行

    下面是C 入门的hello world程序源码 include