Cherno CPP学习笔记-01-背景知识

0、工具网站收集

C++语言版本特性

https://en.cppreference.com

https://www.cplusplus.com

https://www.tutorialspoint.com/cplusplus

https://www.learncpp.com

https://github.com/fffaraz/awesomecpp

https://stackoverflow.com

网页CPP编译器

[C++] gcc 12.1.0 - Wandbox

1.2、开始

P1、欢迎来到C++

C#、Java是在虚拟机上运行的,意味着代码首先编译成一种中间语言,当在目标平台上运行应用程序时,先运行虚拟机,再转换成机器码

C++直接操控硬件,C++编译器为目标平台和目标架构直接生成机器码

P2、环境安装(windows)

VS2017的安装教程

File->new project->Visual C++ ->General->Empty Project

然后起好名字、确定好路径就ok了

进入项目,在Solution Explorer中自己的Solution下的Source File->add->new Item

P5、C++是如何工作的

#符号后面都是预处理语句,编译器会首先处理(编译发生之前)

main函数比较特殊,不一定非要返回值(没写的话默认返回0)

#include<iostream>int main() {std::cout << "hello World!" << std::endl;std::cin.get();}

运行顺序:

  • 编译器先处理“预处理语句”,即编译器先将iostream文件内容全部包含进来,可以理解为拷贝粘贴到自己的文件中

  • 第二步,文件被编译,编译器将所有的C++代码转换为实际的机器代码。以VS配置为例:

    • 解决方案平台(默认Debug 和 x86或win32)
    • 配置只是构建项目的时候的一系列规则(右键解决方案->属性)
    • 解决方案是指你编译的代码的目标平台
    • x86的意思就目标平台为windows 32位,会生成32位的windows应用程序
    • 目标平台也可以是Android,但要确保配置和平台的正确
    • Debug和release的区别:默认Debug会更慢,release更追求速度。Debug关掉了很多优化以方便我们更好调试代码。
    • 配置类型是生成文件的格式.exe .dll
    • 包括C/C++下的配置,这些规则控制我们的文件如何被编译
    • 在程序员的视角,编译只编译 .cpp文件,因为头文件被复制粘贴进 .cpp文件中了
    • 每一个cpp文件都被编译成了一个object file(目标文件),vs生成的文件后缀是.obj
  • 然后,链接(link)将生成的.obj文件合并成一个执行文件: How the C++ Linker Works

    • 单独编译一个文件,不会发生链接

请添加图片描述

PS: error list仅供参考,一般信息不全,建议看output 窗口。

link的一个例子 (使用声明):

//main.cpp
#include<iostream>void Log(const char* message);int main() {Log("hello World");std::cin.get();}
//log.cpp
#include<iostream>void Log(const char* message) {std::cout << message << std::endl;
}

P6、C++编译器是如何工作的

编译原理既视感

请添加图片描述

相比其他语言,在C++里,文件变得没有意义

  • Java里主类命要与 .java 名字一致,包名的命名层级关系,文件可以被看做是组成单元
  • 但在C++里,文件更像是一种协议或者是约定,.cpp被视为c++文件, .c 被视为c文件, .h被视为头文件,不同的文件对应的“约定”不同。
  • 编译器只是将一个cpp文件变成一个翻译单元,一个翻译单元会生成一个.obj文件,实际上cpp文件可以包含其他的cpp文件,最后也是一个翻译单元

一个成功编译的例子:(#include的复制粘贴)

int Mutiply(int a, int b)
{int result = a * b;return result;
#include "EndBrace.h"
//EndBrace.h
}
  • 在项目属性->C/C+±>Output Files->Assembler Output设置为/FA,编译之后就会生成一个.asm文件,内容为汇编指令。

  • 在项目属性->C/C+±>Optimization设置为Maximum Speed并且把Code Generation->Basic Runtime Checks设置成Default,编译之后再看.asm文件,发现文件相比之前的设置小了许多,这是因为编译器对代码做了优化。

1.5、继续(巫师3真好玩)

P7、C++链接器是如何工作的

链接的主要工作:找到每个符号和每个函数在哪里,并把他们连接起来。即把所有的.obj文件链接在一起。

链接过程常见错误:(错误代码LNK)

  • 未解决的外部符号unresolved external symbol : 连接器找不到他们需要的东西。

如果从来没有调用过某个函数(代码级),那么链接器不需要去链接这个函数。反之可能有例外:

static修饰的函数意味着这个函数只被声明在当前翻译单元中

//Main.cpp
//代码上Multiply函数中调用了Log函数,如果去链接Log函数将会出错
//但由于static的修饰,链接器判断Multiply函数将不可能被调用(本翻译单元内未调用+其他翻译单元不使用Mutiply)
//故编译和链接过程都不会出错。
//去掉static或者main中的注释//都会导致出错
#include<iostream>void Log(const char* message);static int Multiply(int a, int b){Log("Multiply");return a * b;
}int main() {//std::cout << Multiply(5, 8) << std::endl;std::cin.get();
}
//Log.cpp
#include<iostream>void LogR(const char* message) {std::cout << message << std::endl;
}
  • 静态链接
  • 动态链接

