admin管理员组

文章数量:1531409

目录

1、学习C语言

2、学习C++

3、了解基础的网络知识

4、Linux相关知识

5、数据库知识

6、数据结构与算法

7、需要重点关注的编程技术

7.1、socket网络编程

7.2、多线程与多线程编程

7.3、多进程及多进程通信

7.4、动态链接库编程

7.5、数据库编程

7.6、设计模式

7.7、学习一些C/C++开源代码

8、学习过程中要多动手敲代码、多实践

9、熟悉IDE开发环境,掌握一些常用的调试方法和技巧

9.1、C/C++ IDE开发工具选择

9.2、开源代码查看工具的选择

9.3、掌握一些常用的调试方法和技巧

9.4、了解引发C++软件异常的常见原因,掌握排查C++软件异常的常用方法

10、C++客户端开发

10.1、客户端UI开发技术与IDE工具

10.2、UI界面库介绍

11、最后


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn/chenlycly/article/details/125529931C++软件分析工具案例集锦(专栏文章,持续更新中...)https://blog.csdn/chenlycly/article/details/131405795C/C++实战进阶(专栏文章已更新400多篇,持续更新中...)https://blog.csdn/chenlycly/category_11931267.html       在CSDN上认识了很多学习C/C++在校朋友,他们在和我交流时时常会问有没有好的C/C++学习路线推荐,目前的博客内容主要面向有工作经验的人,针对初学者的文章写的比较少。因为大家问的比较多,最近正好有时间,就详细地思考了一下这个学习路线的问题。作为IT行业的从业者,结合多年的实战经验,给大家大概地总结一下C/C++学习路线方面的内容,以供广大C/C++初学者借鉴和参考!(与文章配套的C/C++学习路线的免费B站免费视频已出,具体信息见本文的评论区!!!

       C/C++的知识点与学习路线图总体如下所示:

1、学习C语言

       C语言是C++的基础,C++是在C语言的基础上发展起来的,要学C++,必须要先学好C语言。C语言学习,推荐使用谭浩强的《C语言程序设计》。

       有不少开源库就是使用C语言实现的,比如著名的音视频开源库ffmpeg、轻量级数数据库sqlite、高性能的HTTP和反向代理web服务器Nginx、轻量级web服务器容器Lighttpd等。使用C语言开发的软件,一是运行效率比较高,二是具有良好的跨平台特性。除了开发一些开源项目,目前C语言主要用于底层软件的开发,比如与硬件芯片相关的驱动软件的开发。 

该部分学习需要掌握的内容有:

了解C语言的基础语法,了解结构体、分支与循环,熟悉字符串、操作符和函数,掌握数组和指针的使用,了解内存管理和文件操作,熟练掌握C程序的调试方法。

2、学习C++

        推荐使用《C++ Primer》这本书进行学习,也可以搭配这《C++ Primer Plus》这本书一起看,前者更详细、系统一些。两本书可以互补着看,各有特点。C++主要学习内容有:
(1)学习C++基础语法;
(2)学习模板编程:模板类和模板函数;
(3)了解C++11标准引入的部分常用新特性,比如常用的auto、overide、final、mutable、volatile、智能指针(std::unique_ptr、std::shared_ptr和std::weak_ptr)、lamda表达式、nullptr等。这些新特性在C++开源代码中会频繁的使用,比如WebRTC开源代码,开源代码比较喜欢使用C++新标准的东西。我们在日常编码的过程中,也会使用到C++11的部分新关键字和新特性。所以,不管是日常编码工作,还是学习开源代码,学习并掌握C++11的新特性都很有必要!此外,C++开发岗位的面试都会涉及C++11相关的内容!《C++ Primer》和《C++ Primer Plus》这两本书的新版本,都有详细讲到C++11的新特性。

C++新标准引入了很多新特性,解决了部分语言上的缺陷,使得C++变得更加高效灵活!但同时也让C++变得更加臃肿复杂,让原本就有学习难度的C++变的更加让人难以驾驭!

该部分学习需要掌握的内容有


了解C++的基础语法,理解C++面向对象和类的思想,了解继承、虚函数与多态,理解动态内存管理,了解深拷贝与浅拷贝,了解函数重载与函数重写,了解智能指针与异常处理,熟练掌握STL标准模板库中vector、list、map等常用容器的使用,熟悉模板函数与模板类的模板编程。

       对于开发语言的学习,想通过看几篇博客文章就能学好是不可能的,必须要找一本书或者一个系统的视频教程静下心去学,脚踏实地一步一个脚印去学,才能学好,看别人的文章只能起个辅助的作用! 

       此外,上述C语言与C++书籍都是比较基础的,要精通C++,这两本书是不够的!要多看书,看好书,在搞好基础的同时,有效提升个人的综合技能。C++从入门到进阶的系列书籍推荐,可以参看我之前写的文章:

