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,一经查实,立即删除!

相关文章

【华为OD机试C++】单词倒排

《最新华为OD机试题目带答案解析》:最新华为OD机试题目带答案解析,语言包括C、C++、Python、Java、JavaScript等。订阅专栏,获取专栏内所有文章阅读权限,持续同步更新! 文章目录 描述输入描述输出描述示例1示例2代码描述 对字符串中的所有单词进行倒排。 说明: 1、构成单…

Python人工智能应用--图像识别深度学习

1.像素 像素(缩写为px)是图像中的最小单位&#xff0c;由一个个小方格组成。 这些小方格都有一个固定的位置和颜色&#xff0c;共同决定了图像所呈现出来的样子。 2.分辨率 这些小方格的行数与列数又被叫做分辨率。我们常说的某幅图像的分辨率是1280720&#xff0c;指的就是…

设计模式之状态模式讲解

概念&#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"&…

SpringFramework实战指南(八)

SpringFramework实战指南(八) 5.1 场景设定和问题复现5.2 解决技术代理模式5.1 场景设定和问题复现 准备AOP项目 项目名:spring-aop-annotation pom.xml <dependencies><!--spring context依赖--><!--当你引入Spring Context依赖之后,表示将Spring的基础依赖…

第四十七章 为 Web 应用程序实现 HTTP 身份验证

文章目录 第四十七章 为 Web 应用程序实现 HTTP 身份验证Apache 中的标准 HTTP 身份验证 (mod_auth)在处理请求的同时在 CSP 中进行身份验证。 第四十七章 为 Web 应用程序实现 HTTP 身份验证 Apache 模块&#xff08;mod_csp*.so/dll 和 CSPa*[Sys].so/dll&#xff09;允许 I…

Go语言中如何实现继承

完整课程请点击以下链接 Go 语言项目开发实战_Go_实战_项目开发_孔令飞_Commit 规范_最佳实践_企业应用代码-极客时间 Go语言中没有传统意义上的类和继承的概念&#xff0c;但可以通过嵌入类型&#xff08;embedded types&#xff09;来实现类似的功能。嵌入类型允许一个结构…

第一部分 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;但也可小于屏幕并浮动在其他窗口之…

系统参数指标:QPS、TPS、PV、UV等

QPS QPS&#xff1a;Queries Per Second 是每秒查询率&#xff0c;是一台服务器每秒能够相应的查询次数&#xff0c;是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准&#xff0c;即每秒的响应请求数&#xff0c;也即是最大吞吐能力。 TPS TPS&#xff1a;Tra…

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

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

MySQL - MySQL数据库的事务(二)

1. SQL标准中对事务的4个隔离级别都是如何规定的? 数据库中多个事务并发时可能产生的问题包括脏写、脏读、不可重复读、幻读几个问题,那么针对这些多事务并发的问题,实际上SQL标准中就规定了事务的集中隔离级别,用来解决这些问题。 在SQL标准中规定了4中事务隔离级别,就…

刷题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 # 指定对象…