The Cherno C++笔记 03

news2025/1/24 22:31:10

目录

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;
}

这样即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1329927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

conda环境下更改虚拟环境安装路径

1 引言 在Anaconda中如果没有指定路径,虚拟环境会默认安装在anaconda所安装的目录下,但如果默认环境的磁盘空间不足&#xff0c;无法满足大量安装虚拟环境的需求&#xff0c;此时我们需要更改虚拟环境的安装路径&#xff0c;有以下两种方案&#xff1a; 方案1&#xff1a; 每次…

【贪心算法】之 摆动序列(中等题)

实际操作上&#xff0c;其实连删除的操作都不用做&#xff0c;因为题目要求的是最长摆动子序列的长度&#xff0c;所以只需要统计数组的峰值数量就可以了&#xff08;相当于是删除单一坡度上的节点&#xff0c;然后统计长度&#xff09; 这就是贪心所贪的地方&#xff0c;让峰…

Java设计模式之单例模式以及如何防止通过反射破坏单例模式

单例模式 单例模式使用场景 ​ 什么是单例模式&#xff1f;保障一个类只能有一个对象&#xff08;实例&#xff09;的代码开发模式就叫单例模式 ​ 什么时候使用&#xff1f; 工具类&#xff01;&#xff08;一种做法&#xff0c;所有的方法都是static&#xff0c;还有一种单…

Python命令行参数解析:原理、技巧与实践

文章目录 引言命令行参数解析原理命令行参数概述使用argparse模块解析命令行参数1. 创建ArgumentParser对象2. 添加命令行参数3. 解析命令行参数4. 可选参数action5. 参数的类型转换 实践示例总结结束语 引言 在Python中&#xff0c;命令行参数解析是一个重要的主题&#xff0…

【稳定检索|投稿优惠】2024年绿色能源与电网电力系统国际会议(ICGEGPS 2024)

2024年绿色能源与电网电力系统国际会议(ICGEGPS 2024) 2024 International Conference on Green Energy and Grid Power Systems(ICGEGPS) 一、【会议简介】 2024年绿色能源与电网电力系统国际会议(ICGEGPS 2024)将在宜宾盛大召开。本次会议将聚焦绿色能源与电网电力系统的最新…

Linux——缓冲区

我在上篇博客留下了一个问题&#xff0c;那个问题就是关于缓冲区的问题&#xff0c;我们发现 文件有缓冲区&#xff0c;语言有用户级缓冲区&#xff0c;那么缓冲区到底是什么&#xff1f;&#xff0c;或者该怎 么认识缓冲区&#xff1f;这篇文章或许会让你有所认识&#xff0c;…

单例模式的基本用法

单例模式是众多设计模式中的一种&#xff0c;那说到设计模式&#xff0c;我们要想知道什么是设计模式? 设计模式就是一套反复使用、多数人知晓的、经过分类、代码设计经验总结。 使用设计模式是为了可重用代码、让代码更容易被他人理解&#xff0c;保证代码的可靠性。毫无疑问…

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议 漏洞名称 漏洞描述 在Oracle WebLogic Server 10.3.6.0.0/12.1.3.0.3/2.2.1/1.10/12.2.1.1/22.0&#xff08;Application …

Pipelined-ADC设计二——结构指标及非理想因素(Part1)

本章将详细介绍电路各个模块的设计思路和设计中需要注意的关键点&#xff0c;给出流水线ADC中的非理想因素&#xff0c;并计算出流水线ADC各个模块具体指标。根据电路中信号的传输方向&#xff0c;依次介绍采样保持电路、Sub_ADC&#xff0c;MDAC 等模块的设计。&#xff08;本…

【GitHub精选项目】短信系统测试工具:SMSBoom 操作指南

前言 本文为大家带来的是 OpenEthan 开发的 SMSBoom 项目 —— 一种用于短信服务测试的工具。这个工具能够发送大量短信&#xff0c;通常用于测试短信服务的稳定性和处理能力。在合法和道德的范畴内&#xff0c;SMSBoom 可以作为一种有效的测试工具&#xff0c;帮助开发者和系统…