C++从入门到进阶的系列书籍推荐https://blog.csdn/chenlycly/article/details/121170439


       在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)

专栏1:该精品技术专栏的订阅量将达到1000多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!欢迎订阅!)

C++软件调试与异常排查从入门到精通系列文章汇总https://blog.csdn/chenlycly/article/details/125529931

本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!

专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2:  

C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,持续更新中...)https://blog.csdn/chenlycly/article/details/131405795

常用的C++软件辅助分析工具有PE工具、Dependency Walker、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!

专栏3:(本专栏涵盖了C++多方面的内容,是当前重点打造的专栏,专栏文章已经更新到400多篇,持续更新中...)

C/C++实战进阶(专栏文章已更新380多篇,持续更新中...)https://blog.csdn/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与项目实战进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域多个方面的内容,包括C++基础及编程要点(模版泛型编程、STL容器及算法函数的使用等)、数据结构与算法、C++11及以上新特性(不仅看开源代码会用到,日常编码中也会用到部分新特性,面试时也会涉及到)、常用C++开源库的介绍与使用、代码分享(调用系统API、使用开源库)、常用编程技术(动态库、多线程、多进程、数据库及网络编程等)、软件UI编程(Win32/duilib/QT/MFC)、C++软件调试技术(排查软件异常的手段与方法、分析C++软件异常的基础知识、常用软件分析工具使用、实战问题分析案例等)、设计模式、网络基础知识与网络问题分析进阶内容等。

专栏4:   

VC++常用功能开发汇总(专栏文章,持续更新中...)https://blog.csdn/chenlycly/article/details/124272585

将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。

专栏5: 

Windows C++ 软件开发从入门到精通(专栏文章,持续更新中...)https://blog.csdn/chenlycly/category_12695902.html

根据多年C++软件开发实践,详细地总结了Windows C++ 应用软件开发相关技术实现细节,分享了大量的实战案例,很有实战参考价值。


3、了解基础的网络知识

        现在的软件系统都不再是单机版的了,都是基于网络的,基本都是客户端与服务器的模式,客户端需要通过网络和远端的服务器进行通信,在使用过程中会出现这样那样的网络问题。所以网络知识是少不了的,无论是从事哪个IT技术岗位,都需要用到一些常用的网络知识。特别是开发和测试岗位,要分析网络通信中遇到的通信故障,排查网络数据传输过程中的数据异常问题等。

       网络基础知识,笔试时会有涉及,面试的时候也会问到。比如OSI的七层分层、TCPIP四层分层、TCP与UDP的区别,建立TCP连接的三次握手等等。这方面的内容,可以参看我之前写的文章:
【网络入门】详解常用的基础网络知识(面试笔试常考内容)https://blog.csdn/chenlycly/article/details/124433936掌握上述文章的内容,基本可以应付日常的笔试面试,这部分内容可以在面试前的一两个月看看,搞不懂的地方可以硬背下来。此外,如果要深层次了解TCPIP网络知识,可以参看TCPIP详解相关的书籍。

4、Linux相关知识

       做服务器软件开发或测试的岗位,会对Linux方面的知识有一定的要求,因为后台服务器中使用的操作系统就是Linux的。现在大部分IT公司产品的后台服务器使用的都是Linux系统,有少部分根据客户要求需要会使用Windows Server服务器系统。

       之前大家主要使用免费开源的CentOS版本的Linux系统,但现在RedHat公司已不再维护CentOS系统了,这意味着一旦系统内核发现bug,将没人负责去修改更新了。为了应对CentOS停止维护,国内几大重量级IT厂商纷纷推出了基于开源Linux系统的服务器专用操作系统,比如华为的欧拉系统、腾讯的tencentos系统以及阿里的龙蜥系统,实现对CentOS的替代!并且这些国内的服务器系统已陆续宣布开源,并建立了相应的开源社区,以推进这些系统的广泛应用与普及!这些国产服务器系统,不仅这些头部厂商会自己使用,其他厂商也可以免费使用,这对系统的普及及生态的发展有着强有力的推进作用!

       这部分内容,需要了解Linux文件系统,了解常用的Linux命令。

