【C++】深刻基础笔记

news2024/9/20 22:34:46

目录

关于debug:

多文件编译:

编译器工作原理

预处理:

如何将机器二进制转换成可以看懂的文件

链接器的工作原理

Pointers指针

Reference引用

C++线程


程序如何从源文件变成exe可执行文件?

首先是预处理器#include <...>,获取...文件的全部内容并将其粘贴到main.cpp文件中。

在此阶段,编译器将所有的c++代码转换到实际的机器代码中。

图片中1是项目配置,2是平台 配置

1菜单:调试和发布

2菜单: x86 x64

配置是构建项目时应用的一组规则,平台是编译所针对的平台的设置。

x86是在winow32位下编译,生成32位应用程序。所以win32和x86相同。

项目右键->属性

可以生成exe,还可以生成库文件

编译器运行设置在C/C++,决定文件如何被编译。

 

调试时优化是被禁用的,但发布没有。

 

所有的Cpp文件都会被编译,但是Headers文件不被编译,headers包含在预处理阶段。

每一个cpp文件被编译成一个目标文件,然后由linker将编译好的.obj目标文件链接到.exe 文件

Visual Studio可以通过 ctrl+F7 单独编译文件。,或者按Compile按钮。

若没有compile按钮,找到图中的添加或移除按钮->选择-自定义:

然后找到添加命令-生成(build)-编译(compile)

关于debug:

错误列表的工作方式:暂停输出窗口,查找错误并找到有关它的信息,然后将其插入错误列表,但这是非常一般的信息,所以查看错误信息最好到输出窗口。

“未解析的外部符号”意味着链接器找不到定义。链接器是将函数体与其标识符(名称)相关联。

多文件编译:

需要进行声明。声明看起来像定义,但是这里没有函数主体。
声明:某名字、某函数存在。只需要函数名称+参数类型+分号。可以不需要参数名称但指定出来更清楚。

定义:说明函数到底是什么,这是函数主体。

编译器工作原理

编译器在生成目标文件时实际会执行几件事情,首先需要预处理,将预处理语句整理成编译器可以实际理解的格式,这样就可以创建出一个抽象语法树的东西,但最后还是将我们的所有代码转换成常量数据的代码,这些代码就是CPU将执行的实际机器代码。

文件只是一种承载形式,实际编译器只需要被告知如何将文件处理,比如像c++文件或C文件处理

预处理:

预处理语句常用的包括Define if and if def,还有pragma语句。

如何将机器二进制转换成可以看懂的文件

打开属性-> C/C++ -> 汇编程序输出(仅有程序集的列表 /FA)-> 确定 。

然后编译文件,.aim文件即可打开。

链接器的工作原理

链接器的重点是找到每个符号和函数的位置,并将他们链接到一起。每个文件作为翻译单元编译成单独的目标并且这些文件彼此没有关系,链接器就是将这些没有关系的文件链接到一个程序中。

编译不会产生链接,但是构建会产生链接。

错误若是以C开头,则是编译器的错误,若是以LNK开头,则是连接器啊的错误。

每个.exe文件都需要一个函数入口点,其实入口点不一定是main函数,还可以是任何其他函数。

加了stactic,意味着这个函数只是为这个翻译单元声明。

#include的工作原理是当我们包含一个头文件时,我们只是获取该头文件内容并将其放在我们的位置include语句。

Pointers指针

指针是一个整数,一个数字,它存储一个内存地址。

//空指针,无效
void* ptr = NULL;

 现在该指针保存的是var变量的16进制的整数内存地址

复制该地址,打开下图内存1

复制地址到地址框,然后按回车键,即可看到该地址值。

 

指针的类型是被创造出来的意义,实际就是一个整数内存的地址。 只不过可以按指针类型分配合适的内存空间。

无法将10写入一个指针,它不知道 是什么,10是一个短整型,是2个整数;可能是一个int,4位;可能是long long型,是8位整数,所以不清楚到底应该写多少位。所以我们需要的类型是告诉编译器实际上知道这是一个整数,我需要你在其中写入4位。所以将void更改为4位,就对了。

F10可以继续调试到下一步:

 

也可以直接搜索变量名buffer

 当指针类型变成char*

 

Reference引用

引用必须引用已经存在的变量。不是新变量占用内存,实际没有存储空间。

