1. IO输出调试:输出重定向
在《第八期-C++基础与深度解析》课程中,老师使用了“输出重定向”的语句来查看cout
和cerr
的结果:
./HelloWorld >txt1 2>txt2
代码含义:将程序HelloWorld的标准输出stdout重定向至文件txt1,将标准错误输出stderr定向至文件txt2。
Note
这里“2>”中的“2”指的是stderr文件描述索引号2。
2. 常量代码展开:if constexpre
#include <iostream>
constexpr bool value = false;
auto fun() {
if constexpr(value) {
return 1;
} else {
return 3.14;
}
}
int main() {
}
13.3 Compiler Explorer:可以查看编译生成的汇编代码
8.1.1 界面介绍
打开汇编分析器
操作路径:C++ source
→ Add new...
→ Compiler
;
8.2 VSCode调试
8.2.0 Variable substitution:变量代号
官方文档:Visual Studio Code Variables Reference
8.2.1 Launch.json:运行配置
Auto-generated demo
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++: g++ 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerArgs": "-q -ex quit; wait() { fg >/dev/null; }; /usr/bin/gdb -q --interpreter=mi",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: cpp 生成活动文件",
"miDebuggerPath": "/usr/bin/gdb"
},
// the second config...
]
}
name:配置名称
name
字段用来设置当前配置的名称,会出现在运行设置按钮的下拉列表中,不过目前并没有发现name
会作为配置项的唯一标识符;
type:编译器类型
System | type-string |
---|---|
Ubuntu | cppdbg |
Windows | cppvsdbg |
官方文档:Configure launch.json for C/C++ debugging in VSCode | type
request:指令类型
request | type-string |
---|---|
launch | launch the program |
attach | to attach a running instance |
additionalSOLibSearchPath:搜索.so
文件的路径
告诉GDB或LLDB要在哪些路径中搜索.so
文件。使用分号;
来分隔多个路径。例如:/Users/user/dir1;/Users/user/dir2
。
externalConsole:使用外部控制台
当声明为true
时,表示产生一个外部控制台来运行程序。
关于为什么"miDebuggerArgs": "-q -ex quit; wait() { fg >/dev/null; }; /usr/bin/gdb -q --interpreter=mi",
可以屏蔽输出的猜想
这里其实用了两条gdb
调试命令,第二个/usr/bin/gdb
屏蔽了 VSCode-miDebugger隐含的gdb
调试命令,并且同时屏蔽第一条 miDebugger-gdb的输出(-q
)、之后退出(quit
),并且用fg
将此程序至于后台,然后重启开启一个gdb命令(/usr/bin/gdb
)来用作真正输出时的gdb命令,有点偷梁换柱的味道;
不推荐使用"miDebuggerArgs": "-q -ex quit; wait() { fg >/dev/null; }; /usr/bin/gdb -q --interpreter=mi",
来清理VSCode的输出信息
从上面我们可以看到,这种“清理信息”实质上是替换了VSCode原有的调试命令,这种方式遵循VSCode原生的设计意图,于是其效果可能是不稳定的,这里不推荐使用;
8.2.2 Tasks.json:任务配置
Auto-generated demo
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: cpp 生成活动文件",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
},
// the second task...
],
"version": "2.0.0"
}
label:标签标识符
label
关键字是当前task的唯一标识符(ID),用来区别不同的task。
options:设置环境选项,cwd, env, shell
官方文档:Tasks in Visual Studio Code | options
示例:
"options": {
"cwd": "${fileDirname}"
}
表示将工作目录设置为当前运行文件所在的目录。
problemMatcher:错误匹配器
VSCode-C/C++插件已经实现用于C++调试的problemMatcher,我们直接使用"$gcc"
即可。
8.2.3 C_cpp_properties.json:C++项目配置
includePath:源代码路径
includePath
的作用类似于CMake中include_directories
;
配置之后,VSCode会检索这些目录中包含的符号和函数,这样在使用include<>
时包含第三方工具库时,语法检查就不会有红色波浪线的标号;