5、数据库知识

       很多IT岗位对数据库也有一定的要求,并不是说工作中肯定会直接涉及到数据库的操作与查询,数据库已经是个基本的技能要求了。部分岗位可能会直接操作数据库,去读写数据库,需要对数据库中的数据进行查询。一般要了解数据库表的创建、修改、删除;了解数据库表中的数据的增删改查(查询);了解索引、视图、事务、触发器、存储过程等概念。

       当前常用的数据库有甲骨文公司商业收费版的Oracle数据库、免费开源的MySQL数据库以及微软的SQL Server数据库。除了这些国外的数据库,近几年国内一些公司在开源数据库的基础上也陆续开发了自己的数据库产品,比如阿里的OceanBase数据库、华为的高斯数据库、腾讯的TBase数据库等,都达到了业界的顶尖水平!

       本部分随便找一本数据库的教材学习一下即可,SQL Server或者MySql都可以。不同的数据库在SQL语义上是类似的或者是相通的,可能在具体的细节上会有所差别,一般我们只要选一种数据库学习即可。

一般服务器侧需要存储大量的数据到数据库中,在大型的互联网公司的大型系统中要存储海量的数据,这对数据的存储与查询性能有着很高的要求,所以在这些公司会有专门的数据库工程师来负责这部分的业务!此外,在一些客户端软件或者嵌入式终端软件中,也会使用到数据库,一般数据量较小,会选用轻量级的sqlite数据库。

6、数据结构与算法

       找一本数据结构与算法的书学习一下。要了解单链表、双链表、双向循环链表的实现,熟悉八大排序算法(了解算法实现的时间复杂度与空间复杂度),了解B树、红黑树、动态规划、背包等经典算法问题。算法是互联网大厂的必考题,要面试大厂必须要提前准备的,中小型公司可能对这一块没有大多的要求。

7、需要重点关注的编程技术

       编程语言最终是为实现目标业务系统服务的,我们要使用编程语言去编写业务实现代码的。所以,除了系统地学习C与C++这两门开发语言,我们还需要重点学习以下具体的编程技术,这些技术在以后的工作基本都会涉及到。

7.1、socket网络编程

       首先要系统地学习一下socket套接字网络编程,熟悉常用的socket编程接口,了解Windows下的select模型、IOCP完成端口模型、Linux下的epoll模型等。虽然工作后不一定从事网络通信模块的开发,但是这些基本的网络编程知识比较重要,对于理解和分析开发过程中遇到的网络问题时是很有帮助的。

       此外,作为技术进阶,也可以去了解一下开源的libevent网络库和大型开源项目boost中的asio网络库,这两个开源库在很多公司都有使用到。

7.2、多线程与多线程编程

      在软件程序中,仅有一个主线程是远远不够的,为了处理一些并发的任务,必须要使用到多线程技术。我们将一些任务放到新建的线程中去做,并且线程之间需要进行通信,这就需要了解线程间通信的常用方法(面试常问问题)。

        此外,多个线程可能要访问共享的资源(比如内存资源),需要做好多线程之间的同步。我们通过锁实现多线程之间的同步,这个锁的实现也有多个方式(面试常问问题)。

这里面还有一个比较高端的线程池技术。因为线程创建与销毁是有一定开销的,所以为了较少这部分开销,提高软件的运行效率,我们会创建一定数量的空闲线程放置到线程池中,需要使用时从池中取出一个空闲的线程,使用完成后再将线程归还给线程池。

7.3、多进程及多进程通信

       有时为了提升软件的执行性能和效率,我们在启动软件时可能需要启动多个进程,不同的进程负责做不同的事务。比如我们常用的chrome浏览器,在启动时就会创建多个进程,不同的进程负责处理不同的事务。

       多进程之间需要进行数据共享或数据通信,这就会涉及到多进程之间通信方法,这也是面试时常问的一个问题。

7.4、动态链接库编程

       自从微软推出第一个版本的Windows操作系统以来,dll动态链接库一直是Windows操作系统的基础。动态链接库通常不能直接运行,它们是独立的二进制文件,只有在其他模块调用dll动态链接库中的函数时,它才发挥作用。

       在实际编程时,我们可以把完成某种功能的函数放在一个动态链接库中,然后提供给其他模块或其他程序调用。不仅Windows系统中会使用到dll动态库,Linux系统也会频繁地使用到(linux系统中以. so结尾),所以动态库编程也是一个要学习的技术点。

       其实动态库相对比较简单,学会动态库的封装,保证对外提供合理的API接口。