看&具体是什么含义还要根据上下文来看,在下图中,&在int类型旁边,&就是引用的含义。此处只有一个变量,ref是对a的引用,使用ref就是在使用a。

成功将引用弹出函数。

 

引用传递,最后结果也是6,可以对引用做任何不能用指针做的事情

 

一旦声明一个引用,就不能改变引用的内容。并且声明是就需要初始化

 

 

C++线程

#include <iostream>
#include <thread>

static bool s_Finished = false;

void DoWork()
{
	using namespace std::literals::chrono_literals;
	std::cout << "Start thread id = " << std::this_thread::get_id() << std::endl;
	while (!s_Finished)
	{
		std::cout << "Working...\n";
		std::this_thread::sleep_for(1s);
		
	}
	
}
int main()
{
	std::thread worker(DoWork);

	std::cin.get();
	s_Finished = true;

	worker.join();
	std::cout << "Finished!" << std::endl;

	std::cin.get();
}

多线程时,当不停的去执行某线程,CPU就会变成100%,所以最好加延迟。

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

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

相关文章

斐波那契数列的多种解法 C++实现,绘图部分用Python实现

斐波那契数列的多种解法 C实现&#xff0c;绘图部分用Python实现 flyfish 斐波那契数列&#xff08;Fibonacci sequence&#xff09;是一个经典的数列&#xff0c;定义如下&#xff1a; { 0 if n 0 1 if n 1 F ( n − 1 ) F ( n − 2 ) if n > 1 \begin{cases} 0 &…

c++网络编程实战——开发基于ftp协议的文件传输模块(二) 配置ftp服务与手动执行ftp命令

配置FTP服务 一.前言 博主的环境是阿里云服务器&#xff0c;操作系统版本为 ubuntu20.04,一下所有操作都基于以上环境下进行的操作&#xff0c;同时为了简化操作我将开放同一个云服务器的不同端口&#xff0c;让它同时充当服务端和客户端&#xff0c;大家如果想测试效果更好且…

Java基础:类与对象,递归,方法

类与对象的区别和联系 1.类是抽象的,概念的他是数据类型 2.对象是具体的实际的,代表一个具体事务 3.类是对象的模板,对象是类的个体 **对象在内存中的存在形式** 基本数据类型在堆,引用类型如String,数组在方法区 对象的属性 属性基本说明 1.成员变量or成员属性 属性的定…

双向链表<数据结构 C版>

目录 关于链表的分类 双向链表结构体 初始化 尾插 头插 打印 判断是否为空 尾删 头删 查找 指定位置之后的插入 指定位置的删除 销毁 关于链表的分类 根据链表的三大特性&#xff0c;单向or双向、带头or不带头、循环or不循环&#xff0c;可将链表分为2*2*2&#xf…

利用ascp下载SRA Explorer中转录组数据

最近在windows系统里下载了MobaXterm可以远程登入服务器&#xff0c;处理RNA的数据&#xff0c;需要从NCBI数据库上下载数据。本文提供用虚拟机ubuntu或者linux系统下载Aspera的方法和问题解决&#xff0c;以及从NCBI上批量下载数据库、最后得到一个项目里的所有fastq文件。 A…

前端:Vue学习-2

前端&#xff1a;Vue学习-2 1. vue的生命周期2. 工程化开发和脚手架Vue CLI2.1 组件化开发2.2 scoped解决样式冲突2.3 data是一个函数2.4 组件通信2.5 非父子通信- event bus事件&#xff0c;provide&inject 3.v-model原理->实现父子组件双向绑定4. sync 修饰符->实现…

谷粒商城实战笔记-42-前端基础-Vue-生命周期和钩子函数

下面是Vue官网关于生命周期及不同阶段的钩子函数的图示。 Vue 实例生命周期是指从一个组件被创建到最终被销毁的整个过程。 在这一过程中&#xff0c;Vue 提供了一系列的“钩子”函数&#xff0c;在生命周期的不同阶段执行自定义的代码。 以下是 Vue 对象生命周期的主要阶段…

C语言实现二叉树以及二叉树的详细介绍

目录 1.树概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 2.二叉树概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树的存储结构 3.二叉树顺序结构--特殊的二叉树--堆及其实现 3.1堆的概念及结构 3.2堆的实现 3.2.1堆的结构 3.2.2堆…

filebeat生产环境配置

