C/C++
文章平均质量分 77
暴躁的野生猿
请加入裙,欢迎同行一起学习交流,1零251②7672。百度搜索【CSDN 暴躁的野生猿】也可搜到群号码
展开
-
发送与解析不定长报文的标准流程
定长报文处理起来很简单,大多通信协议的报文结构都是这样的:stc-body-check-tail,假设每帧报文长为L字节。说明:stc(start char)为报文头字符,check为校验字(和校验、CRC校验等),tail为报文尾,也可以没有尾,很多协议会把校验字当做尾。1、把收到的字节都存进fifo,并发出通知,在通知的回调中开始处理报文2、通知的回调函数:(1)从fifo中p...原创 2019-07-18 10:40:28 · 4489 阅读 · 5 评论 -
QT正则表达式
1、indexIn函数:原型为int QRegExp::indexIn(const QString &str, int offset = 0, CaretMode caretMode = CaretAtZero) const形参:str为被操作的字符串,从str的第offset个字符的位置开始查找(若offset为负数,指从str的倒数第|offset|个字符开始查找),caremode指...原创 2018-04-09 10:58:09 · 4980 阅读 · 0 评论 -
STM32/keil把多个c文件编译为静态库lib
众所周知,编译lib的目的无非两个:加速编译、隐藏代码。一个常见的应用场景就是,把ST的标准库或HAL库等编译成lib,这样以后再编译整个工程时,就无需再次编译他们了,可以节省编译时间。当然,坏处是,无法右键1、把打算编译成lib的多个c文件放到同一个group。你也可以不把这些c文件放到同一个lib,这不影响后续步骤。放到同一个group的目的是,仅仅是方便后续操作而已。如下图,我们可以新建一个group。2、编译项目,保证项目可以编过(最好是0 warning 0 error).原创 2021-01-05 10:28:20 · 5759 阅读 · 2 评论 -
让程序自动记录编译时间、文件名、函数名、行号等,以QT为例
C/C++/ASM等源代码文件被编译时,可以通过C/C++编译器的内置宏定义,把编译时间记录下来,常用的宏有这么几个:__FILE__ 包含当前程序文件名的字符串__LINE__ 表示当前行号的整数__DATE__ 包含当前日期的字符串 ,__STDC__ 如果编译器遵循ANSI C标准,它就是个非零值__TIME__ 包含当前时间的字符串__FUNCTION__ 函数...原创 2019-11-20 18:34:25 · 1252 阅读 · 0 评论 -
指向成员函数的函数指针
C语言中的函数指针还是很简单的,这里还是稍微总结一下:函数地址: 函数名,&函数名,两者均可。 函数指针变量的定义方法: 把函数名替换为你喜欢的变量名,并在前面加*号,并把*号和函数名()起来。 函数指针类型的定义方法: 把上一步的变量名替换为你喜欢的类型名,前面再直接加typedef即可。例子:(1) 函数定义如下:char *parseF...原创 2019-11-14 16:35:43 · 1071 阅读 · 0 评论 -
参数可变的函数,形如printf(const char *, ...),原理与用法详解
原理非常简单,无非就是从栈中取出数据而已,为了实现这一目的,必须通过第1个参数指定后续参数的数目和类型,这样我们才能解析出栈中的数据。这也就是为什么参数可变的函数,都至少带着一个有名形参,例如printf(const char* fmt, ...),这个有名形参由两个作用:(1)用来指出后续形参的数目和类型,例如printf函数就是通过%X的形式来指定的,有多少个%就有多少个后续参数,参数的类...原创 2019-01-03 15:02:27 · 4237 阅读 · 0 评论 -
C标准库[string.h][stdlib.h]中的字符串处理函数详解
C标准库中,<string.h>"stdlib.h"两个文件中都有字符串处理函数,先看string.h:http://www.runoob.com/cprogramming/c-standard-library-string-h.html本文主要是列出库函数的名字及缩写的意义,以便辅助记忆这些函数的功能1 void *memchr(const void *...转载 2019-03-15 11:12:38 · 695 阅读 · 0 评论 -
C和C++混合编程
https://blog.csdn.net/caspiansea/article/details/9676153 《如何用C语言封装 C++的类,在 C里面使用》https://blog.csdn.net/SkyBlue05/article/details/82384904《STM32 —C与C++混合开发》在嵌入式领域,C和C++混合编程还是很常见的一、C++调用C的函数...原创 2019-03-20 15:20:12 · 603 阅读 · 0 评论 -
C语言“正则表达式”字符串处理sscanf(),使用前缀技巧、匹配邮箱等
一般的字符串处理函数可以使用C标准库的string.h,字符串匹配、字符串反转、在字符串中查找子串位置等。但string.h仍然满足不了我们的需求。来几个例题:(不允许使用c++)1、要求把一个字符串两端的空白符(可能有多个空格和TAB)给去掉,例如:“ asd123 qwer ”,要求处理完之后结果为:"asd123 qwer"。有人可能会想,这么简单的功能,手写一个函...原创 2019-05-22 18:43:05 · 13049 阅读 · 2 评论 -
利用整数的环回特性打造高效计时器、补码反码、负数的内存布局
对于任意一个uint8的数字x,一定有:式① x + (~x) = 255 = (1111_1111)b 其中"~"是标准C语言运算符:按位取反式② x + (-x ) = 0 = (0000_0000)b那么① + 1 =255+1= (1111_1111)b + (0000_0001)b = (1_0000_0000)b,(1_0000_0000)...原创 2019-05-30 21:12:32 · 1080 阅读 · 0 评论 -
求最小值的宏:#define min(x,y) x > y? y: x 中的陷阱,慎用
求最小值的宏:①#define min(x,y) x > y? y: x。这个宏网上遍地都是,殊不知,这个宏存在严重bug。顺便再列一下,下面这几个宏也存在严重bug,使用前一定要仔细考虑②#define min(x,y) (x) > (y)? (y): (x)③#define min(x,y) ((x) > (y)? (y): ...原创 2019-05-29 22:26:18 · 9142 阅读 · 5 评论 -
C++的类型转换与C的类型转换有区别
C风格的类型转换不会导致值的变化,但C++风格的转换经常会导致值的变化。例如:类D继承了类A和类B,那么用A、C指针都可以指向D的对象,例子:D obj_d;D *pD_d = &obj_d;A *pA_d = (A *)&obj_d;B *pB_d = (B*)&obj_d;虽然,pA_d 、pB_d 、pD_d 指向的都是对象obj_d,但结果...原创 2018-04-12 09:38:46 · 1639 阅读 · 0 评论 -
matlab 4字节合并为float,2字节合并为uint16
例如:float a = 3.1415; 它对应的内存数据为0x40490E56,在小端架构中的内存布局为: [ 56 0E 49 40 ](HEX),也即: [ 86 14 73 64 ](DEC)。在matlab中运行结果为:再举一个例子:uint16 a = 511; 备注:511(DEC)=0x01FF(HEX)a的内存数据为0x01FF,在小段架构中的...原创 2019-07-18 11:47:26 · 5596 阅读 · 0 评论 -
构造函数、析构函数、赋值函数的几个注意点
析构函数:1、如果某个类打算作为其他类的父类,那么这个类的析构函数应当声明为虚函数。按照C++的机制,当一个子类析构时,会从子类的析构函数开始,层层向上,直到把父类、祖父类···的析构函数都调用一遍,如果作为父类的类,它的析构函数不是虚函数的话,看例子:Base* base=new Child();delete base;这里的delete base就只能从Base类的析...原创 2018-04-11 10:40:09 · 236 阅读 · 0 评论 -
基类、派生类的同名函数
直接给出结论,便于以后查阅:1、多个普通函数,同名时会重载2、同一个类中的成员函数,同名时会重载3、子类与父类的函数同名时,子类会覆盖掉父类所有的同名函数,如下例,子类的一个func_0( ),把父类的func_0( )和func_0(int)都覆盖掉了。4、发生覆盖时,父类指针指向子类对象时,访问的全部都是父类的同名成员函数。#include <QCoreApp...原创 2018-08-02 20:19:14 · 6121 阅读 · 0 评论 -
运算符重载(2)
#include <QCoreApplication>#include <iostream>//移位运算符重载测试class MyOutNum{public: MyOutNum &operator<<(int num) { printf("%d ",num); return *this; ...原创 2018-04-03 22:16:18 · 139 阅读 · 0 评论 -
拷贝构造函数与赋值构造函数
#include <QCoreApplication>#include "stdio.h"#include "string.h"class PERSON{public: int age; char* name; PERSON() { printf("construct with 0 para\n"); age ...原创 2018-04-02 11:39:45 · 333 阅读 · 0 评论 -
C++的RTTI机制的理解,typeid和dynamic_cast<>
RTTI全名叫run time type identification,在运行时进行类型检查/辨认,他能完成一些虚函数解决不了的问题其应用场景举例:假设父类A定义了一些虚函数作为蓝图,众多子类B、C、D、E·····都继承了A,父类中的虚函数不可能囊括子类的所有行为,这些子类总会有一些独有的派生行为,如果我们想要用父类指针指向众多子类的众多对象,打算用这个父类指针遍历这些对象,那么我们用这原创 2018-04-12 11:24:24 · 1019 阅读 · 0 评论 -
多继承的类的对象的成员在内存中的布局--源码分析
测试情形描述:A类有public成员变量、private成员变量、2个虚函数show()、show_a()B类有public成员变量、private成员变量、2个虚函数show()、show_b()C类继承A和B,C有自己的public成员变量、private成员变量、2个虚函数show()、show_c(),显然A和B的虚函数show都被C的show覆盖了,show_a()和show原创 2018-04-11 16:31:50 · 369 阅读 · 0 评论 -
QT延时/等待怎么写?阻塞延时/不阻塞延时/耗时代码的处理
参考链接:https://blog.csdn.net/yanche521/article/details/50977301https://www.cnblogs.com/-wang-cheng/p/4973021.html一、阻塞型延时阻塞的原理就是:在延时期间,本线程的事件循环得不到执行。1、最简单的延时方法就是使用QThread类的sleep(n)、msleep(n)、usleep(n),这几...原创 2018-05-27 21:40:59 · 21190 阅读 · 4 评论 -
QT半透明图片叠加显示
需求描述:两张图片,一张作为背景,另一张半透明,作为前景。透过前景可以看到背景图1、用QPixmap对象载入背景图片,或者用paint代码在QPixmap自己画图;把QPixmap放入QLabel中显示;2、用QPixmap对象载入半透明图片,或者用paint代码在QPixmap自己画半透明的图;把把QPixmap放入QLabel中显示;3、把这两个label重叠,即可看到效果。注意:1、自己在Q...原创 2018-05-29 16:48:25 · 9590 阅读 · 8 评论 -
windows的CALLBACK函数修饰符
参考:https://blog.csdn.net/zhang_hui_cs/article/details/8544001对栈的操作是汇编层面做的,C语言并没有对应的语句能够直接操作栈,C语言的标准库 #include <stdarg.h>中有几个函数可以从栈中取数,但是并不能释放(POP)栈typedef char* va_list;void va_start ( va_list ...原创 2018-06-13 08:49:41 · 1433 阅读 · 0 评论 -
鼠标键盘钩子,屏蔽/修改按键消息
QT中使用钩子需要#include <Windows.h>鼠标键盘钩子各有两个,一个是普通的,一个是底层钩子,代码的写法差不多,区别是底层钩子比普通钩子更早接收到消息,还有个debug钩子,在所有的普通钩子前接收到消息。不同的钩子对应的回调函数的写法(形参、返回值的意义):https://blog.csdn.net/jiangxinyu/article/details/5284067,...原创 2018-06-13 17:50:15 · 1868 阅读 · 0 评论 -
C语言各种(精度、类型、进制的数字)和(字符串)互转:itoa、gcvt、strtod等
参考:https://zhidao.baidu.com/question/421247296.html一、数字转字符串1、通用转换头文件stdio.h int sprintf( char *buffer, const char *format [, argument,...] ); //用法仿照printf2、整数转字符串(支持负数)头文件stdlib.h形参:string为接收转换结果的缓冲区...原创 2018-06-02 10:05:16 · 2077 阅读 · 0 评论 -
二维数组名、二维数组名取地址、二级指针
先给出结论,便于以后查阅:首先给出几个定义:typedef int (*p1x4)[4];//定义数据类型,p1x4这种类型为指向含4个int元素的1维数组的指针typedef int(*p3x4)[3][4];//定义数据类型,p3x4这种类型为指向含3x4个int元素的2维数组的指针下面从一维数组说起:(定义:int a[4])(1)一维数组名a是个地址,地址类型为...原创 2018-06-25 14:44:25 · 3740 阅读 · 3 评论 -
typedef的4种常见用法
typedef的4种常见用法:一、给已定义的变量类型起个别名二、定义函数指针类型三、定义数组指针类型四、定义数组类型总结一句话:“加不加typedef,类型是一样的“,这句话可以这样理解:没加typedef之前如果是个数组,那么加typedef之后就是数组类型;没加typedef之前如果是个函数指针,那么加typedef之后就是函数指针类型;没加typedef之前如果是个...原创 2018-07-28 12:00:28 · 93208 阅读 · 21 评论 -
运算符重载(1)
下面的内容是我自己的理解,如有错误,请留言给我,共同进步。1、 =,(),[],->这四种运算符必须为成员函数形式,其他运算符可以重载为成员函数或友元函数;2、重载为友元函数形式,形参即为操作数的引用或拷贝;3、重载为成员函数式,可省略一个形参,另一形参(如果有的话)为另一对象的引用或拷贝。例外,重载++和--时,需要用哑元形参来指示该运算符是后缀,如A operator++( int ),...原创 2018-04-03 21:35:13 · 214 阅读 · 0 评论