7.5、数据库编程

       在很多软件中需要将数据保存到数据库中,并对数据库中的数据进行查询操作,这就会涉及到操作数据库的编程技术。

       常用的数据库有轻量级的开源数据sqlite、大型开源免费数据库MySQL、商业数据库Oracle等。一般先要连接到数据库服务器上,然后通过该连接将数据写入到数据库中以及对数据库中的数据进行修改、删除、查询等操作。

在一些大型的IT公司,要存储海量的数据,对数据库技术有着很高的要求,会有专门的数据库开发的工程师岗位,由这些人去专门处理数据库开发的相关事务。有些岗位可能不会涉及到数据库编程,但数据库编程已经是开发人员必须具备的一个基本技能,所以我们需要学习一下。

上述几个编程技术的学习,推荐大家看孙鑫的《VC++深入详解》一书,上述技术在书中都有专门的章节去讲解。

7.6、设计模式

       在日常的编码工作中,会使用到一些常用的软件设计模式,比如单例模式、简单工厂模式和观察者模式等。这些设计模式可以很好地解决设计中的一些问题,不仅工作中会用到,面试时也会涉及到。

        对于初学者来说,有必要学习部分常用的设计模式,面试时也是一个体现优势的加分项!注意,不仅要了解这些常用设计模式的实现思想,还要

7.7、学习一些C/C++开源代码

       此部分需要有很好的C/C++基础,属于C/C++进阶部分的内容,想深入学习C/C++的朋友,可以来尝试学习一下。

       可以先看一些轻量级的开源库源码,比如分布式的高速缓存系统memcached、高性能事件通知库libevent、高性能的HTTP和反向代理web服务器Nginx、以及轻量级web服务器容器Lighttpd,这些开源库在实际项目中被广泛地使用,这些库都是用C语言开发的。

       也可以去学习一些著名的C/C++大型开源库,比如多媒体处理开源库FFmpeg、实时音视频处理开源库WebRTC和Chrome浏览器内核开源库Chromium等。当然这些大型开源库对于初学者来讲,是有很大的难度的。关于这些大型开源库的说明,可以参看之前写的文章:

C/C++开发人员要了解的几大著名C/C++开源库https://blog.csdn/chenlycly/article/details/125959453

      常用的开源库有SQLite、libcurl、libwebsockets、libevent、boost、jsoncpp/RapidJson、Redis、RabbitMQ、MongoDB、MQTT、ZooKeeper、OpenCV、FFmpeg、SDL、GStreamer、Live555、Nginx、ReactOS等:

1)处理json的jsoncpp、RapidJson库(json串的构建与解析)。

2)处理xml的TinyXML库(XML串的构建与解析)。

3)支持SMTP/HTTP/HTTPS等多协议网络传输开源库libcurl库(使用SMTP协议发送邮件、使用HTTP/HTTPS发起HTTP请求)。

4)处理文件压缩与解压缩的zip.cppunzip.cpp(支持文件的压缩与解压)。

5)二维码生成库libqr(生成二维码图片)。

6)png图片处理库libpng(读写png图片)。

7)图片读取解析库stb_image(图片读取与解析)。

8)实现websocket通信的libwebsockets库(客户端与服务器之间进行websoket通信)。

9)轻量级开源数据库SQLite(存放本地数据)。

10)多媒体处理开源库FFmpeg(包含音视频采集与编码、音视频解码、视频格式转换、视频抓图、给视频加水印等功能)。

11)实时音视频处理开源库WebRTC(包含音视频采集、编码、网络传输,解码显示等)。

12)Chromium嵌入式框架开源库CEF(嵌入浏览器控件)。

13)跨平台多媒体开发库SDL库(音视频采集、编码、解码显示等)。

14)数据实时压缩解压库zlib(对字节流数据进行实时的压缩与解压缩)。

15)异常捕获库CrashRpt/CrashPad(捕获软件运行过程中的异常)。

16)开源操作系统ReactOS(查看系统源码,可作为Windows系统代码实现的参考,有时能可以通过查看系统函数的实现去辅助解决问题)。

17)网络通信库boostmuduolibevent等。

18)计算机视觉和机器学习库OpenCV(用于实时的图像处理和计算机视觉任务,包括图像和视频捕捉、面部识别、物体检测、运动分析、3D重建、机器学习以及图像分类等)。