P8、C++变量

核心思想,不同变量之间的区别是分配的空间大小。

P9、C++函数

没什么东西

P10、C++头文件

#pragma once在头文件中的作用:

  • 告诉编译器这个头文件只被编译一次
  • 尤其防止 .h 文件中出现结构体重复编译将会报错

另一种做法做法:(头文件保护符)

#ifndef _LOG_H
#define _LOG_Hvoid Log(const char* message);
void InitLog();
struct Player{};#endif

#include 尖括号<>和引号""的区别:

  • 如果要包含的文件在其中一个文件夹里,用尖括号告诉编译器搜索包含路径的文件夹
  • 引号通常用于包含相对于当前文件的文件,但引号其实可以做一切。

P11、如何在Visual Studio中调试

在debug模式下,内存视图中值为 0xCC 的内存为未初始化的栈空间

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

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

相关文章

设计模式之状态模式讲解

概念&#xff1a;又称为状态对象模式&#xff0c;该模式允许一个对象在其内部状态改变时改变其行为。状态模式的核心是封装&#xff0c;状态的变更引起行为的变动&#xff0c;从外部看来就好像该对象对应的类发生改变一样。 抽象状态&#xff1a;用以封装环境对象的一个特定状态…

Qt使用插件QPluginLoader 机制开发

简介&#xff1a; 插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。 Qt 提供了2种APIs来创建插件&#xff1a; 一种高级API&#xff0c;用于为Qt本身编写插件&#xff1a;自定义数据库驱动程序&#xff0c;图像格…

计算机网络-运输层

运输层 湖科大计算机网络 参考笔记&#xff0c;如有侵权联系删除 概述 运输层的任务&#xff1a;如何为运行在不同主机上的应用进程提供直接的通信服务 运输层协议又称端到端协议 运输层使应用进程看见的好像是在两个运输层实体之间有一条端到端的逻辑通信信道 运输层为应…

导出加入域控的电脑清单

要导出加入域控的所有电脑清单&#xff0c;包括计算机名等基本信息&#xff0c;可以使用 PowerShell 中的 Get-ADComputer cmdlet。下面是一个基础示例脚本&#xff0c;用于从Active Directory (AD)中批量导出所有加入域的计算机名称及可能的其他相关信息&#xff0c;并将其保存…

嘉轩智能工业科技诚邀您参观2024第13届生物发酵展

参展企业介绍 自2005年成立以来&#xff0c;嘉轩一直致力于工业智能永磁滚筒的研发、制造及销售&#xff0c;具有十多年的从业经验&#xff0c;公司主营产品包括工业智能永磁滚筒、机电智能诊断、工业智能电机等&#xff0c;高效智能自驱动永磁滚筒为我公司目前主导产品&#x…

thinkphp6使用阿里云SDK发送短信

使用composer安装sdk "alibabacloud/dysmsapi-20170525": "2.0.24"封装发送短信类 发送到的短信参数写在env文件里面的 #发送短信配置 [AliyunSms] AccessKeyId "" AccessKeySecret "" signName"" templateCode"&…

第一部分 Vue讲解(代码版)

1.第一个vue实例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-w…

Android Activity 介绍

Activity Activity 是一个应用组件&#xff0c;用户可与其提供的屏幕进行交互&#xff0c;以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕&#xff0c;但也可小于屏幕并浮动在其他窗口之…

性能优化 - 你知道开发React项目中,可以做哪些性能优化吗

