【c++】开发环境&IDE、常见调试方法(gdb等)、基础c++语法特性、算法OJ刷题、入门c++项目【持续更新】

1 开发环境&IDE

基本就是如下3款,个人使用体验:

vscode:优点-轻量化,插件多,便于远程调试,缺点-配置复杂

clion:优点-集成环境,最易于上手,缺点-商业软件,收费

visual studio:优点-开发大项目如qt等较为友好 ,缺点-软件太臃肿,太大,不能远程debug

1.1 vscode

vscode配置C/C++环境(超详细保姆级教学)
VSCode上搭建C/C++开发环境(vscode配置c/c++环境)Windows系统---保姆级教程

1.2 clion

CLion安装、配置、使用、调试(完全小白向)

1.3 visual studio

编程小白必看!Visual Studio 2022详细安装使用教程(C/C++编译器)
Visual Studio 2022基础使用操作总结

2 常见调试方法(gdb等)

2.1 debug入门

这个博主视频很不错,入门到深度均有涉及

c++调试技术

2.2 远程debug (以Mit 6.S081为例)

2.2.1 vscode远程debug

参考文献:
Mit6.s081环境配置踩坑之旅WSL2+VScode

步骤1:虚拟机网络配置

主要参考:
SSH连接linux虚拟机详细步骤(超详细)

其他参考:
【环境配置】【保姆级教程】VSCode SSH 连接 VMware虚拟机Linux Ubuntu 22.04 配置

步骤2:XV6及qemu环境搭建

qemu搭建完毕如下代表qemu成功:

复制xv6源码到本地,make qemu,如下代表xv6系统编译成功,ctrl+a松开后再按x退出qemu。

如上一个源码系统,如果我们不采用现代工具进行debug,使用原生shell进行debug,基本上就是要开两个shell,一个shell执行make qemu-gdb,也就是以debug模式打开qemu, 另一个shell用来调试,打断点之类的。

具体可参考:
课程翻译-3.9 XV6 启动过程
MIT 6S081 qemu-gdb debug调试新手指南!!!

这样做配置很复杂,对新手不友好。

具体过程:

设置gdb信任文件,我这里将所有都放开了,然后按照上面教程调试操作,这样每次都得手动搞一次,且查看源码很不方便。

步骤3:Vscode远程调试

上述gdb shell原生方式对新手不友好,所以直接使用vscode插件远程调试,这样既优雅又方便。

参考文档:
哈工大2022年 OS 图形化调试指南

VSCode调试xv6内核代码

2.2.2 clion远程debug

【持续更新...】

3 基础c++语法特性

基础入门:c++菜鸟博客

c++ 指针:除了印度口音以外,目前见到的讲的最好的教程

【强推】通俗易懂C/C++中的指针

4 算法OJ刷题

4.1 推荐刷题网站

基础:数据结构

博客:
十年所学,终成《代码随想录》
labuladong 的算法笔记
github leetcode关键字搜索

4.2 Clion leetcode本地debug刷题指南

leetcode 官方需要开会员才能进行debug调试,不方便,可以直接使用本地clion进行插件OJ。

主要参考文献:
CLion安装、配置、使用、调试(完全小白向)
技巧篇|周末使用Clion愉快刷题 Leetcode(C++)吧

其余参考:
github-aiyolo/leetcode-debug
使用clion刷leetcode
CLion的leetcode插件本地调试方法
使用Clion中的LeetCode刷题插件步骤及常见错误
CLion 配置,LeetCode配置,调试配置

4.2.1 leetcode插件&debug插件安装

安装leetcode官方插件和C/C++ Single File Execution(为了单文件调试方便--在 CMake 项目中,如果想要构建和运行单个 c/cpp 文件,需要在 CMakeLists.txt 需要配置声明 add_executable() ,使用这个插件可以轻松构建和运行单个文件)

安装完了之后,插件输入leetcode账号ak,sk,同时设置本地tempfile地址(用于下载leetcode题目),此时插件安装完毕

4.2.2 基础clion 配置

步骤1:将工具链设置成内置mingGW

步骤2:新建刷题项目,建议c++ 17

步骤3:在自己项目的目录下,新建如下2个文件

leetcode.h 基础数据结构和来自于Leetcode Playground方便我们将测试用例字符转化为正确的参数。

stdc.h 大家用了都说好的"万能头"文件,主要为了方便主动导入,也可以自己按照所需维护一个头文件替代。
文件git下载地址

步骤4:配置 Leetcode Editor 模板

配置如下3处:

(1):Custom Template 需要勾选 True

(2):Code FileName = leetcode_num_${question.frontendQuestionId}

(3):Code Template复制以下的代码,简单分析一下就是我们通过导入 stdc.h 和 leetcode.h(在stdc.h中被导入)头文件,避免了我们需要根据代码手动导入头文件,由于 leetcode 中的题目大部分都是定义了一个 Solution 类,如果在一个项目中引入多个题目会导致类重复定义错误,所以我们根据题号创建不同的 namespace ,这样就避免了重复定义,并使用了 using 语法简化了调用,美中不足的是我们并没有自动构建对题目的调用和对测试用例的代码编写,这就是需要我们手动参与的地方,不过有了 leetcode.h 的加持,这一些也不是难事,在下文我们会展示如何使用。【转载--简绘Android】

cpp 复制代码
//import universal *.h
\#include "../../../stdc.h"

using namespace std;


${question.content}

namespace solution${question.frontendQuestionId}{
    ${question.code}
}