19)目标检测Yolo(实时目标检测算法,可以检测物体的类别和位置,用于智能监控、自动驾驶、机器人视觉等领域)。

20)高性能消息队列中间件 RabbitMQ(提供统一消息服务的应用层标准高级消息队列协议,用于组件或模块之间传递消息)。

21)开源数据结构存储系统Redis(一个开源的、使用ANSI C语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value数据)。

22)分布式的,开放源码的分布式应用程序协调服务ZooKeeper(它用来帮助分布式系统中的各个节点进行信息共享和同步,确保数据一致性;也用来用来存储和管理分布式系统的配置信息,如集群中的机器配置、服务地址配置等)。

23)非关系型文档数据库Mongodb

24)轻量级的、基于发布/订阅模式的物联网通信协议MQTT(MQTT是一种轻量级的消息传输协议,它采用发布/订阅模式,允许设备之间通过Topic主题进行通信。MQTT有支持多种开发语言的多种实现库,主要使用这些协议实现库)。

25)多媒体框架GStreamer(用于创建流媒体应用程序,以及处理各种媒体类型的数据流,包括音频、视频等)

26)流媒体来源库Live555(主要用于实现基于RTP实时传输协议和RTSP实时流协议媒体流的发送和接收,广泛应用于网络摄像头、IPTV、视频会议等需要实时传输音视频数据的领域)。

       一般我们只需要会使用这些开源库即可,至于开源库内部源码的实现与内部实现机制,可以根据个人兴趣去查看学习。 关于这些常用开源库的介绍与使用,专栏《C/C++实战进阶》中有多篇文章讲到,可以去看看:

C/C++实战进阶https://blog.csdn/chenlycly/category_11931267.html

8、学习过程中要多动手敲代码、多实践

        在学习过程中要多动手多实践,跟着教材在IDE开发环境中手动敲一些例子中的代码,把例子代码运行起来。必要时可以单步调试代码,搞清楚代码的运行逻辑,可以加深对书中知识点的理解。

        如果只用眼去看书中的文字描述,不手动去敲代码,学习的效果会比较有限的。此外,有的教材中会就某一项编程技术(比如socket套接字编程)给出一个具体的小项目实例,这些实例很有价值。作为初学者或者新手,大多都接触不到实战项目,这些实例可以作为练手的小项目来操练。

        总之,在学习书本理论知识的同时,也要动手将代码操练起来。在操练代码的过程中,也可以将常用的IDE开发环境熟悉起来,也能实战地调试代码,掌握一些常用的调试方法和技巧。

        除了书本上的示例代码和小项目实例,还可以到网上找一些别人写的小工具或小项目,学习别人的代码,可以尝试模仿别人的代码写一套属于自己的代码。github上有很多开源的小项目,可以去搜一下自己感兴趣的代码。

        当然我们在有很好的C/C++基础之后,可以选择一些更高阶的学习方式,可以去学一学一些常用的C/C++开源代码,比如上面讲到的一些常见的开源项目。可以先看一些轻量级的开源库,比如分布式的高速缓存系统memcached、高性能事件通知库libevent、高性能的HTTP和反向代理web服务器Nginx、以及轻量级web服务器容器Lighttpd,这些开源库在实际项目中被广泛地使用,这些库都是用C语言开发的。可以学习开源库中的设计思想和实现思路,学习代码设计上的具体细节,可以借鉴开源库中的一些巧妙的设计。 

9、熟悉IDE开发环境,掌握一些常用的调试方法和技巧

       下面我们来大概地讲一下C/C++ IDE开发工具的选择,以及要掌握的一些常用调试方法和技巧。

 

9.1、C/C++ IDE开发工具选择

9.1.1、推荐使用微软的Visual Studio

        对于日常编写和调试C/C++代码,该选择哪个IDE开发环境呢?推荐Windows上广泛使用的微软Visual Studio。Visual Studio有着强大的代码编辑功能与调试功能,很多公司都在使用该IDE进行项目开发。比如大家熟知的PC版微信、阿里钉钉、企业微信、字节飞书等客户端软件,都是用C/C++开发出来的,使用的IDE开发工具都是Visual Studio。

        在日常学习过程中使用Visual Studio,能在参加工作之前提前熟悉Visual Studio的使用,比如如何创建一个工程,如何配置工程属性等。在代码调试运行的过程中也能逐渐掌握一些常用的调试方法,比如单步调试、断点调试、附加到进程调试等。