难度级别:中高级及以上 提问概率:75% 在React项目开发中,面临着比较大的问题就是组件更新以及重复渲染的问题,基于这两点,我们可以在日常开发工作中,可以通过以下几点,来提升React的性能,加快组件更新对比,避免过多的重复渲染问题。 …

刷题DAY48 | LeetCode 198-打家劫舍 213-打家劫舍II 337-打家劫舍III

198 打家劫舍&#xff08;medium&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统…

Linux笔记-对xargs的理解(2023-12-13)

此篇记录在个人笔记库的时间是2023-12-13&#xff0c;公布到互联网上的时间是2024-04-09 这个命令最开始是在5年前看人用过&#xff0c;当时不太理解&#xff0c;最近又看到有人在用&#xff0c;突然间就通了&#xff0c;也查阅了点资料&#xff0c;记录下这个笔记&#xff1a…

吴恩达深度学习笔记:深层神经网络(Deep Neural Networks)4.5-4.8

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第四周&#xff1a;深层神经网络(Deep Neural Networks)4.5 为什么使用深层表示&#xff1f;&#xff08;Why deep representations?&#xff09; 第一门课&#xff1a;神经网络和深度学习 (…

CKA 基础操作教程(五)

Kubernetes Ingress 理论学习 Ingress 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源所定义的规则来控制。 Ingress 资源示例&#xff1a; apiVersion: networking.k8s.io/v1 # 指定 Kubernetes 中使用的 API 版本 kind: Ingress # 指定对象…

c语言 :柔性数组与c/c++内存领域的划分

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一 柔性数组&#xff08;1&#xff09;什么是柔性数组1&#xff09;柔性数组的声明2&#xff09;柔性数组的特性 &#xff08;2&#xff09;柔性数组的使用 二 c/c内…

APx500音频分析仪硬件简介

两通道模拟输出&#xff0c;两通道或以上的模拟输入接口 线性编码数字音频接口&#xff08;AES/EBU,TOSLINK,SPDIF&#xff09;Linear PCM 脉冲密度调制码流&#xff08;需要APx-PDM选件支持&#xff09; Bluetooth蓝牙音频码流&#xff08;需APx-BT选件支持&#xff09; 最…

用二八定律分析零售数据,不就更直观了吗?

20%的商品贡献了80%的销售金额&#xff0c;你会不会想知道这些商品的销售金额、毛利、销售金额累计占比、毛利累计占比&#xff0c;会不会想知道这些商品在各个门店的销售表现&#xff1f;看是否能进一步提高销售金额&#xff0c;提高毛利。这样的报表该怎么做&#xff1f;奥威…

Ceph学习 -4.Ceph组件介绍

文章目录 1.Ceph组件介绍1.1 组件介绍1.2 流程解读1.2.1 综合效果图1.2.2 数据存储逻辑 1.3 小结 1.Ceph组件介绍 学习目标&#xff1a;这一节&#xff0c;我们从组件介绍、流程解读、小结三个方面来学习。 1.1 组件介绍 无论是想向云平台提供 Ceph 对象存储和 Ceph 块设备服务…

Xinstall助力提升用户体验:一键打开App用户页面

在移动互联网时代&#xff0c;App已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着App数量的激增&#xff0c;如何让用户更便捷地打开和使用App&#xff0c;提升用户体验&#xff0c;成为了开发者和广告主们亟待解决的问题。此时&#xff0c;Xinstall作为国内专业…

[Linux][权限][粘滞位]详细解读,深入了解Linux权限

1.Linux权限的概念 Linux下有两种用户&#xff1a;超级用户(root)、普通用户 超级用户&#xff1a;可以在Linux系统下做任何事情&#xff0c;不受限制普通用户&#xff1a;在Linux下做有限的事情&#xff0c;可以有多个超级用户的命令提示符是**“#”&#xff0c;普通用户的命…

Linux中磁盘管理

一.磁盘管理的概括和简要说明 磁盘空间的管理&#xff0c;使用硬盘三步&#xff1a; &#xff08;1&#xff09;分区&#xff1a; &#xff08;2&#xff09;安装文件系统格式化 &#xff08;3&#xff09;挂载&#xff1a; 硬盘的分类&#xff1a; &#xff08;1&#x…