【C++】关于 Visual Studio 的使用技巧(保姆级教程)

目录

fliter 视图

visual studio默认是filter视图(中文为筛选器)

项目下的是filter而非硬盘目录里实际的文件夹,这时新建的也是filter

想要查看硬盘目录里实际的文件夹,点击按钮"show all files(显示所有文件)"即可

输出文件位置设置

自定义输出文件位置:

右键项目,选择"Properties(属性)"->"General"->"Output Directory""Intermediate Directory"(图中展示选项的中文)

注意"Configuration(配置)"为"All Configurations(所有配置)","Platform(平台)"为"All Platforms(所有平台)"

这边也给出大佬们喜欢用的设置:

Output Directory:$(SolutionDir)bin\$(Platform)\$(Configuration)\

Intermediate Directory:$(SolutionDir)bin\intermediates\$(Platform)\$(Configuration)\

如果你看不懂其指代的具体路径,对路径选择"Edit(编辑)"->"Macros"即可查看

应用后可以右键解决方案,选择"Clean Solution(清理解决方案)"即可去掉旧文件

查看预处理结果

首先简答介绍一下编译器的工作原理:编译器首先处理预处理语句,将头文件内容全部复制到代码文件中;其次编译器将所有C++代码转化为机器码,每个cpp文件都被编译成一个目标文件(.obj);最后将独立的目标文件合并成一个可执行文件

Visual Studio默认不输出预处理的结果,想要查看预处理结果需要在"Properties(属性)"->"C/C++"->"Preprocessor"中,将"Preprocess to File"设置为"Yes"(确保编辑的是当前的配置),编译后机会输出预处理文件(.i)

将目标文件转换为可读的汇编

编译器编译文件时,每个cpp文件都被编译成一个目标文件(.obj),出于一些调试需求,我们可能需要阅读编译出的汇编语言

在"Properties(属性)"->"C/C++"->"Output Files"中,修改"Assembler Output"即可

自定义程序入口

一个可执行文件一定是以main函数为入口吗?答案是否定的

在"Properties(属性)"->"Linker"->"Advanced"中,可以自定义Entry Point

调试时查看变量在内存中的具体值

最常见的是用autos,locals和watch监视变量:

  • autos(自动变量窗口):显示当前行和前几行代码中使用的变量,以及下一个将要执行的行中的变量

  • locals(局部变量窗口):显示当前作用域中的所有局部变量及其值

  • watch(监视窗口):允许手动添加并监视任意变量、表达式或内存地址

(这里对象p的成员变量Name没有赋值)

一个更高级的方法是查看变量在内存中的具体值:"DEBUG"->"Windows"->"Memory"->"Memory 1"

在"Address"中输入变量的内存地址(别忘了使用&取址)即可找到变量在内存中的具体值

这里我输入了一个字符串指针,其指向字面量"hello",可以发现内存存储的内容对应了"hello"的 ASCII 编码,只不过由于是64位,因此字符串指针默认为8字节

查看代码的反汇编

在调试时,右键"Go To Disassembly"

如文章有误或疏漏,欢迎评论指出

如有帮助,欢迎关注我的博客,后续也会更新其他的技术内容(坚持日更ing)
特别推荐 Cherno 的C++课程,可以去某管订阅他的频道,B站也有转载

相关推荐
汉克老师5 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
晴天的雨.9926 小时前
【C++】继承篇
java·开发语言·c++
青少儿编程课堂6 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven6 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_406981036 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
I_belong_to_jesus17 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla18 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu1 天前
一个通用游戏数据服务器
c++·架构
another heaven1 天前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
YLCHUP1 天前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论