Author: mikudouble
Created Time: April 4, 2022 7:44 PM
Significance: ⭐⭐⭐
我是在windows10下配置的,其他平台不一定有效
看本文前请先安装好MinGW
,vscode
,以及vscode中的C/C++
插件
项目文件夹和源文件不要有中文或者特殊符号
项目所在路径不要有中文或者特殊符号
本文看完后,可以去看一下我的另一篇文章:vscode关于C/C++编译运行的一些小配置
.vscode
调试配置先建立好基本的目录结构与源代码文件,建立两个文件夹: include
和 src
,所有的.h
文件都放在 include
目录下,所有的.cpp
文件都放在 src
目录下。
目录结构
示例代码
main.cpp
#include
#include "../include/Sales_item.h"
using namespace std;
int main() {
Sales_item item1, item2;
item1.isbn = "0-201-78345-X";
item1.units_sold = 10;
item1.revenue = 300.0;
cout << item1.avg_price() << endl;
item2.isbn = "0-201-78345-X";
item2.units_sold = 2;
item2.revenue = 70;
cout << item2.avg_price() << endl;
if (item2.same_isbn(item1)) {
cout << "same" << endl;
} else {
cout << "not same" << endl;
}
return 0;
}
Sales_item.h
#ifndef __SALES_ITEM_H_
#define __SALES_ITEM_H_
#include
class Sales_item {
public:
// 常量成员函数
// 由于这个函数不对类的数据成员做任何修改,所以可以定义为常函数【参数列表后面加上const】
bool same_isbn(const Sales_item &rhs) const {
// this->isbn = "1"; // 错误,常函数不能修改数据成员
return this->isbn == rhs.isbn;
}
double avg_price() const;
public:
Sales_item() : units_sold(0), revenue(0) {}
// 本来应该将成员变量设为private的,但是为了方便,写成public
public:
std::string isbn;
unsigned units_sold;
double revenue;
};
#endif // !__SALES_ITEM_H_
Sales_item.cpp
#include "../include/Sales_item.h"
// 类外定义成员函数体,需要加上类作用域,即类的名字
double Sales_item::avg_price() const {
if (!this->units_sold) {
return 0;
} else {
return this->revenue / this->units_sold;
}
}
打开源代码main.cpp,按 F5
,然后选择第一项 C++ (GDB/LLDB)
然后选择 C/C++: g++.exe 生成和调试活动文件...
由于我的代码是分成多个文件,所以vscode不能直接处理,此时会报错(如果源文件只有一个main.cpp,那么这里就不会报错)。现在选择 打开"launch.json"
,并仍然选择 C++ (GDB/LLDB)
,你会发现生成了 .vscode
,并且这个文件夹下面有 launch.json
和 tasks.json
两个文件
b. 生成了 launch.json
和 tasks.json
两个文件
打开 tasks.json
,将 "args": [ ... ]
中的 "${file}",
注释掉,并在下面添加一行 "${fileDirname}\\*.cpp",
,表示编译的文件是源文件main.cpp所在文件夹下的所有.cpp
文件,具体的可以看下图。
然后注意一下这个 "label"
标签的值 "C/C++: g++.exe 生成活动文件"
,它是编译源文件这个任务的名称,下一步会用到。
另外也可以看看下面的的两个参数 "-o",
和 "${fileDirname}\\${fileBasenameNoExtension}.exe"
,这表示编译生成的可执行文件的名字是main.exe
(因为源文件名是main.cpp),并且生成的位置就在源文件main.cpp所在的同一个文件夹。这里你可以选择修改生成的可执行文件的文件名和它的文件路径,我现在选择不做修改。
打开 launch.json
,点击右下角的 添加配置
,选择 C/C++: (gdb) 启动
,在生成的代码中添加一行 "preLaunchTask": "C/C++: g++.exe 生成活动文件",
,这就是第4步中 tasks.json
中那个 "label"
的值,"preLaunchTask"
代表预启动的任务,表示每次调试或运行之前就会先对源文件进行编译
另外,你也可以选择不添加 "preLaunchTask": "C/C++: g++.exe 生成活动文件",
,这样的话,就需要运行程序前先对程序进行编译,编译的快捷键是 ctrl+shift+B
,然后才能 ctrl+F5
运行或 F5
调试。
在 launch.json
中,"program"
标签需要的参数是可执行文件的路径。在第4步中我们提到生成可执行文件的位置就在源文件main.cpp所在的同一个文件夹。因此,这里的 "program"
的值改为 "${fileDirname}\\${fileBasenameNoExtension}.exe"
下面的 "args": []
标签代表传递给程序的命令行参数,如果main()函数需要命令行参数,可以在这里添加。在本例中不需要命令行参数,所以不做修改
再看下面的 "miDebuggerPath"
标签,它表示调试程序(如gdb)的路径,将你的gdb路径添加进去即可(gdb的路径在MinGW的bin目录下)
现在大功告成!返回 main.cpp
就可以开始运行或者调试了
.vscode
配置文件不要直接照搬我的,有些需要你自己修改
launch.json
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"preLaunchTask": "C/C++: g++.exe 生成活动文件",
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "D:\\bc\\environment\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
]
}
tasks.json
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe 生成活动文件",
"command": "D:\\bc\\environment\\mingw64\\bin\\g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
// "${file}",
"${fileDirname}\\*.cpp",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}