![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 77
缓下脚步
Life was like a box of chocolates, you never know what you’re gonna get.
展开
-
C/C++中container_of相关详解
该宏定义可以在编译时就直接计算出偏移量,避免了运行时的计算开销,因此比通过变量名访问成员的方式更为高效,通常用在需要直接访问结构体成员的底层代码中,例如在操作系统内核、嵌入式系统以及一些高性能计算应用中。然后,调用offsetof()即可得到member在type类型中的偏移量,最后返回一个指向type类型的指针。如上例,pname指向stu的name成员,通过container_of()宏获得了指向整个struct student结构体的指针pstu,然后就可以访问id和name成员了。原创 2024-03-13 09:59:11 · 510 阅读 · 1 评论 -
使用串口FIFO和Timer实现数据的高效收发
/指向接收缓存//帧首标志,为0xFF或者0xEE//找到帧首,一般是3~5个FF或EE//帧首的个数,一般3~5个//已经接收的字节数//找到完整帧后,置1//本帧数据总长度,这个区域是可选的3.2 初始化数据结构,一般放在串口初始化中/*** @brief 初始化寻找帧的数据结构* @param p_fine_frame:指向打包帧数据结构体变量* @param dst_buf:指向帧缓冲区* @param sfd:帧首标志,一般为0xFF或者0xEE*/原创 2024-03-05 14:51:04 · 1125 阅读 · 0 评论 -
C/C++指针变量详解
函数(如下例的funcForSpace())内定义局部变量(如下例的a)保存在一个函数的栈帧上,当一个函数执行完毕后,另一个函数(如下例的stackFrame_reuse())执行时,该空间会被stackFrame_reuse()重复使用,a所使用的空间将不复存在,所以当一个指针变量指向局部变量的内存空间时,其地址值传递给主调函数时,并不是一个有效值。二维数组是数组的数组,n维数组是n-1维数组的数组。指针变量的值就是其指向的空间的地址,指向的地址的空间大小就是指针变量指向类型的大小。原创 2023-11-01 09:58:56 · 211 阅读 · 0 评论 -
C++中invoke与function的区别
std::function是一个函数对象的封装器,可以用来封装任意类型的可调用对象,比如函数指针、lambda表达式等,而 std::invoke 则是一个函数模板,用于在统一的接口下调用可调用对象。因此,无论可调用对象的类型是什么,都可以使用invoke函数来调用,而不需要使用不同的语法。在C++17之前,调用不同类型的可调用对象需要使用不同的语法,比如直接调用函数、使用类对象的运算符重载操作符()来调用函数对象、使用成员函数指针来调用类成员函数等等。则适用于统一调用各种不同类型的可调用对象的场景。原创 2023-10-27 11:05:44 · 382 阅读 · 0 评论 -
C语言实现状态机
状态机应用很广泛,也可以锻炼我们写代码的逻辑思维,看清问题的本质,写的代码才能赏心悦目,希望大家能够多多指点,找到编程的乐趣,欣赏到编程之美。原创 2023-08-25 09:45:11 · 167 阅读 · 0 评论 -
C语言之extern “C“详解与使用方法
在你工作过的系统里,不知能否看到类似下面的代码。这好像没有什么问题,你应该还会想:“嗯⋯是啊,我们的代码都是这样写的,从来没有因此碰到过什么麻烦啊~”。你说的没错,如果你的头文件从来没有被任何C++程序引用过的话。这与C++有什么关系呢?看看__cplusplus(注意前面是两个下划线) 的名字你就应该知道它与C++有很大关系。__cplusplus是一个C++规范规定的预定义宏。你可以信任的是:所有的现代C++编译器都预先定义了它;而所有C语言编译器则不会。原创 2023-08-18 10:15:43 · 5460 阅读 · 1 评论 -
设计模式之解释器模式详解及实例
我们实现了三个具体的表达式类:AddExpression(用于表示加法表达式),SubtractExpression(用于表示减法表达式)和NumberExpression(用于表示数字)。非终结符表达式(Non-Terminal Expression):实现抽象表达式接口的具体类,用于解释非终结符表达式。易于扩展:当需要增加新的文法规则时,只需增加新的非终结符表达式类,无需修改原有代码,符合开闭原则。易于维护:每个文法规则对应一个非终结符表达式类,当需要修改或维护某个规则时,只需修改对应的类即可。原创 2023-08-17 14:48:07 · 821 阅读 · 0 评论 -
C++多线程基本原理详解
在C++学习过程中,要想“更上一层楼”的话,多线程编程是必不可少的一步,大家需要更多的思考是为什么这么做?这样做的好处是什么?以及多线程编程都可以应用在哪里?传统的C++(C++11标准之前)中并没有引入线程这个概念,在C++11出来之前,如果我们想要在C++中实现多线程,需要借助操作系统平台提供的API,比如Linux的,或者windows下的。C++11提供了语言层面上的多线程,包含在头文件中。它解决了跨平台的问题,提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。多进程并发。原创 2023-08-01 15:34:52 · 327 阅读 · 0 评论 -
Socket基本原理详解
• socket中文套接字,我理解为一套用于连接的数字。并不一定准确,欢迎评论。• sock在内核,socket_fd在用户空间,socket层介于内核和用户空间之间。• 在操作系统内核空间里,实现网络传输功能的结构是sock,基于不同的协议和应用场景,会被泛化为各种类型的xx_sock,它们结合硬件,共同实现了网络传输功能。原创 2023-07-24 14:04:07 · 656 阅读 · 1 评论 -
QT之智能指针
EmployeeData 必需继承自QSharedData,QSharedData类是共享数据的基类,它提供引用计数,它只有默认的构造函数,拷贝构造函数和析构函数,一般情况下,我们有必要自己重写这几个函数。QSharedPointer 行为最接近原始指针,是最像指针的"智能指针", 与 QScopedPointer 一样包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针 ,可以被自由地拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除被包装的动态分配的对象。原创 2023-07-17 14:00:09 · 773 阅读 · 1 评论 -
Qt之线程的同步和互斥
线程锁能够保证临界资源的安全性,通常,。A、系统中存在多个临界资源且临界资源不可抢占B、线程需要多个临界资源才能继续执行A、对使用的每个临界资源都分配一个唯一的序号B、对每个临界资源对应的线程锁分配相应的序号C、系统中的每个线程按照严格递增的次序请求临界资源提供了线程同步的手段。使用线程的主要想法是希望它们可以尽可能并发执行,而一些关键点上线程之间需要停止或等待。例如,假如两个线程试图同时访问同一个全局变量,结果可能不如所愿。原创 2023-07-11 13:57:47 · 818 阅读 · 1 评论 -
C/C++指针内存泄漏的原因详解及如何避免与问题定位
C/C++之所以复杂、效率高,是因为其灵活性,可用直接访问操作系统API,而正因为其灵活性,就很容易出问题,团队成员必须愿意按照一定的规则来进行开发,有完整的review机制,将问题暴露在上线之前。这样才可以把经历放在业务本身,而不是查找这些问题上,有时候往往一个小问题就能消耗很久的时间去定位解决,所以,一定要有一个良好的开发习惯。原创 2023-07-04 15:07:23 · 1372 阅读 · 0 评论 -
C语言Static关键字详解及使用方法
1>其他文件中可以定义相同名字的函数,不会发生冲突,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。<2> 静态函数不能被其他文件所用。存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。<3> 统计次数功能 声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。原创 2023-06-29 15:56:04 · 160 阅读 · 2 评论 -
Makefile基本原理详解及使用
一个企业级项目,通常会有很多源文件,有时也会按功能、类型、模块分门别类的放在不同的目录中,有时候也会在一个目录里存放了多个程序的源代码。 这时,如何对这些代码的编译就成了个问题。Makefile 就是为这个问题而生的,它定义了一套规则,决定了哪些文件要先编译,哪些文件后编译,哪些文件要重新编译。 整个工程通常只要一个make命令就可以完成编译、链接,甚至更复杂的功能。可以说,任何一个 Linux 源程序都带有一个Makefile 文件。 1. 管理代码的编译,决定该原创 2023-06-25 15:43:50 · 1437 阅读 · 1 评论 -
C语言中有关char数组和char指针的区别
当您编写语句 char *ptr = "Aticleworld" 时,您是让字符串文本数组进行数组到指针的转换,以获取指向其第一个元素的指针。当我们在 char 数组 arr 上使用 sizeof 运算符时,它给出字符总数,而 char 指针 ptr 只给出指针的大小。Char数组本质上是静态的,这意味着您无法调整数组的大小,而使用指针,您可以在任何时间点更改分配的内存的大小。另一方面,ptr 保存字符串文本的第一个字符的地址。和指针之间的另一个重要区别是,我们可以增加指针,但不能创建数组的增量。原创 2023-06-23 22:09:37 · 711 阅读 · 1 评论 -
CRC校验码详解、常见算法实现及代码实例
在前面的文章中通过小例子的比喻,简单介绍过什么是CRC,这里再详细的讲解一次。CRC(Cyclic Redundancy Checksum)是一种纠错技术,代表循环冗余校验和。数据通信领域中最常用的一种差错校验码,其信息字段和校验字段长度可以任意指定,但要求通信双方定义的CRC标准一致。主要用来检测或校验数据传输或者保存后可能出现的错误。原创 2023-06-21 11:03:11 · 23228 阅读 · 6 评论 -
MFC读写.txt文件时进度条显示实时进度
PS:SetPos()只能接受int型变量,而计算后的进度又要使用Float类型进行保存计算,所以这里要特别注意各个变量之间计算时的类型转换问题,否则会一直出现Pos为0而进度条始终没有反应的情况。整体实现方式:先获得文件长度,然后用每次读取的长度,计算出完成的百分比,用百分比的值设置进度条。3. 获取当前读取进度的行数,计算出完成的百分比,用百分比的值设置进度条。2. SetRange() —— 设置进度条范围。3. SetPos() —— 设置当前值。5. SetStep() —— 设置步长。原创 2023-06-12 11:03:05 · 643 阅读 · 0 评论 -
MFC修改窗口图标
自己再添加一个进去(.rc文件夹右键-->添加资源-->ICON-->导入-->.ico文件),添加后,在属性里面自己修改一下名称就可以了。2. 打开resource.h,MFC自动生成的IDR_MAINFRAME的ID为128,自己添加的ICON的ID都大于这个值,所以只需将自己添加的ICON ID小于128即可。PS:VS直接运行,图标已经更改可以使用,但是在直接.exe时,界面仍然是旧的图标,原因是Windows有图标缓存,所以默认还是显示那个旧的图标。将生成好的图标放置在资源res路径下。原创 2023-06-09 10:47:17 · 1664 阅读 · 0 评论 -
MFC获取文件路径和文件夹路径
2、在界面上加一个按钮,单击按钮弹出一个对话框选择文件夹,在工程中获取文件夹的路径。1、在界面上加一个按钮,单击按钮弹出一个对话框选择文件,在工程中获得文件的路径;原创 2023-06-09 10:12:52 · 1840 阅读 · 0 评论 -
C++使struct对象拥有可变大小的数组原理详解
C++中 public、protected、private内的声明顺序可以被保证,但是这三个关键字的布局是不同的。我们对以上两个结构体做对比,可以发现,前者的pc数组和变量i在内存里是相连的,而后者不是,后者并没有开辟出一个连续的内存空间,只是将指针指向了一个具体的内存地址。通过strcpy,将string字符串拷贝给mumble.pc,pmumble已经分配了足够的内存,因此只要赋值即可,也就达到了可变大小数组的意思。首先,结构体的末尾定义了一个char数组,只分配了1个字符。那怎么能说是可变大小数组。原创 2023-06-06 10:15:02 · 434 阅读 · 0 评论