
C/C++编程
C/C++编程
chocolate7777777
这个作者很懒,什么都没留下…
展开
-
VSCode远程调试linux环境的C/C++(三)
前面试着远程调试了个简单的C++程序,但实际项目模块很多,还用了很多第三方库,本来说是学习下CMAKE的,后来想着tasks.json中既然可以定义先cmake再make,那我本来已经make过的项目可以只选择make就可以了,再配置个launch.json是不是也可以加断点调试了,试了下果然可以,这比linux下调试方便多了。先打开整个项目的文件夹,按F5,选择添加launch.json,把以前的sh启动脚本放到launch.json里。再跟前一篇一样F9加断点,F5开始跑就可以单步调试了。原创 2024-02-29 15:58:09 · 637 阅读 · 0 评论 -
CMake应用
记录下方便学习。原创 2024-02-28 15:36:52 · 438 阅读 · 0 评论 -
VSCode远程调试linux环境的C/C++(一)
第一次搭建该环境,记录一下。原创 2024-02-23 17:37:10 · 949 阅读 · 0 评论 -
VSCode远程调试linux环境的C/C++(二)
点击最左边的Run and Debug或者按F5即开始执行,可按F9加断点,左边可以看到停在断点时的堆栈,其它跟VS一样,可以按F10单步调试了。vscode里框架如下,刚开始没有lauch.json,点击最左侧的Run按钮可自动生成个,我自己添加了tasks.json。tasks.json代码如下,给出了linux下执行步骤,先cmake,再make,再build。launch.json代码如下,根据路径修改了 "program"安装成功后开始写代码测试,先写个最简单的,文件结构如下。原创 2024-02-28 14:24:12 · 810 阅读 · 0 评论 -
内存泄露排查
查看生成的mem.txt,没看出什么问题。C++的工程,发现有内存泄露。还有泄露,晕,再找吧。原创 2023-12-22 10:30:46 · 430 阅读 · 0 评论 -
取文件夹大小
实际使用时发现文件夹已经2G了,取出来只有1400M的样子,一查发现。命令返回的是文件的字节数,而不是实际在磁盘上占用的大小。原创 2023-12-07 14:58:44 · 447 阅读 · 0 评论 -
tinyxml循环读取xml文件
读一个如下格式的xml文件。原创 2023-11-29 14:42:30 · 538 阅读 · 0 评论 -
生成随机车牌
【代码】生成随机车牌。原创 2023-11-29 14:33:13 · 918 阅读 · 0 评论 -
跨平台获取当前线程ID
【代码】跨平台获取当前线程ID。原创 2023-11-28 17:42:23 · 519 阅读 · 0 评论 -
C++11并发编程-条件变量(condition_variable)详解
是条件变量,更多有关条件变量的定义参考维基百科。Linux下使用Pthread库中的函数提供了与条件变量相关的功能,Windows则参考MSDN。当对象的某个wait函数被调用的时候,它使用(通过std::mutex) 来锁住当前线程。当前线程会一直被阻塞,直到另外一个线程在相同的对象上调用了函数来唤醒当前线程。对象通常使用来等待,如果需要使用另外的lockable类型,可以使用类,本文后面会讲到的用法。// 全局互斥锁.// 全局条件变量.// 全局标志位.while (!转载 2023-08-17 14:47:16 · 513 阅读 · 0 评论 -
C++多线程启动、暂停、继续与停止
C++11标准以后,加入了线程相关的接口,在应用中经常需要使线程暂停,在windows API中可以使用suspend 使线程挂起,但容易产生一些意想不到的问题,官方并不推荐使用。在自动化设备中,设备在运转过程中,为了防止设备伤人,通常会在设备门入口安装光幕,当光幕被遮挡时,设备必须暂停,确保安全的情况下,按下继续按钮,设备继续运转。对于多工位的设备,每个工位可能交由一个线程处理,因此暂停时,需要令这些线程暂时挂起。运行程序,单击开始后,编辑框中正常计数,但在线程退出时,阻塞在 join() 函数。转载 2023-08-17 10:39:20 · 1793 阅读 · 0 评论 -
Linux串口获取完整的数据包
或者获取到指定的标志位之类。但是我这因为设备上协议已经固定,没有特别的标志位,数据还是变长的,并不主动上报消息,只有在下发指令后要及时获取回应的消息,所以这些方法都不太适用。只好给了个合适的时间段,获取该时间段内收到的数据。收消息的时候标志位读数组中相应串口的标志位,为true就开始计时并循环收消息,直到规定的时间为止,因为我收到的数据都不长,所以给了50ms的时间,此处可根据收到数据量的多少调整时间长度。发消息的时候设置标志位通知开始收,因为我这有多个串口,所以用map记录了标志位。原创 2023-07-07 10:40:58 · 381 阅读 · 0 评论 -
C++获取当前线程ID
在需要获取ID的线程中调用gettid()即可。原创 2023-07-05 16:15:24 · 486 阅读 · 0 评论 -
C++ 单例模式的各种坑及最佳实践
1.C++ 单例模式的各种坑及最佳实践06-11收起单例模式是设计模式中最简单、常见的一种。其主要目的是确保整个进程中,只有一个类的实例,并且提供一个统一的访问接口。常用于 Logger 类、通信接口类等。转载 2023-06-16 10:01:59 · 160 阅读 · 0 评论 -
C语言中指针和数组
int* ptr;int *ptr;咋一看,这俩不是一样吗?如果你仔细观察就可以发现其中的不同,第一种定义方法中靠近类型,而第二种靠近变量,看到这里,有些朋友就要说了,你个杠精!这不就是个写法问题吗,至于这么纠结吗!这还真不仅仅是个写法问题。这两种写法背后代表着不同的逻辑:第一种写法的背后的逻辑是,将int作为一个整体,将其视为一个类型,即int、char*与int、char这些一样,都是一种独立的类型,再用这些类型来定义指针变量,从这个角度来看,指针是比较好理解的,而且看起来更能解释得通。转载 2023-06-14 15:22:17 · 71 阅读 · 0 评论 -
GCC 编译流程简介
经过汇编生成的目标文件,如果是多个文件的编译,将会生成多个目标二进制文件,ld连接器将所有的二进制文件链接起来,根据平台的不同添加上不同的头部信息,分配内存空间,需要注意的是,在所有需要链接的目标文件中,有且仅有一个main()函数,main()函数作为程序入口函数只能有一个,否则会报错。很多朋友对库的概念应该不算陌生,经常会用到各种各样的库,但是仅仅停留在理解的层次而已,甚至都从来没有手动管理过库,其实可以说基本上每个程序员写的每个程序都要用到库函数,在C/C++语言中,最明显的例子就是包含头文件。转载 2023-06-14 14:42:29 · 96 阅读 · 0 评论 -
C/C++函数调用时传参过程与可变参数实现原理
即使是现在的MCU,内部寄存器的资源也是极其有限,以目前非常流行的Cortex M3为例,15个内部寄存器,除去三个特殊寄存器(SP,PC,LR),共有12个通用寄存器,由于是32bit MCU,所以即使在极限状态下,寄存器也只能存几十个字节的数据。第一和第二个问题其实可以同时来解释,参数从右往左压栈,在可变参函数调用时,先将最后一个参数入栈,最后将第一个参数入栈,可变参数主要是通过第一个参数来确定参数列表,但是这时候如果第一个参数没有被指定的话,编译器将无法定位参数在栈上的范围。转载 2023-06-14 14:22:39 · 574 阅读 · 0 评论 -
Linux多线程编程(不限Linux)
线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,如线程之间怎样同步、互斥,这些东西将在本文中介绍。我在某QQ群里见到这样一道面试题:是否熟悉POSIX多线程编程技术?如熟悉,编写程序完成如下功能:1)有一int型全局变量g_Flag初始值为0;2) 在主线称中起动线程1,打印“this is thread1”,并将g_Flag设置为13) 在主线称中启动线程2,打印“this is thread2”,并将g_Flag设置为2。转载 2023-06-13 17:42:27 · 89 阅读 · 0 评论 -
c++拼接字符串效率比较(+=、append、stringstream、sprintf)
比较方法是写了4个函数,分别用+=、append、stringstream、sprintf的方式来拼接字符串,拼接方法是将s1="abcedfg",s2="hijklmn",s3="opqrst"三个字符串拼接到一起,总共循环60次。为了使时间差异更明显,可以取循环N(N可以为100或是1000000等)次调用的时间。根据以上结果,如果是使用Linux系统并且是g++(gcc)编译器,大量拼接字符串的效率从高到低依次为:+=、append()、stringstream、sprintf()。转载 2023-06-13 13:43:54 · 399 阅读 · 0 评论 -
makefile详解
一、初识makefile想要掌握makefile,首先需要了解两个概念,⼀个是⽬标(target),另⼀个就是依赖(dependency)。⽬标就是指要⼲什么,或说运⾏ make 后⽣成什么,⽽依赖是告诉 make 如何去做以实现⽬标。在 Makefile 中,⽬标和依赖是通过规则(rule)来表达的。(一)、目标首次编写makefileall: echo "Hello world"上面Makefile 中的 all 就是我们 的⽬标,⽬标放在‘:’的前⾯,其转载 2023-06-13 09:52:58 · 6202 阅读 · 1 评论 -
跨平台C++通过libevent实现高并发网络编程
启动一个专门用来accept客户端的线程,启动指定个数的工作线程用来处理与客户端的具体业务,accept线程将收到的客户端随机分发到工作线程中,每个工作线程可能处理一个或多个与客户端的交互。Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,已经被广泛的应用,作为底层的网络库,可适用于多种平台。为了实现高性能的服务端,用了异步处理网络IO+多线程。LibeventThread代表每个工作线程的线程信息。ConnQueue是个所有socket连接的双链表类。原创 2023-06-09 15:59:24 · 733 阅读 · 0 评论 -
MSVC中C++ UTF8中文编码处理探究
在编辑器里输入一个UTF8汉字开始,到最终在控制台上显示出来,整个流程涉及到三个概念,分别是源码字符集,执行字符集,解析字符集转载 2023-05-25 13:53:32 · 649 阅读 · 0 评论 -
跨平台tcp socket通信C++类
可在windows和linux上运行。原创 2023-05-31 15:51:47 · 918 阅读 · 0 评论 -
在Java中调用C++和C++中回调Java
在Java中调用C++和C++中回调Java原创 2023-05-29 15:38:55 · 971 阅读 · 0 评论 -
通过curl实现的跨平台http上传和下载接口
通过curl实现的跨平台http上传和下载接口原创 2023-05-30 10:15:46 · 566 阅读 · 1 评论 -
查找exe依赖的dll
在 Windows 10 下Dependency Walker工具会卡住,如果装了visual studio可以使用它自带的工具dumpbin.exe来查找依赖库dumpbin.exe /dependents test.exe。原创 2023-05-30 16:16:14 · 803 阅读 · 0 评论 -
跨平台的C++中执行指令
【代码】跨平台的C++中执行指令。原创 2023-05-30 14:42:33 · 127 阅读 · 0 评论 -
Linux C++模拟键盘按键事件
【代码】Linux C++模拟键盘按键事件。原创 2023-05-30 14:20:32 · 653 阅读 · 0 评论 -
跨平台的C++ UTF8中文乱码问题
因为程序经常需要支持既能在windows上运行,也能在linux上运行,windows上vs默认的是gbk编码,而linux默认的是utf-8,通过vs的"高级保存选项"保存为utf-8还是会出现乱码问题,在参考过文章。后了解到需要保存为带BOM的utf-8,于是在windows下使用工具sublime,保存含有中文的代码文件为UTF-8 with BOM格式。保存完后再在vs中编译即可,再输出就不乱码了。原创 2023-06-01 09:52:47 · 383 阅读 · 0 评论 -
String和QString相互转化的中文乱码问题
当使用上面的转换方法时经常出现乱码问题,可使用下面的转换方法来替换。原创 2023-06-01 14:25:03 · 990 阅读 · 0 评论 -
跨平台tcp socket通信C++类(后续)
tcp socket在阻塞模式下,调用connect超时时间很长,所以尝试添加超时时间原创 2023-06-02 14:42:17 · 655 阅读 · 0 评论