配置文件属性 生产配置 filebeat.inputs: - type: logenabled: truepaths: - /tmp/logs/*.log- /var/log/system.log- /var/log/wifi.logsymlinks: truejson.keys_under_root: truejson.message_key: xxxjson.add_error_key: true# 如果想卡部分日志&#xff0c;比如用时间作…

Monaco 使用 HoverProvider

Monaco 中自定义 Hover&#xff0c;Hover 效果是指当鼠标移动文字上展示出提示效果&#xff0c;就像页面上的 Tooltip 效果。最终页面的显示效果如下&#xff1a; 通过 registerHoverProvider 注册 Hover 触发时的处理方法 接口中提供了 4 个参数&#xff0c;前两个参数比较重…

python学习之闭包与装饰器

一、闭包 闭包允许一个函数访问并操作函数外部的变量&#xff08;即父级作用域中的变量&#xff09;&#xff0c;即使在该函数外部执行。 特性&#xff1a; (1)外部函数嵌套内部函数。 (2)外部函数可以返回内部函数。 (3)内部函数可以访问外部函数的局部变量。 def out()…

【jmeter边界值提取器】

【目的】 从响应头中取token的内容 【方案】 使用后置处理器-边界值提取器 【组件路径】HTTP请求->右键添加->后置处理器->边界提取器 用途&#xff1a;边界提取器(Boundary Extractor)是放在Sample请求之后执行的&#xff0c;用于获取左右边界中间的所有字符&#xf…

Windows配置Qt+VLC

文章目录 前言下载库文件提取文件编写qmakeqtvlc测试代码 总结 前言 在Windows平台上配置Qt和VLC是开发多媒体应用程序的一个重要步骤。Qt作为一个强大的跨平台应用开发框架&#xff0c;为开发人员提供了丰富的GUI工具和库&#xff0c;而VLC则是一个开源的多媒体播放器&#x…

基于STM32的农业大棚温湿度采集控制系统的设计

目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 &#x1f91e;大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是智能教室。 设备的详细功能见网盘中的文章《8、基…

451.根据字符出现频率排序(中等)

451.根据字符出现频率排序&#xff08;中等&#xff09; 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;451.根据字符出现频率排序&#xff08;中等&#xff09; 2.详细题解 题目&#xff1a; 347. 前 K 个高频元素&#xff08;中等&am…

2月科研——arcgis计算植被差异

ArcGIS中&#xff0c;设置高于或低于某个值的像元为 -9999&#xff0c;然后将这些地方设为空——目的&#xff1a;去除异常值和黑色背景值 Con(("T_std ano7.tif" > 2) | ("T_std ano7.tif" < - 2), - 9999,"T_std ano7.tif") SetNull(&…

数学基础【俗说矩阵】:初等矩阵和矩阵的初等行变化关系推导

初等矩阵和矩阵的初等行变换 初等矩阵 矩阵的初等行变换 对单位阵E进行一次初等行变化得到的阵叫做初等阵。 这里只能进行一次初等行变换。 置换阵 给矩阵【左乘】一个【置换阵】&#xff0c;相当与对该矩阵进行了一次【置换阵】对应的【置换】初等行变换&#xff1b; 数…

爬取百度图片,想爬谁就爬谁

前言 既然是做爬虫&#xff0c;那么肯定就会有一些小心思&#xff0c;比如去获取一些自己喜欢的资料等。 去百度图片去抓取图片吧 打开百度图片网站&#xff0c;点击搜索xxx&#xff0c;打开后&#xff0c;滚动滚动条&#xff0c;发现滚动条越来越小&#xff0c;说明图片加载…

Wordpress文章分享到微信朋友圈不带图像问题的解决

目录 一、插件选择 二、插件安装 三、获取微信公众号管理信息 1、登录微信公众平台 2、配置“JS接口安全域名” 3、至安全中心设置“IP白名单” 4、获得“开发者ID(AppID)” 5、获得“开发者密码(AppSecret)” 四、配置插件 五、验证 WordPress装配好后&#xff0c;可…

10.11和10.8那个大(各种ai的回答)

问题&#xff1a;10.11和10.8两个数哪个大 腾讯混元 ✔️ chatGPT ❎ 通义千问 ❎ 文心一言 ✔️ 智谱清言 ❎ 讯飞星火 ✔️ C知道 ❎ 豆包 ✔️