The Cherno C++笔记 03
目录
Part 07 How the C++ Linker Works
1.链接
2.编译链接过程中出现的错误
2.1 缺少入口函数
注意:如何区分编译错误还是链接错误
注意:入口点可以自己设置
2.2 找不到自定义函数
2.2.1缺少声明
2.2.2自定义函数与引用函数不一致
2.3 在头文件中放入定义
2.3.1 多次定义
2.3.2 头文件不要放定义
Part 07 How the C++ Linker Works
1.链接
每个源文件都会被编译器编译成机器码.obj目标文件,接下来将这些obj目标文件组合成一个可执行的程序就需要链接。"链接" 就是指将多个源文件编译成一个可执行文件的过程。
2.编译链接过程中出现的错误
2.1 缺少入口函数
我们简单写一个乘法函数
Multiply.cpp
int Multiply(int a, int b)
{int z = a * b;return z;
}
Ctrl+F7 编译

成功编译
Crtl+F5 编译+链接

缺少主函数,链接错误
注意:如何区分编译错误还是链接错误
编译错误
Multiply.cpp
int Multiply(int a, int b)
{int z = a * b;return z//故意少个分号
}

链接错误

注意:入口点可以自己设置
在 C++ 程序中,程序的入口点通常是 main 函数。然而,有时你可能希望自定义程序的入口点,这可以通过使用不同的入口函数和链接选项来实现。

2.2 找不到自定义函数
2.2.1缺少声明
我们在建立一个.cpp文件
Main.cpp
#include <iostream>
int main()
{std::cout << Multiply(2, 5) << std::endl;std::cin.get();
}
编译链接发现报错

因为编译这个文件的时候不知道有这个函数
声明一下就可以
int Multiply(int a, int b);

2.2.2自定义函数与引用函数不一致
如果我们在定义函数的时候将Multiply写错
int Multipl(int a, int b)
{int z = a * b;return z;
}
编译链接,链接错误,改函数名即可

2.3 在头文件中放入定义
2.3.1 多次定义
首先先看一个比较明显的错误
我们再引入Log函数
Log.cpp
#include <iostream>
void Log(const char* message)
{std::cout << message << std::endl;
}
//定义Log函数
Multiply.cpp
int Multiply(int a, int b)
{int z = a * b;return z;
}
Main.cpp
#include <iostream>
int Multiply(int a, int b);void Log(const char* message)
{std::cout << message << std::endl;
}
//把Log 函数再定义一遍int main()
{Log("2*5");std::cout << Multiply(2, 5) << std::endl;std::cin.get();
}
然后编译链接,链接错误

已经定义过了,这很显然,因为多次定义,链接器不知道链接哪一个。
2.3.2 头文件不要放定义
但是如果把定义放在头文件,可能就不容易发现了。
Log.h
#include <iostream>
void Log(const char* message)
{std::cout << message << std::endl;
}
Multiply.cpp(使用Log函数)
#include "Log.h"
//包含Log.h 头文件
int Multiply(int a, int b)
{Log("乘法函数");//使用Log函数int z = a * b;return z;
}
Main.cpp(使用Log函数)
#include <iostream>
int Multiply(int a, int b);#include "Log.h"
//包含Log.h 头文件int main()
{Log("2*5");//使用Log函数std::cout << Multiply(2, 5) << std::endl;std::cin.get();
}
编译链接,连接错误,多次定义(因为include 的本质是复制粘贴)

而如果我们将定义放在一个单独的cpp文件,头文件只用来声明,就没有这个顾虑
Log.h
void Log(const char* message);
Log.cpp
#include <iostream>
void Log(const char* message)
{std::cout << message << std::endl;
}
其余保持不变

