首页 > 编程语言 >【C++】01-C++ 程序的生成过程

【C++】01-C++ 程序的生成过程

时间:2024-10-31 16:48:21浏览次数:3  
标签:01 C++ hello SayHello cpp 生成 预处理

概要:该篇文章以 MSCV 为例,简要介绍了 C++ 程序的生成过程。

1. 生成工具

MSVC,全称 Microsoft Visual C++,是由微软开发的用于生成 C++ 程序的工具集,包括 C++ 预处理器、编译器、链接器和其他生成工具。

2. 生成过程

2.1 预处理(Preprocess)

预处理由预处理器(Preprocessor)完成,其目的是对源代码进行预处理,为后续编译做准备。编写一个 hello.h 头文件和一个 hello.cpp 源文件,其各自的内容如下。在 VS 的开发者命令提示符中输入指令:cl -P hello.cpp,将生成以 .i 结尾的预处理文件。预处理文件的内容仍然是可读的文本文件,打开后的内容如下,对比后可以发现,预处理过程主要完成以下内容:

  • 删除注释
  • 拷贝头文件
  • 处理条件编译
  • 展开宏定义
// hello.h
#ifndef HELLO_H
#define HELLO_H

void SayHello();

#endif
// hello.cpp
#include "hello.h"
#define PI 3.1415926

void SayHello()
{
    return;
}
#line 1 "hello.cpp"

#line 1 "C:\\Users\\mushuishui\\Desktop\\hello\\hello.h"




void SayHello();

#line 8 "C:\\Users\\mushuishui\\Desktop\\hello\\hello.h"
#line 3 "hello.cpp"


void SayHello()
{
    int pi = 3.1415926;
    return;
}

其中 #line 命令为 MSVC 预处理器的特性,可以忽略

2.2 编译(Compile)

编译由编译器(Compiler)完成,其目的是将预处理后的源文件翻译为可供计算机执行的二进制文件。在 VS 的开发者命令提示符中输入指令:cl -c -Tp hello.i,继续生成以 .obj 结尾的目标文件。

2.3 链接(Link)

链接由链接器(Linker)完成,其目的是将若干个编译后产生的目标文件链接成可执行文件,可执行文件就是最终生成的可以直接运行的 C++ 程序。编写另一个具有入口函数的 main.cpp 源文件,其内容如下,按照上述步骤编译生成另一个目标文件,在 VS 的开发者命令提示符中输入指令:link main.obj hello.obj,将生成 .exe 结尾的可执行文件。

// main.cpp
#include "hello.h"

int main()
{
    SayHello();
}

3. 总结

最后以一张图概括 C++ 程序的生成过程。
在这里插入图片描述

标签:01,C++,hello,SayHello,cpp,生成,预处理
From: https://blog.csdn.net/E696472716D4/article/details/143380451

相关文章

  • C++ halcon判断图像是否为空
    使用CountObj函数首先,可以使用CountObj函数来检查当前图像是否为空。如果图像为空,则返回的计数为0;否则,返回的计数大于0。示例代码如下:cppCopyCode HTuplehNum;HalconCpp::CountObj(m_hCurrentImg,&hNum);if(hNum==0){qDebug()<<"传入图像为空!";}else{qDebu......
  • vue2之页面生成PDF导出并适应A4页面
    一、技术vue2 、 elementUI、html2canvas  、jsPDF二、技术官网vue2:https://cn.vuejs.org/elementUi:https://element.eleme.cn/#/zh-CNhtml2canvas:https://html2canvas.hertzen.com/jsPDF:https://www.npmjs.com/package/jspdf三、优缺点优......
  • [GWCTF 2019]xxor
    [GWCTF2019]xxor首先可以到汇编界面从新定义(U+P)一下main函数,不然看着会有点乱分析追踪input变量可以看到每次循环是获取四字节的输入但后面对于tmp变量的赋值我就有点看不懂了,不要紧,直接动调动态调试连接linux,下断点开调我不知道为什么输入字符会直接跳出循环,所以输入......
  • Prometheus01 Prometheus基础, 部署与配置, Node Exporter, Pushgateway, PromQL 运算
    云原生监控系统Prometheus1Prometheus介绍1.2监控内容和方法1.2.2监控方法 Google的四个黄金指标1.延迟(Latency)服务请求所需要的时长,例如HTTP请求平均延迟2.流量(Traffic),也称为吞吐量3.错误(Errors)4.饱和度(Saturation)资源的整体利用率,包括CPU(容量、配......
  • ISO9001质量管理体系:为您的企业打造卓越品质
    在当今竞争激烈的市场环境中,质量已成为企业成功的关键。ISO9001质量管理体系,这一国际公认的标准化质量管理体系标准,为企业的品质管理提供了有力支持。ISO9001是ISO9000族标准所包括的一组核心标准之一。ISO9000族标准是由国际标准化组织(ISO)在1994年提出的概念,旨在为组织提供一套......
  • AP5101芯片
    led车灯驱动线性芯片产品体积小外围简单AP5101c产品描述AP5101C是一款高压线性LED恒流芯片,外围简单、内置功率管,适用于6-100V输入的高精度降压LED恒流驱动芯片。最大电流2.0A。AP5101C可实现内置MOS做2.0A,外置MOS可做3.0A的。AP5101C内置温度保护功能......
  • 【C++】红黑树的插入与删除
    第一篇数据结构学习之红黑树的实现系列文章目录前言一、红黑树的基本概念二、参考视频链接三、代码实现1.定义节点类2.旋转方法3.红黑树插入操作4.红黑树删除操作四,总体代码总结系列文章目录第一篇数据结构学习之红黑树的实现前言红黑树是一种平衡二叉搜索树,在......
  • IDEA 利用groovy脚本生成注释
     介绍 本文主要介绍利用IDEA编辑器的活动模板,结合groovy脚本,生成注释模板。目前生成的注释主要适用于java和js文件推荐此方式,可以根据需要定义groovy脚本,生成不同格式的注释操作点击File>>Setting 找到Edtor>>LiveTemolates,建议创建一个模板组java_of......
  • C++——写一函数,将一个3x3的整型矩阵转置。用指针或引用方法处理。
    没注释的源代码#include<iostream>usingnamespacestd;voidmove(int*p);intmain(){  inta[3][3],*p;  cout<<"pleaseinputmatrix:"<<endl;  for(inti=0;i<3;i++)  {    for(intj=0;j<3;j++)    {     ......
  • C++——将一个5x5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(按从左到右、
    没注释的源代码#include<iostream>#include<stdio.h>#include<string.h>usingnamespacestd;voidtransform(int*arry,intcol_row);intmain(){   intarry[5][5];   cout<<"Pleaseentera5x5matrix:"<<endl;   for(......