using namespace solution${question.frontendQuestionId};
int main() {
    Solution solution = Solution();

    return 0;
}

4.2.3 刷题以及debug

步骤1:插件加载题目

配置完成后,点击任意题目后,就会生成下图所示的目录结构(这是按照Java的目录结构生成的,对我们并不影响)

,观察生成的源代码文件,这个题目需要定义结构体 ListNode 在这里并没有出现警告,因为我们的 leetcode.h 已经包含了定义,这时候我们只要右键选择 Add executable for single c/c++ 按钮并点击 CMake 刷新按钮,就可以在上方的运行按钮看到一个新的可运行 CMake Application,到这里你就可以愉快的利用 IDE 的代码提示开心的刷题了。

利用编辑栏的悬浮窗口,你可以测试和提交自己的代码,如下图所示。

步骤2:debug题目

如果你提交答案被系统驳回,并告诉了你测试用例,你也可以很容易的去调试它,系统通常给我们的测试用例形如输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] ,观察我们的形参,我们需要组合成 ListNode,对于最后的结果 输出:[8,9,9,9,0,0,0,1]我们最后的返回值为 ListNode ,有了 leetcode.h 现在不需要你去自己构建和翻译链表,stringToListNode 和 listNodeToString轻松帮你搞定这一切。这样,一个题目就轻轻松松的跑起来了。

leetcode题目2参考代码

cpp 复制代码
//import universal *.h
#include "../../../stdc.h"

using namespace std;


//给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 
//
// 请你将两个数相加,并以相同形式返回一个表示和的链表。 
//
// 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 
//
// 
//
// 示例 1: 
// 
// 
//输入:l1 = [2,4,3], l2 = [5,6,4]
//输出:[7,0,8]
//解释:342 + 465 = 807.
// 
//
// 示例 2: 
//
// 
//输入:l1 = [0], l2 = [0]
//输出:[0]
// 
//
// 示例 3: 
//
// 
//输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
//输出:[8,9,9,9,0,0,0,1]
// 
//
// 
//
// 提示: 
//
// 
// 每个链表中的节点数在范围 [1, 100] 内 
// 0 <= Node.val <= 9 
// 题目数据保证列表表示的数字不含前导零 
// 
//
// Related Topics 递归 链表 数学 👍 11150 👎 0


namespace solution2{
    //leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
    class Solution {
    public:
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
            int len1=1;//记录l1的长度
            int len2=1;//记录l2的长度
            ListNode* p=l1;
            ListNode* q=l2;
            while(p->next!=NULL)//获取l1的长度
            {
                len1++;
                p=p->next;
            }
            while(q->next!=NULL)//获取l2的长度
            {
                len2++;
                q=q->next;
            }
            if(len1>len2)//l1较长,在l2末尾补零
            {
                for(int i=1;i<=len1-len2;i++)
                {
                    q->next=new ListNode(0);
                    q=q->next;
                }
            }
            else//l2较长,在l1末尾补零
            {
                for(int i=1;i<=len2-len1;i++)
                {
                    p->next=new ListNode(0);
                    p=p->next;
                }
            }
            p=l1;
            q=l2;
            bool count=false;//记录进位
            ListNode* l3=new ListNode(-1);//存放结果的链表
            ListNode* w=l3;//l3的移动指针
            int i=0;//记录相加结果
            while(p!=NULL&&q!=NULL)
            {
                i=count+p->val+q->val;
                w->next=new ListNode(i%10);
                count=i>=10?true:false;
                w=w->next;
                p=p->next;
                q=q->next;
            }
            if(count)//若最后还有进位
            {
                w->next=new ListNode(1);
                w=w->next;
            }
            return l3->next;
        }
    };

//leetcode submit region end(Prohibit modification and deletion)

}

using namespace solution2;
#define L1 "[9,9,9,9,9,9,9]"
#define L2 "[9,9,9,9]"
#define RESULT "[8,9,9,9,0,0,0,1]"
int main() {
    Solution solution = Solution();
    ListNode *node=solution.addTwoNumbers(stringToListNode(L1), stringToListNode(L2));
    cout << listNodeToString(node) << endl;
    assert(RESULT == listNodeToString(node));
    return 0;
}

5 入门c++项目

下面是我工作2年接触到的一些有意思的c++ 项目:

1、CAD方向:
OCCT 开源几何引擎
youtube occt讲解
知乎occt 专业博主推荐的 occt项目

2、QT:

可以用来自己做一些桌面级开发,一般得visual studio

相关推荐
饼干帅成渣2 小时前
我又又又又又又更新了~~纯手工编写C++画图,有注释~~~
开发语言·c++
mit6.8243 小时前
[Sum] C++STL oj常用API
c++·算法·leetcode
槐月初叁3 小时前
C++洛谷基础练习题及解答
开发语言·c++·算法
誓约酱3 小时前
linux 下消息队列
linux·运维·服务器·c语言·c++
Archer1943 小时前
C++基础——从C语言快速入门
数据结构·c++·算法
Hetertopia4 小时前
C++ QT零基础教学(二)
开发语言·c++·qt
一匹电信狗4 小时前
【Linux我做主】基础命令完全指南下篇
linux·运维·服务器·c++·开源·centos·unix
Maple_land4 小时前
C++初阶——类和对象(三) 构造函数、析构函数
c++
张胤尘4 小时前
C/C++ | 每日一练 (6)
c语言·c++·面试
Bruce Jue4 小时前
C++特性——智能指针
c++