C++编译和链接

news/2024/11/24 1:48:41/

目录

一、源代码的组织

①头文件(*.h)

②源文件(*.cpp)

③主程序(main函数所在的程序)

④从源代码到可执行文件,编译的过程有三大步骤:

1)编译预处理

2)编译

3)链接

二、编译预处理

三、编译

四、链接

五、更多细节


一、源代码的组织

①头文件(*.h)

#include头文件、函数的声明、结构体的声明、类的声明、模板的声明、内联函数、#define和const定义的常量等。

②源文件(*.cpp)

函数的定义、类的定义、模板具体化的定义

③主程序(main函数所在的程序)

主程序负责实现框架和核心流程,把需要用到的头文件用#include包含进来。

④从源代码到可执行文件,编译的过程有三大步骤:

1)编译预处理

2)编译

3)链接

二、编译预处理

编译预处理是指对我们写的源代码进行预处理,生成临时文件

预处理的包括以下方面(了解即可)

①预处理#include头文件包含指令

②处理条件编译指令#iifdef #else #endif、#ifndef #else #endif

③处理#define宏定义

④为代码添加行号、文件名和函数名

⑤删除注释

⑥保留#pragma编译器指令(编译的时候会用到)

三、编译

编译主要是将预处理生成的临时文件经过词法分析、语法分析、语义分析以及优化和汇编后生成二进制的目标obj文件只检查是否合法,不检查定义是否存在,所以如果名称存在但是定义不存在,在编译的时候不会报错,链接的时候才会报错。

四、链接

链接是指将编译后的目标obj文件,以及他们需要的库文件链接在一起,形成一个整体的可执行的exe文件

五、更多细节

①分开编译的好处

每次只编译修改过的源文件,然后再链接,效率最高。

②编译单个*.cpp文件的时候,必须要让编译器知道名称的存在,否则会出现找不到标识符的错误。

③编译单个*。cpp文件的时候,编译器只需要知道名称的存在,不会把他们的定义一起编译。

④如果函数和类的定义不存在,编译不会报错,但链接会出现无法解析的外部命令。

⑤链接的时候,变量、函数和类的定义只能有一个,否则会出现重定义的错误。(如果把变量、函数和类的定义放在*.h文件中,*.h会被多次包含,链接前会存在多个副本,如果放在*.cpp文件中,*.cpp文件不会被包含,只会被编译一次,链接前只存在一个版本)

⑥把变量、函数和类的定义放在*.h中是不规范的做法,如果*.h会被多个*.cpp包含,会出现重定义。

⑦用#include包含*.cpp也是不规范的做法,原理同上。

⑧尽可能不适用全局变量,如果一定要用,要在*.h文件中声明(需要加extern关键字),在*.cpp中定义。

⑨全局的const常量在头文件中定义(const常量仅在单个文件内有效)。

⑩*.h文件重复包含的处理方法只对单个的*.cpp文件有效,不是整个项目。

11)函数模板和类模板的声明和定义可以分开书写,但它们的定义并不是真实的定义,只能放在*.h文件中;函数模板和类模板的具体化版本的代码时真实的定义,所以放在*.cpp文件中。

12.Linux下C++编译和链接的原理与VS一样。


http://www.ppmy.cn/news/82634.html

相关文章

加速数实融合,数据交易3.0模式上新

数据交易市场将迎来真正的突破? 目前看的确如此。随着去年底“数据二十条”的颁布,业界普遍认为数据基础制度将加速走向落地与完善,数据要素化今年有望迎来全面提速,将极大促进数据交易市场走向规模化。 IDC预测,到2…

C++项目设计:构建高性能、线程安全的日志系统

C++项目设计:构建高性能、线程安全的日志系统 一、引言(Introduction)1.1 日志系统的重要性(Importance of Logging System)1.2 日志系统的基本要求(Basic Requirements of Logging System)1.2.1 高性能(High Performance)1.2.2 线程安全(Thread Safety)1.2.3 易用性…

C++ QT QDBus基操

以下是使用QDBus进行跨进程通信的具体用法&#xff1a; 1. 创建DBus服务 在服务端进程中&#xff0c;需要创建一个DBus服务&#xff0c;并注册DBus对象。示例代码如下&#xff1a; #include <QDBusConnection> #include <QDBusMessage> #include <QDBusInterf…

关于 arduino 中的 random()和randomSeed()的使用

0、random() 函数&#xff1a; 用于生成一个指定范围内的伪随机整数&#xff0c;可以使用该函数在程序中产生不同的随机数。其语法如下&#xff1a; random(min, max) 其中&#xff0c;min 表示随机数的最小值&#xff0c;max 表示随机数的最大值&#xff08;不包括该…

『手撕 Mybatis 源码』04 - 创建 sqlSession

创建 sqlSession 创建 openSession 对象 当获取 SqlSessionFactory 之后&#xff0c;就可以开始获取 SqlSession 对象 public class MybatisTest {Testpublic void test1() throws IOException {...// 3.问题&#xff1a;openSession()执行逻辑是什么&#xff1f;// 3. (1) …

div 随着内容撑开

当内容不定高时&#xff0c;可以使用以下几种方式让 div 随着内容撑开&#xff1a; 使用 display: flex 将父元素设置为 display: flex&#xff0c;并使用 flex-direction: column 让子元素纵向排列。此时&#xff0c;子元素会沿着主轴向上排布&#xff0c;同时设置其 flex 属性…

iTOP-RK3568开发板编译瑞芯微原厂源码

1 输入以下命令设置 java 版本为 1.8 版本&#xff0c;确认 java 版本是 1.8 版本之后&#xff0c;才可以进行下一步编译&#xff0c;如下图所示&#xff1a; source javaenv.sh java -version 2 输入命令配置 Android 分支 source build/envsetup.sh lunch rk3568_r-user…

mycat2主从配置实现读写分离

mycat2主从配置实现读写分离 在https://blog.csdn.net/zhangxue_wei/article/details/130840504基础上继续搭建 1.创建mycat数据源&#xff0c;可以在navcat里直接执行 1.1读数据源m1 /* mycat:createDataSource{"dbType":"mysql","idleTimeout&qu…