9.1.2、Visual Studio版本选择

       微软的Visual Studio已经更新迭代了很多年,从经典古老的Visual Studio 6.0到现在的Visual Studio 2022。Visual Studio 6.0是20世纪90年代推出的,距今已有20多年历史了,现在基本不再使用了。推荐大家使用Visual Studio 2010、Visual Studio 2019和Visual Studio 2022这几个版本,大家不要使用Visual Studio 2017,2017版本很不好用,运行过程中会时不时的卡顿,特别是在调试代码的时候。

        Visual Studio 2010的安装包较大,可以自行到网上下载,一般大家都使用Visual Studio 2010旗舰版。至于Visual Studio 2019和Visual Studio 2022,可以下载免费的社区版本(Community Version),在百度中搜索一下微软的官方页面,到官方链接中下载即可。它们的安装包是很小的在线安装包,安装时是需要联网在线下载安装包进行实时安装的。

9.1.3、Visual Studio 2019社区版的下载和安装

        下面我们以下载和安装Visual Studio 2019社区版为例,讲一下相关的过程。先在百度中搜索“microsoft  visual studio 2019”,找到微软官方的链接,如下所示:

打开页面(页面的地址为:Visual Studio 2019 版本 16.11 发行说明 | Microsoft Learn)如下:

点击“Download Community 2019”按钮,下载免费的社区版本即可。此时下载的是在线安装包,安装过程中需要联网,在线实时下载安装包实时安装的。

        在线安装包下载完成后,双击安装包,先会在线下载一些配置文件,如下所示:

然后自动跳转到如下的页面:

为了方便开发带UI界面的C++程序,我们选择如上图所示的“使用 C++ 的桌面开发”安装类型然后在右侧的列表中记得勾选“适用于最新 v143 生成工具的C++ MFC”选项,该选项会安装MFC界面库,然后点击右下方的“安装”按钮即可。

我们可以使用MFC界面库去创建一些带UI界面的窗口程序。微软Visual Studio自带的MFC界面库很古老,这么多年基本没有大的更新,大型软件现在基本很少使用了,但日常工作中使用MFC去写一些带UI的小工具会比较方便的,MFC构建的窗口效果如下所示:

        至于C/C++常用的IDE开发环境介绍,可以参考我之前写的一篇文章:

C/C++编程工具及实用小软件推荐https://blog.csdn/chenlycly/article/details/126734902至于如何去使用Visual Studio开发环境,比如如何创建工程、如何去调试代码,限于篇幅,这里就不再赘述了,可以自行到网上搜索。

9.2、开源代码查看工具的选择

        在阅读C/C++开源代码时,推荐使用Source Insight工具。很多开源代码没有Visual Studio工程文件,没法使用Visual Studio打开工程的所有文件,如果单个单个文件去打开,阅读起来很不方便。一般我在查看开源代码时会选择Source Insight工具,该工具小巧轻便,占用很少的CPU和内存资源,启动速度快。

        只需要使用Source Insight创建一个工程,然后将开源项目的根路径添加到工程中来即可。比如开源项目libevent存放在磁盘的D:\OpenSrcCode目录中,则只需要将D:\OpenSrcCode\libevent添加到Source Insight的工程中即可。

        至于如何使用Source Insight,可以参见之前写的文章:
使用Source Insight查看编辑源代码https://blog.csdn/chenlycly/article/details/124347857Source Insight是一个代码查看和编辑工具,没有编译功能,即不能编译代码该工具轻便简捷,启动速度快,有的人喜欢用该工具去编写代码,比如我们这边搞驱动开发的同事日常就用该工具去编写项目代码。就我个人而言,我主要使用该工具去查看开源代码。

9.3、掌握一些常用的调试方法和技巧

        手动编写的代码,在编译时可能会报错,一般根据报错信息提示做针对性的修改即可。代码在运行时也可能出现意外的错误或异常,这就需要对代码进行调试了。为了解决代码中存在的缺陷或问题,我们需要掌握一定的代码调试方法和技巧。

        常见的调试方法有单步调试、断点调试(断点分普通断点、条件断点和数据断点)、附加到目标进程调试等。在调试过程中可以查看相关变量的值,查看源代码对应的汇编代码,查看各寄存器的值,可以查看中断时的函数调用堆栈。在调试过程中需要熟练掌握各个快捷键的使用,比如在Visual Studio中F5开启调试,F9设置断点,F10单步调试,F11进入函数等。

        关于Visual Studio的一些高效调试手段与技巧,可以参看我之前写的一篇文章:

