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

news2025/6/9 16:30:56

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_H

void Log(const char* message);
void InitLog();
struct Player{};

#endif

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

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

P11、如何在Visual Studio中调试

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

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

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

相关文章

【Altium Designer 20 笔记】隐藏PCB上的信号线(连接线)

使用网络类隐藏特定类型的信号线 如果你想要隐藏特定类型的信号线&#xff08;例如电源类&#xff09;&#xff0c;你可以首先创建一个网络类。使用快捷键DC调出对象类浏览器&#xff0c;在Net Classes中右击添加类&#xff0c;并重命名&#xff08;例如为“Power”&#xff0…

Towards Street-Level Client-Independent IP Geolocation(2011年)(第二部分)

被引次数:306 Wang Y, Burgener D, Flores M, et al. Towards {Street-Level}{Client-Independent}{IP} Geolocation[C]//8th USENIX Symposium on Networked Systems Design and Implementation (NSDI 11). 2011. 接着Towards Street-Level Client-Independent IP Geolocati…

造船业的重要工具之一(火工平台)——河北北重厂家

火工平台是造船业的重要工具之一&#xff0c;它是用于火焰切割和焊接的设备。在造船过程中&#xff0c;需要对金属材料进行切割和焊接&#xff0c;以构建船体结构。火工平台可以提供高温火焰&#xff0c;使得金属材料可以被切割或焊接。 火工平台通常由两个主要部分组成&#…

【美团笔试题汇总】2024-04-13-美团春秋招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新美团近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f…

sql server2008触发器

sql server在Navicat工具不能插入数据 可以去写代码插入&#xff0c;代码连接sql server可以插入 或者使用sql server专门的工具 BEGINdeclare a int;declare s t_amount;select a baddebt_age_id,srate from aa_baddebt_age;INSERT INTO dade(id,name) VALUES(a,s) END

Jackson 2.x 系列【16】反序列化器 JsonDeserializer

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 概述2. 方法2.1 构造2.2 反序列化2.3 null 处理2.4 空值2.5 其他 3. 实现类3.…

基于SpringBoot+Vue的健身器材用品网站(源码+文档+部署+讲解)

一.系统概述 随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决各种问题&#xff0c;必录德健身器材用品网展现了其蓬勃生命力和广阔的前景。与此同时&#…

Redis中的集群(九)

集群 消息 集群中的各个节点通过发送和接收消息(message)来进行通信&#xff0c;我们称发送消息的节点为发送者(sender),接收消息 的节点成为接收者&#xff0c;如图所示。节点发送的消息主要有以下五种: 1.MEET消息:当发送者接到客户端发送的CLUSTER MEET命令时&#xff0c…

# Nacos 服务发现-快速入门-创建服务消费者模块,使用 feign 调用 服务生产者

Nacos 服务发现-快速入门-创建服务消费者模块&#xff0c;使用 feign 调用 服务生产者 1、 新增 quickstart_consumer 子工程&#xff08;子模块&#xff09;&#xff0c; 创建子模块&#xff1a;--> 右键 nacos_discovery 父工程 --> Modules --> Maven --> G…

android gradle版本无法下载

android gradle版本无法下载问题解决方法 在引入一个新的android项目的时候&#xff0c;通常会因为无法下载gradle版本而一直卡在同步界面&#xff0c;类似于下面的情况。 这是因为gradle运行时首先会检查distributionUrlhttps://services.gradle.org/distributions/gradle-5.6…

·13·1dawwd

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

lv_micropython to download and building

想要在ESP32-C3使用Micropython开发GUI&#xff0c;所以需要编译lv_micropython&#xff0c;当前github上的版本是9.1.0。 一、开发环境 因为编译lv_micropython需要在linux系统下&#xff0c;但是我的电脑是windows系统&#xff0c;所以我在windows系统上安装了VMware虚拟机&…

牛客2024【牛客赛文X】春招冲刺ONT61 每日温度【hard 单调栈 Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/1f54e163e6944cc7b8759cc09e9c78d8 思路 单调栈最直接的应用就是获取数组中每个位置i,i的左边第一个比i大或者小的位置/数以及,i的右边第一个比i大或者小的位置/数不懂的同学看这里https://blog.csdn.net/Borsl…

Vulnhub靶机 DC-1渗透详细过程

Vulnhub靶机:DC-1渗透详细过程 目录 Vulnhub靶机:DC-1渗透详细过程一、将靶机导入到虚拟机当中二、攻击方式主机发现端口扫描web渗透利用msf反弹shell数据库信息web管理员密码提权 一、将靶机导入到虚拟机当中 靶机地址&#xff1a; https://www.vulnhub.com/entry/dc-1-1,29…

英伟达高性能芯片供货周期缩短到2-3个月,今年GPU不再紧缺?

戴尔台湾地区总经理Terence Liao近日称&#xff0c;英伟达高性能 AI GPU的交付周期在过去几个月中已从3-4个月缩短到仅2-3个月&#xff0c;进入2024年以来交货等待时间一直在不短缩短&#xff0c;目前的2-3个月已经是英伟达高性能GPU最短的交货期。 英伟达公司正在不断努力提高…

wsl下Linux使用chatglm.cpp记录

目录 前言 一些说明 过程 git chatglm.cpp代码 安装相关包 convert量化ggml cmake构建项目 命令行模型推理 webdemo模型推理 APIServer 性能表现 gpu推理设置 前言 Linux之前用的少&#xff0c;多数还是在Windows下操作&#xff0c;导致对Linux很陌生&#xff0c;…

MES系统中的业务过程管理流程

MES即制造执行系统&#xff0c;也可称为生产执行系统&#xff0c;是一套面向制造企业车间执行层的生产信息化管理系统。 mes系统的业务流程包括哪些方面呢&#xff1a; 一、生产计划与调度 mes系统中的生产计划与调度模块&#xff0c;能够根据企业生产实际情况&#xff0c;制…

淘宝批量采集商品详情数据(属性丨详情图丨sku丨价格等)

淘宝批量采集商品详情数据&#xff08;包括属性、详情图、SKU、价格等&#xff09;可以通过以下几种方式实现&#xff1a; 使用淘宝数据抓取工具&#xff1a;这类工具&#xff0c;如某鱼等&#xff0c;能够自动化采集淘宝商品数据&#xff0c;并将其转换成CSV、Excel等格式&am…

从0到1实现RPC | 12 限流

在服务提供者provider端添加限流逻辑 限流&#xff1a;指定时间内请求数超过指定阈值时就抛出异常。 在ProviderInvoker的调用过程中&#xff0c;添加限流逻辑&#xff1a; 使用滑动窗口SlidingTimeWindow统计30s的请求数&#xff1b;每个服务service对应一个滑动窗口&#…

pom.xml显示灰色并被划线

在使用 IDEA 进行开发的过程中&#xff0c;有时候会遇到 pom.xml 显示灰色并被划线的情况&#xff0c;如下图&#xff1a; 这一般是因为该文件被 Maven 忽略导致的&#xff0c;可以进行如下操作恢复&#xff1a; 设置保存后&#xff0c;可以看到 pom.xml 恢复了正常&#xff1a…