成功!!
还有一种方法:inline
inline 指的是:inline 是 C++ 中的一个关键字,用于向编译器建议将函数的定义插入到调用处,而不是生成函数调用的代码,其实就是直接把函数体的内容替换过去
Log.h
#include <iostream>
inline void Log(const char* message)
{std::cout << message << std::endl;
}
这样即可
相关文章:
The Cherno C++笔记 03
目录 Part 07 How the C Linker Works 1.链接 2.编译链接过程中出现的错误 2.1 缺少入口函数 注意:如何区分编译错误还是链接错误 注意:入口点可以自己设置 2.2 找不到自定义函数 2.2.1缺少声明 2.2.2自定义函数与引用函数不一致 2.3 在头文件中放入定义 …...
蓝牙物联网与嵌入式开发如何结合?
蓝牙物联网与嵌入式开发可以紧密结合,以实现更高效、更智能的物联网应用。以下是一些结合的方式: 嵌入式开发为蓝牙设备提供硬件基础设施和控制逻辑:嵌入式系统可以利用微处理器和各种外设组成的系统,为蓝牙设备提供硬件基础设施和…...
前端面试——JavaScript面经(持续更新)
一、数据类型 1. JavaScript用哪些数据类型、它们有什么区别? JavaScript共有八种数据类型,分别包括5种基本数据类型和3种非基本数据类型。 基本数据类型:Undefined、Null、Boolean、Number、String。非基本数据类型:Object、S…...
微前端——无界wujie
B站课程视频 课程视频 课程课件笔记: 1.微前端 2.无界 现有的微前端框架:iframe、qiankun、Micro-app(京东)、EMP(百度)、无届 前置 初始化 新建一个文件夹 1.通过npm i typescript -g安装ts 2.然后可…...
连锁便利店管理系统有什么用
连锁便利店管理系统对于连锁便利店的运营和管理非常有用。以下是一些常见的用途: 1. 库存管理:连锁便利店通常需要管理多个门店的库存,管理系统可以帮助实时掌握各个门店的库存情况,包括商品数量、进货记录、库存调拨等。这样可以…...
Vue 的两种实现:VSCode 中配置 vue 模板快捷方式的过程
1、创建配置文件: 其一、打开 VSCode ,CtrlShiftP, 打开搜索框: 其二、输入:user, 并点击进去 Snippets:Configure User Snippets 其三、输入 vue3js 并回车: 其四、打开项目,发现配置文件 vue3js.code-sn…...
electron 切换至esm
前言 好消息,经过不知道多少年的讨论。 electron28.0.0开始(23.08.31),默认支持esm了。 see https://github.com/electron/electron/issues/21457 使用方法 升级至electron^28.0.0简单地在package.json中添加"type":…...
【新版】软考 - 系统架构设计师(总结笔记)
个人总结学习笔记,仅供参考!!!! →点击 笔者主页,欢迎关注哦(互相学习,共同成长) 笔记目录 📢【系统架构设计系列】系统架构设计专业技能 计算机组成与结构操作系统信…...
Spring MVC 方法中添加参数、HttpServletRequest 和 HttpServletResponse 对象
在这个例子中,我们添加了 HttpServletRequest 和 HttpServletResponse 对象作为控制器方法的参数。这样,你就可以在方法内部同时访问请求参数、请求对象和响应对象,从而进行更灵活的 HTTP 请求和响应处理。 RestController public class MyC…...
单片机的RTC获取网络时间
理解网络同步校准RTC的原理需要考虑NTP、SNTP、RTC这三个关键组件的作用和交互。下面详细解释这个过程: 1. NTP(Network Time Protocol): 协议目的:NTP是用于同步计算机和设备时钟的协议。它通过在网络上与时间服务器通…...
Android 13 内置可卸载的搜狗输入法
环境 系统:Android 13 芯片厂商:展锐 需求 默认只有英文输入法,没有中文,需要中文输入法,且可以卸载的。 实测为搜狗输入法,百度等其它输入法也同样适用。 实现 在SDK目录中创建packages/apps/SogouIM…...
持续集成交付CICD:GitLabCI 封装Python类 并结合 ArgoCD 完成前端项目应用发布
目录 一、实验 1. 环境 2. Python代码实现获取文件 3.Python代码实现创建文件 4.Python代码实现更新文件 5.GitLab更新库文件与运行流水线 6.ArgoCD 完成前端项目应用发布 二、问题 1.Python获取GitLab指定仓库文件报错 2. K8S master节点运行Python代码报错 一、实验…...
第十三章 常用类(Math 类、Arrays 类、System类、Biglnteger 和BigDecimal 类、日期类)
一、Math 类(P481) Math 类包含,用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。 (1)abs:绝对值 (2)pow:求幂 (3)c…...
2023年12月24日学习总结
今日to do list: 做kaggle上面的流量预测项目☠️ 学习时不刷手机🤡 okkkkkkkkkkkkkk 开始👍🍎 0、我在干什么? 我在预测一个名字叫做elborn基站的下行链路流量,用过去29天的数据预测未来10天的数据 1、…...
第26关 K8s日志收集揭秘:利用Log-pilot收集POD内业务日志文件
------> 课程视频同步分享在今日头条和B站 大家好,我是博哥爱运维。 OK,到目前为止,我们的服务顺利容器化并上了K8s,同时也能通过外部网络进行请求访问,相关的服务数据也能进行持久化存储了,那么接下来…...
芯科科技以卓越的企业发展和杰出的产品创新获得多项殊荣
2023年共获颁全球及囯內近20个行业奖项 Silicon Labs(亦称“芯科科技”)日前在全球半导体联盟(Global Semiconductor Alliance,GSA)举行的颁奖典礼上,再次荣获最受尊敬上市半导体企业奖,这是公…...
计算机视觉基础(11)——语义分割和实例分割
前言 在这节课,我们将学习语义分割和实例分割。在语义分割中,我们需要重点掌握语义分割的概念、常用数据集、评价指标(IoU)以及经典的语义分割方法(Deeplab系列);在实例分割中,需要知…...
CNAS中兴新支点——什么是软件压力测试?软件压力测试工具和流程
一、含义:软件压力测试是一种测试应用程序性能的方法,通过模拟大量用户并发访问,测试应用程序在压力情况下的表现和响应能力。软件压力测试的目的是发现系统潜在的问题,如内存泄漏、线程锁、资源泄漏等,以及在高峰期或…...
jQuery: 整理3---操作元素的内容
1.html("内容") ->设置元素的内容,包含html标签(非表单元素) <div id"html1"></div><div id"html2"></div>$("#html1").html("<h2>上海</h2>") …...
22、商城系统(四):项目jar包配置(重要),网关配置,商品服务基础数据设置
目录 0.重要:整个项目的配置 最外层的pom.xml renren-fast renren-generator xpmall-common xpmall-coupon...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