【C++进阶】 Visual Studio高效调试手段与技巧总结(经验分享)https://blog.csdn/chenlycly/article/details/124884225

9.4、了解引发C++软件异常的常见原因,掌握排查C++软件异常的常用方法

         该部分属于高阶内容,对初学者不作要求,初学者在有一定的基础之后,可以作为进阶内容来学习,但在缺乏项目实战的情况下很难全部掌握。

        C++不是一门安全性语言,动态申请的内存是需要程序员去管理的,C++开发的软件大部分异常问题都是内存异常造成的,这也是Google推出更安全的Rust语言的一个重要原因,Google打算在部分领域用安全性较高的Rust语言将不太安全的C++替换掉。

        所以,作为一个C/C++开发人员,除了掌握一些常用的调试方法与技巧,我们还需要了解一些引发C++软件异常的常见原因以及排查这些异常的方法,以有效地应对开发调试过程中遇到的一些列问题,从而提高处理问题的效率和实效性。了解这些内容以后,在写代码时我们会下意识地去思考一些可能存在的问题,能让我们在编写代码时考虑的更加全面一点,这也能从源头上避免一些问题的出现。

        关于引发C++软件异常的常见原因,可以参见之前写的文章:
【C++进阶】C++软件异常的常见原因分析与总结(实战经验分享)https://blog.csdn/chenlycly/article/details/124996473关于排查C++软件异常的常用方法,可以参见之前写的文章:
【C++进阶】排查C++软件异常的常见思路与方法(实战经验总结)https://blog.csdn/chenlycly/article/details/120629327上述两篇文章是通过多年的项目实战经验总结出来的,需要通过不断的项目实践才能去有效地消化。对于初学者,由于缺乏项目实战,有些内容很难理解,属于高阶的内容,不作要求。初学者在有一定的基础之后,如果感兴趣,可以提前来了解一下,参加工作后可以一边工作一边去实践。

10、C++客户端开发

       我们日常主要使用Windows桌面操作系统,会频繁地使用到各式各样的UI客户端软件,所以我们重点介绍一下用C++开发客户端软件的一些内容。此外,在日常工作中可能会需要使用C++去开发一些带UI界面的小工具。另外,很多C++初学者是从客户端UI界面编程开始学起的,所以有必要说一下这方面的内容。

       在Windows系统中,大多数客户端都是用C++开发的,当然也有部分是使用C#等语言实现的。我们在Windows系统中常用的PC版QQ、微信、腾讯会议、企业微信、字节飞书、阿里钉钉和百度网盘客户端等客户端软件,都是用C++开发的

10.1、客户端UI开发技术与IDE工具

       客户端软件一方面要将业务数据弄到UI界面上展现出来,另一方面要提供业务操作的入口,所以客户端软件在实现时主要包含UI界面开发和软件业务两大块。UI界面实现,就是根据软件的需求和UI设计师的UI设计效果去实现软件的UI界面,实现过程中需要要用到一些常用的UI界面库。

       常用的C++ UI界面库主要有Visual Studio自带的MFC库,开源的基于directui思想的duilib库,支持跨平台的QT库以及Chromium浏览器的UI库,当然还有一些收费的界面库,收费的界面库不在本文的讨论之列。其中,MFC库和duilib库是基于Windows窗口设计的,只能用于Windows C++客户端软件的开发;QT是跨平台的,既能用于Windnows客户端开发,也能用于Linux客户端的开发。Windows上C++软件的开发主要使用Visual Studio开发环境,如果用到QT,一般使用专用的QT Creator开发环境。

10.2、UI界面库介绍

       下面就来详细介绍一下微软的MFC库、跨平台的QT库、开源的duilib库以及Chromium浏览器的UI库。

10.2.1、MFC库

        MFC是微软的IDE开发环境Visual Studio自带的界面库,原生的MFC界面比较简陋,界面效果很一般。MFC是个很古老的库,虽然Visual Studio更新了很多代,但MFC库始终维持在多年前的效果上,基本没有做任何升级和改进。

       平时我们会使用MFC库去开发一些小的工具软件,工具软件的界面比较简单,不用做专门的美化,用MFC即可快速地实现。但对于一些商业软件,原生的MFC库是没法满足要求,需要继承MFC库中的控件类,重写这些控件类以实现界面的贴图美化,但要实现比较酷炫的界面效果,使用MFC去实现会很吃力。

       现在的商业软件基本都不再使用MFC了,但有个行业除外。很多炒股类软件的客户端(比如大智慧客户端软件)还在用MFC库,炒股软件的界面主要来显示股票数据,对界面的美化效果没有太大的要求,使用MFC库做一些基本的美化即可。