关于redis单线程和IO多路复用的理解

首先&#xff0c;Redis是一个高性能的分布式缓存中间件。其复杂性不言而喻&#xff0c;对于Redis整体而言肯定不是只有一个线程。 我们常说的Redis 是单线程&#xff0c;主要是指 Redis 在网络 IO和键值对读写是采用一个线程来完成的&#xff0c;这也是 Redis 对外提供键值存储…

【ARMv8M Cortex-M33 系列 1 -- SAU 介绍】

文章目录 Cortex-M33 SAU 介绍SAU 的主要功能包括SAU 寄存器配置示例 Cortex-M33 SAU 介绍 在 ARMv8-M 架构中&#xff0c;SAU&#xff08;Security Attribution Unit&#xff09;是安全属性单元&#xff0c;用于配置和管理内存区域的安全属性。SAU 是 ARM TrustZone 技术的一…

论文阅读——Flamingo

Flamingo: a Visual Language Model for Few-Shot Learning 模型建模了给定交织的图片或支视频的条件下文本y的最大似然&#xff1a; 1 Visual processing and the Perceiver Resampler Vision Encoder&#xff1a;from pixels to features。 预训练并且冻结的NFNet&#xff…

kindeditor The method toJSONString() is undefined for the type JSONObject

kindeditor 插件上传文件出错的 json_simple-1.1.jar 也不知道是多老的项目&#xff0c;多老的包了&#xff0c;稀有东西

助力智能人群检测计数,基于DETR(DEtectionTRansformer)开发构建通用场景下人群检测计数识别系统

在一些人流量比较大的场合&#xff0c;或者是一些特殊时刻、时段、节假日等特殊时期下&#xff0c;密切关注当前系统所承载的人流量是十分必要的&#xff0c;对于超出系统负荷容量的情况做到及时预警对于管理团队来说是保障人员安全的重要手段&#xff0c;本文的主要目的是想要…

Liteos移植_STM32_HAL库

0 开发环境 STM32CubeMX(HAL库)keil 5正点原子探索者STM32F4ZET6LiteOS-develop分支 1 STM32CubeMX创建工程 如果有自己的工程&#xff0c;直接从LiteOS源码获取开始 关于STM32CubeMX的安装&#xff0c;看我另一篇博客STM32CubeMX安装 工程配置 创建新工程 选择芯片【STM32F…

C++:第九讲前缀和与差分

Everyday English Your optimal career is simply this: Share the real you with physical world through th e process of creative self-expression. 你的最佳职业很简单&#xff0c;就是这样&#xff1a;通过创造性自我表达的途径和世界分享真实的你。 前言 这节课带你们…

Codeforces Round 862 (Div. 2)

Problem - A - Codeforces AC代码: #include<bits/stdc.h> #define endl \n //#define int long long using namespace std; const int N1e310; int a[N]; int n; void solve() {cin>>n;int ans0;for(int i1;i<n;i) cin>>a[i],ans^a[i];if(n%21){for(in…

3.[BUUCTF HCTF 2018]WarmUp1

1.看题目提示分析题目内容 盲猜一波~ &#xff1a; 是关于PHP代码审计的 2.打开链接&#xff0c;分析题目 给你提示了我们访问source.php来看一下 大boss出现&#xff0c;开始详细手撕~ 3.手撕PHP代码&#xff08;代码审计&#xff09; 本人是小白&#xff0c;所以第一步&…

Linux Centos-7.5_64bit 等保测评

一、新增用户 新增test用户 useradd test 设置密码 passwd 修改test的密码 passwd test 修改/etc/sudoers文件&#xff0c;找到下面一行&#xff0c; /etc/sudoers test ALL(ALL) ALL 保存是出现 E45: readonly option is set (add ! to override) 解决办法&#xff…