第一周周总结

news2024/11/28 19:25:59

# 1.本周收获总结
下面分享我在本周通过学习所收获到的知识
## 1.1 C++中生成可执行文件的过程
### 1.1.1 预处理
源代码首先经过预处理器处理。预处理指令(#include,#define等)在这一步被执行。预处理器会展开所有的宏定义、处理条件编译指令,并将所有的#include指令替换为相应的头文件内容。预处理后的代码不再包含这些预处理指令。
作用:防止头文件被循环展开而产生编译错误;有助于减少重复代码和提高**代码复用**性。
### 1.1.2 编译
经过预处理后的代码会被传递给编译器。编译器将源代码转化成汇编语言。在这一步中,编译器会进行语法分析、语义分析、优化等处理。编译的结果是汇编代码,通常保存为.s文件。
作用:编译器在这个过程会检查语法、类型匹配等问题,**如果发现错误,编译器会报告并终止编译过程**;编译过程还包括**优化代码**,例如删除无用代码、循环展开等,以**提高程序运行时的性能**;
### 1.1.3 汇编
汇编器将汇编代码转换成机器代码(二进制指令),对应于特定的处理器架构。汇编的结果是目标文件(Object File),通常保存为.o或.obj格式。
作用:将源码转换为机器语言代码**使得程序能够在特定的硬件平台上运行**。汇编过程使编译过程与目标平台的底层硬件实现解耦,**提高了编译器的可移植性**。
### 1.1.4 链接
如果程序包含了多个源代码文件,或者使用了外部库,链接器会将所有目标文件及所需要的库文件合并成一个单一的可执行文件。链接器的主要工作就是将有关的目标文件彼此相连接,也就是将一个文件中引用的符号,同该符号在另外一个文件中的定义连接起来。在链接过程中,链接器解决了程序中的符号引用问题,比如函数和全局变量的地址。链接的最终产物是可执行文件。Windows系统中通常是.exe文件。
作用:链接过程允许将程序分割成多个独立的源代码文件和库文件,便于**模块化开发、代码重用和程序维护**。
## 1.2 第一个简单的C++程序
```
#include <iostream> //编译预处理命令 
using namespace std; //使用命名空间 
int add(int a,int b); //声明add函数 
int add(int a,int b) //定义add函数 
{  
 return a+b;  
};  
int main()  //主函数,程序入口
{   
 int n,m; //定义两个变量  
 cout << "Hello, World!" << '\n';  
 cout << "GO Clippers" << endl;  
 cout << endl;  
  
 cout << "Please enter two number :" << endl; //输出  
 cin >> n >> m; //输入两个变量  
 int sum = add(n,m);  
 cout << "The sum is:" << sum << endl;  
 return 0;  
}
```

### 1.2.1 头文件与源文件
一、头文件
作用:将可以被多个.cpp文件使用的函数或方法统一封装在一个文件中,当其他.cpp文件需要使用这个变量或函数时,通过#include将其包含进来就可以。

原因:这里涉及到c++++的编译模式,头文件是不被编译的,只有源文件(.CPP)文件才会被编译,当然也可以说头文件和包含他的源文件一起编译,所以为了方便这些函数的多次复用和契合c++++的分别编译,就可以将这些变量和函数放在.h文件中,谁需要用谁就#include下就可以了。

使用:头文件中写些变量声明了,函数声明了,类的定义了之类的,具体的可以查看文末引用的文献,那里面讲的详细。

引用:系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。用户自定义的头文件用双引号括起来,编译器首先会在用户目录下查找,然后再到c++安装目录下查找,最后在系统文件中查找。

二、源文件

.CPP文件,称为c++ ++源文件,里面放的都是c++++的源代码。.cpp文件里面的东西都是相对独立的,在编译(compile)时不需要与其他文件互通,只需要在编译成目标文件后在与其他的目标文件做一次链接(link)就行。比如,在文件a.cpp中定义一个全局函数“void a(){}”,而在文件b.cpp中需要调用这个函数。即使这样,文件a.cpp和文件b.cpp并不需要互相知道对方的存在,而是可以分别的对他们进行编译,编译成目标文件之后再链接,整个程序就可以运行了。

### 1.2.2 #include指令
#include的两种方式,分别为:

<1>#include<header.h>
这种形式用于包含标准库头文件或者项目特定的头文件,但不是当前源文件所在的目录。
编译器首先会在系统头文件目录中查找该头文件,这些目录通常由编译器的配置指定。
如果在系统头文件目录中找不到,编译器可能会尝试在用户指定的其他目录中查找。
这种方式不会在当前源文件所在的目录中查找头文件。

<2>#include"header.h" 或 #include"header":
这种形式用于包含与源文件位于同一目录下的头文件,或者项目内部的头文件。
编译器首先会在当前源文件所在的目录中查找头文件。
如果在当前目录中找不到,编译器会按照包含标准库头文件的方式去查找。
这种方式通常用于项目内部的头文件,以避免与系统头文件发生命名冲突。

总结来说,#include<>主要用于包含**标准库头文件和系统级别的头文件**,而#include""主要用于包含**项目内部的头文件**。正确使用这两种形式可以帮助编译器更快地找到头文件,并减少不必要的搜索,从而提高编译效率。
### 1.2.3 宏定义
第一种方式
```
#include <iostream> 
#define A 10 
using namespace std;  
  
int main()  
{  
 cout << A << endl;  
 return 0;  
}
```
第二种方式
```
#include <iostream> 
#define SQUARE(x) x * x  
using namespace std;  
  
int main()  
{  
 cout << "SQUARE(5): " << SQUARE(5) << endl;  
 cout << "SQUARE(5 + 1): " << SQUARE(5 + 1) << endl;  
 // 宏展开为 5 + 1 * 5 + 1,这里会得到错误的结果 11  
 return 0;  
}
```

### 1.2.4 命名空间
C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称都存在于全局作用域中,可能导致很多冲突。这时候就使用到了命名空间,目的是对标识符的名称进行本地化,避免命名冲突。
定义一个命名空间:
```
namespace mynamespace
{
    int a;
    int b;
}
```
使用命名空间的方式:
(1)加作用域限定符(指定命名空间)
编译器若要查找一个函数,它的**默认查找的顺序是:先局部,再全局域**。它不会主动到命名空间去找,除非我们加上作用域限定符之后才会进去查找。
```
#include <iostream> 
namespace firstnamespace
{  
 int a=1;  
}  
namespace secondspace
{  
 int a=2;  

 
int main() 
{  
 int a=0;  
 /**  
 * 加上作用域限定符后才会去指定的命名空间查找  
 */  
 std::cout << a << std::endl;  
 std::cout << firstnamespace::a << std::endl;  
 std::cout << secondspace::a << std::endl;  
 return 0;  
}
```
此时会输出:
```
D:\Local\workplace\Test1\cmake-build-debug\Test1.exe
0
1
2
Process finished with exit code 0
```
(2)直接展开命名空间
当我们需要重复调用一个命名空间里面的函数时,每一次调用我们就需要指定一下命名空间,多少有点麻烦。我们可以使用下面一条语句:

```
using namespace firstnamespace;
```
代码如下:
```
#include <iostream> 
namespace firstnamespace
{  
 int a=1;  
}  
namespace secondspace
{  
 int a=2;  
}  
using namespace firstnamespace;  
int main() 
{  
 std::cout << a << std::endl;  
 std::cout << firstnamespace::a << std::endl;  
 std::cout << secondspace::a << std::endl;  
 return 0;  
}
```
运行结果为:
```
D:\Local\workplace\Test1\cmake-build-debug\Test1.exe
1    //通过展开命名空间访问a属性
1
2
Process finished with exit code 0
```
这时查找的优先级会变成:**局部>全局=命名空间**。在全局和命名空间同时存在同名函数或变量时,展开了命名空间之后,**相当于把命名空间里面的东西释放到了全局中**,如果之前全局域中存在了同名函数,那么就会报错。
(3)展开指定成员

```
#include <iostream> namespace firstnamespace
{  
 int a=1;  
 int b=13;  
}  
namespace secondspace
{  
 int a=2;  
}  
using firstnamespace::a;  
int main() 
{   
 std::cout << a << std::endl;  
 std::cout << a << std::endl;  
 std::cout << firstnamespace::a << std::endl;  
 //因为只展开了命名空间的a属性,在使用b属性时仍需通过作用域限定符指定  
 std::cout << firstnamespace::b << std::endl;  
 std::cout << secondspace::a << std::endl;  
 return 0;  
}
```
以上代码的运行结果为:
```
D:\Local\workplace\Test1\cmake-build-debug\Test1.exe
1    //展开命名空间firstnamespace的a属性
1    //展开命名空间firstnamespace的a属性
1    //通过作用域限定符指定firstnamespace的a属性
13    //通过作用域限定符指定firstnamespace的b属性
2    //通过作用域限定符指定secondnamespace的a属性

Process finished with exit code 0
```


这种方法解决了直接展开命名空间时可能会引起的命名冲突的问题。

## 1.3 C++基础
在C++中,我学习了一些基础语法,并且我对与Java不同的部分进行了总结。
[变量与常量](http://192.168.6.130/wiki/#/view/20/1415)
[指针](http://192.168.6.130/wiki/#/view/20/1418)
[函数](http://192.168.6.130/wiki/#/view/20/1434)
[结构体](http://192.168.6.130/wiki/#/view/20/1464)

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

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

相关文章

OSI七层模型和TCP/IP五层模型详细介绍

这里写目录标题 一.OSI含义二.OSI七层模型1.应用层2.表示层3.会话层4.传输层5.网络层6.数据链路层7.物理层 TCP/IP五层协议1.应用层2.运输层运行在TCP上的协议运行在UDP上的协议 3.网络层IP协议配套使用的协议 4.数据链路层 四.网络协议分层的好处 一.OSI含义 OSI即是开放式通…

360推出全新的生成式 AI 搜索产品:纳米搜索,要重塑搜索产品

【大力财经】直击互联网最前线&#xff1a;360 集团在 2024 年 11 月 27 日开发布会&#xff0c;重磅推出了一款全新的生成式 AI 搜索产品——纳米搜索&#xff0c;并且已经上架到苹果 App Store 以及应用宝等安卓应用商店&#xff0c;直接与百度、阿里夸克、秘塔 AI、Perplexi…

【超全】目标检测模型分类对比与综述:单阶段、双阶段、有无锚点、DETR、旋转框

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

c#:winform引入bartender

1、vs新建项目 ①选择Windows窗体应用&#xff08;.NET Framework&#xff09; 2、将bartender引入vs中 ①找到bartender的安装目录&#xff0c;复制Seagull.BarTender.Print.dll文件 ②粘贴到项目->bin->Debug文件&#xff0c;并可创建Model文件夹&#xff1a;为了存放…

vue 实现关键字高亮效果

vue 实现关键字高亮效果 这是啥子意思呢&#xff0c;就是类似于百度搜索&#xff0c;根据关键词搜索结果&#xff0c;搜索结果中&#xff0c;与关键词相同的字显示红色&#xff0c;仅此而已&#xff0c;没有什么大的功能。简单写一下demo。 环境 我使用的是 vue3 ts 的语法来…

初始Python篇(7)—— 正则表达式

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 正则表达式的概念 正则表达式的组成 元字符 限定符 其他字符 正则表达式的使用 正则表达式的常见操作方法 match方法的…

[DL]深度学习_扩散模型正弦时间编码

1 扩散模型时间步嵌入 1.1 时间步正弦编码 在扩散模型按时间步 t 进行加噪去噪过程时&#xff0c;需要包括反映噪声水平的时间步长 t 作为噪声预测器的额外输入。但是最初与图像配套的时间步 t 是数字&#xff0c;需要将代表时间步 t 的数字编码为向量嵌入。嵌入时间向量的宽…

【Linux】网络基本配置命令

一、使用网络配置命令 1.常用网络配置文件 1.1. /etc/hosts “/etc/hosts”文件保存着IP地址和主机名或域名的静态映射关系。当用户使用一个主机名或域名时&#xff0c;系统会在该文件中查找与它对应的IP地址。 [rootlocalhost ~]# cat /etc/hosts 127.0.0.1 localhost l…

如何搭建一个小程序:从零开始的详细指南

在当今数字化时代&#xff0c;小程序以其轻便、无需下载安装即可使用的特点&#xff0c;成为了连接用户与服务的重要桥梁。无论是零售、餐饮、教育还是娱乐行业&#xff0c;小程序都展现了巨大的潜力。如果你正考虑搭建一个小程序&#xff0c;本文将为你提供一个从零开始的详细…

学习threejs,使用设置lightMap光照贴图创建阴影效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshLambertMaterial…

【前端】JavaScript中的柯里化(Currying)详解及实现

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是柯里化&#xff1f;&#x1f4af;柯里化的特点&#x1f4af;柯里化的简单示例&#x1f4af;通用的柯里化实现&#x1f4af;柯里化让代码更易读的原因&#x1f4af…

springboot 整合 rabbitMQ (延迟队列)

前言&#xff1a; 延迟队列是一个内部有序的数据结构&#xff0c;其主要功能体现在其延时特性上。这种队列存储的元素都设定了特定的处理时间&#xff0c;意味着它们需要在规定的时间点或者延迟之后才能被取出并进行相应的处理。简而言之&#xff0c;延时队列被设计用于存放那…

Java代码操作Zookeeper(使用 Apache Curator 库)

1. Zookeeper原生客户端库存在的缺点 复杂性高&#xff1a;原生客户端库提供了底层的 API&#xff0c;需要开发者手动处理很多细节&#xff0c;如连接管理、会话管理、异常处理等。这增加了开发的复杂性&#xff0c;容易出错。连接管理繁琐&#xff1a;使用原生客户端库时&…

Django实现智能问答助手-基础配置

设置 Django 项目、创建应用、定义模型和视图、实现问答逻辑&#xff0c;并设计用户界面。下面是一步一步的简要说明&#xff1a; 目录&#xff1a; QnAAssistant/ # 项目目录 │ ├── QnAAssistant/ # 项目文件夹 │ ├── init.py # 空文件 │ ├── settings.py # 项目配…

【ESP32CAM+Android+C#上位机】ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输

前言: 本项目实现ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输。本项目包含有ESP32源码(arduino)、Android手机APP源码以及C#上位机源码,本文对其工程项目的配置使用进行讲解。实战开发,亲测无误。 AP模式,就是ESP32发出一个WIFI/热点提供给电…

从〇开始深度学习(0)——背景知识与环境配置

从〇开始深度学习(0)——背景知识与环境配置 文章目录 从〇开始深度学习(0)——背景知识与环境配置写在前面1.背景知识1.1.Pytorch1.2.Anaconda1.3.Pycharm1.4.CPU与GPU1.5.整体关系 2.环境配置2.1.准备工作2.1.1.判断有无英伟达显卡2.1.2.清理电脑里的旧环境 2.1.安装Anaconda…

mac下Gpt Chrome升级成GptBrowser书签和保存的密码恢复

cd /Users/自己的用户名/Library/Application\ Support/ 目录下有 GPT\ Chrome/ Google/ GptBrowser/ GPT\ Chrome 为原来的chrome浏览器的文件存储目录. GptBrowser 为升级后chrome浏览器存储目录 书签所在的文件 Bookmarks 登录账号Login 相关的文件 拷贝到GptBrow…

圆域函数的傅里叶变换和傅里叶逆变换

空域圆域函数的傅里叶变换 空域圆域函数&#xff08;也称为空间中的圆形区域函数&#xff09;通常指的是在二维空间中&#xff0c;以原点为中心、半径为 a a a的圆内取值为1&#xff0c;圆外取值为0的函数。这种函数可以表示为&#xff1a; f ( x , y ) { 1 if x 2 y 2 ≤ …

Java基础——类型转化(强制转化)

目录 1.数字间的类型转换 &#xff08;1&#xff09; 隐式类型转换 &#xff08;2&#xff09;显式类型转换&#xff08;强制类型转换&#xff09; 2.类对象间的强制转换 &#xff08;1&#xff09; 向上转型 &#xff08;2&#xff09; 向下转型 将一个类型强制转换成另…

数据结构C语言描述5(图文结合)--广义表讲解与实现

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…