10.2.2、duilib库

       duilib库是基于directui思想实现的UI界面库,相对于MFC,要好用很多,可以较容易地去实现一些酷炫的界面效果。很多知名的公司都在使用该库,比如ZOOM视频会议客户端、PC版微信、爱奇艺PPS客户端、京东咚咚客户端、百度网盘客户端、酷我音乐、酷狗音乐、华为PC版手机助手等。有些中小型公司也在使用该界面库,比如2345公司的好压等产品。

       网易和腾讯都开源了各自基于duilib改进而来的界面库,原生的duilib我们使用过,但腾讯和网易的开源版本没有研究过,不知道效果如何,不知道相对于原生的duilib都做了哪些改进。回头有时间的时候可以去研究一下

10.2.3、QT库

        QT是一套支持跨平台的界面库,既支持Windows平台,也支持Linux平台,甚至支持移动平台。如果要开发Linux系统中的客户端软件,则需要使用QT界面库。随着国产化系统的推行与普及,很多软件既要支持在Windows上运行,也要支持在国产化Linux桌面系统上运行。

       有些厂商为了实现对Windows和Linux双平台的支持,直接使用QT界面开发,而不再选择Windows用Windows专用界面库开发、Linux用QT开发的方式。比如视频监控大型厂商海康威视和大华的视频监控客户端软件都是直接采用QT界面库开发的。很多做人工智能的公司都选择QT进行应用软件的开发。

       近年来在国产化大潮的推动下,QT的支持者和使用者越来越多,QT开发也变得越来越火,招聘市场上对QT开发人员的需求也越来越大,很多大公司的软件也在选择使用QT开发。QT当前的火爆场面,在几年前是不曾有过的。

10.2.4、Chromium开源浏览器的UI库

        Chromium是Google的一个久负盛名的浏览器C++开源项目,它是Google的Chrome浏览器背后的引擎(几乎包含了Chrome浏览器的所有实现代码),其目的是为了创建一个安全、稳定和快速的通用浏览器。

Chromium的设计思想基于简单、高速、稳定、安全等理念,在架构上使用了Apple发展出来的WebKit渲染引擎,并采用Google独家开发出的用于提升JavaScript解译效率的V8引擎,以提升JavaScript的效率,而且设计了“沙盒”、“黑名单”、“无痕浏览”等功能,来实现稳定与安全的网页浏览环境。

       很多浏览器使用的都是Chromium开源内核,比如微软Win10系统中推出的Edge浏览器抛弃了IE内核,转而使用Chromium内核。国内知名的360浏览器、QQ浏览器、傲游浏览器,它们用的都是Chromium内核,只是开发了各自的UI皮肤和界面,增加了一些额外的用户功能。接下来说到的CEF嵌入式浏览器框架也是基于Chromium内核实现的。

       除了浏览器使用到了开源Chromium的内核,很多Windows应用软件也使用到了Chromium中的内容,使用到了Chromium中的UI组件。比如字节的飞书客户端、阿里的钉钉客户端、华为的WeLink客户端、网易云音乐与有道云笔记,均使用了开源Chromium中的UI组件去开发软件界面。

        那如何去判断一个客户端软件是否使用了Chromium浏览器的UI组件了呢?其实很简单,可以使用Visual Studio自带的SPY++工具,去探测一下这些软件的窗口属性,如果窗口的标题和类名中看到了Chrome的字样,就基本能确定软件的界面就是用Chromium的UI组件开发的。比如下图中的Chrome Legacy Window和Chrome_RenderWidgetHostHWND字符串:

11、最后

       上面大概地介绍了C/C++学习路线的主要内容,希望能给广大C/C++初学者提供有效的借鉴和参考。有些朋友可能想了解搞C/C++开发都有哪些岗位可供选择,可以参见之前写的文章:
C++没落了?学习C++没有前途了?从业者给你揭晓答案https://blog.csdn/chenlycly/article/details/126881672

        此外,文章主要给出的是C/C++初学者的学习路线,如果要做进一步的技术进阶,则需要掌握更多更有深度的内容!对于C/C++从入门到进阶的一系列书籍,可以参见之前写的一篇文章:
C++从入门到进阶的系列书籍推荐https://blog.csdn/chenlycly/article/details/121170439

本文标签: 路线