c++
圆月山庄
这个作者很懒,什么都没留下…
展开
-
VS2017 注释快捷键修改
1、工具 -> 选项2、环境 - 键盘3、显示命令包含 - 注释 - 编辑:注释选定内容焦点放到按快捷键下的方框内,同时按下Ctrl 和 / 键,点击分配按钮即可4、显示命令包含 - 注释 - 编辑:取消注释选定内容...原创 2022-04-19 15:37:24 · 818 阅读 · 0 评论 -
C++中指针和引用的区别
1.指针和引用的定义和性质区别:(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:int a=1;int *p=&a;int a=1;int &b=a;上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元。(2)引用不可以为空,原创 2022-03-23 21:50:05 · 915 阅读 · 0 评论 -
深入理解C++在.h头文件中定义函数导致的multiple definition
问题:某个头文件中声明并定义了一个函数,然后在多个源码文件中调用该函数,编译链接时出现了该函数multiple definition问题,在头文件中添加了 #ifndef 头也不行,经过尝试发现如果将该函数的声明和定义分开到.h和.cpp文件之后问题消失,为什么不能将函数直接定义在.h文件中呢?针对该问题,抽象出如下几个问题:1头文件中只可放置函数声明,不可放置函数定义吗?以下面的程序为例:// a.h#ifndef __a_h__#define __a_h__void funcA(void)转载 2021-10-12 09:15:23 · 2042 阅读 · 1 评论 -
Qt MSVC 2017 32bit 编译出现“error: C2131: 表达式的计算结果不是常数”错误
在MinGW 32bit下正常编译的qint64 fileLen = dstFile.size();char fileBuffer[fileLen];切换成MSVC 2017 32bit 编译后提示:报:error: C2131: 表达式的计算结果不是常数原因是在MSVC编译器中,定义数组时尺寸是不能用变量的。int b[] = { 1,2,3,4 }; 或者 int b[4] = { 1,2,3,4 };下面这样写就可以: qint64 fileLen = dstFile.size();原创 2021-09-24 15:08:14 · 2435 阅读 · 0 评论 -
MSVC编译器-C2001 常量中有换行符错误解决方法
解决方法:主要是由于MSVC2015编译器不支持其他类型的编码格式,需要把工程文件修改成UTF-8 带签名!!,UTF-8 无签名也是不行的。使用记事本 将文件另存为带 BOM头格式原创 2021-09-24 14:54:40 · 216 阅读 · 0 评论 -
Qt CuteLogger 日志输出文件
Qt 开发过程中,我们经常使用qDebug()来输出一条调试信息,但是,等软件正式发布之后,我们就需要软件运行日志功能,使用日志功能,能够快速的进行异常错误的跟踪和定位。也能查看软件运行的情况。Qt的日志工具有很多,log4cplus、log4cxx,Log4Qt等等,当然,也可以采用Qt的消息输出,重定向到日志文件,就可以实现一个简单的日志记录系统。具体可参考:使用Qt实现简单的日志记录功能(qInstallMessageHandler)下面,介绍一个 CuteLogger :基于Qt的应用程序的快速转载 2021-07-14 11:59:05 · 223 阅读 · 0 评论 -
CRC8 位校验
static const uint8_t crc8_table[256] ={0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31,0x24, 0x23, 0x2a, 0x2d, 0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65,0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d, 0xe0, 0xe7, 0xee, 0xe9,原创 2021-07-08 09:57:12 · 1315 阅读 · 1 评论 -
移位操作 如何读取位数据的某几位
单独第n位:(val&(0x1<<n))>>n取连续几位: (val&(0x07<<n))>>n0-2: (val&0x07)>>01-3: (val&0x0e)>>12-4: (val&0x1c)>>23-5: (val&0x38)>>34-6: (val&0x70)>>45-7L (val&0xe0)>原创 2021-07-06 10:13:30 · 504 阅读 · 0 评论 -
4字节 数据 大小端转换
unsigned int BLEndianUint32(unsigned int value){return ((value & 0x000000FF) << 24) | ((value & 0x0000FF00) << 8) | ((value & 0x00FF0000) >> 8) | ((value & 0xFF000000) >> 24);}int BLEndianINT(int iValue){INT3原创 2021-07-05 14:44:40 · 1146 阅读 · 0 评论 -
两字节16进制值转换为int
两个字节来存出一个整型的数据,例如0x0080,将其重新转换成int的方法是:char a = 0x80;//低位char b = 0x00;//高位int value = (int)((unsigned char)a | (unsigned char)b<<8);//先将char转换为unsigened char,再进行位移和或操作...原创 2021-07-03 20:57:10 · 1122 阅读 · 0 评论 -
结构体中柔性数组
参考https://blog.csdn.net/qq_40477151/article/details/78905567原创 2021-07-03 11:11:34 · 90 阅读 · 0 评论 -
H264 编解码协议详解
1.、什么是 H264?H264 是 MPEG-4 标准所定义的最新编码格式,同时也是技术含量最高、代表最新技术水平的视频编码格式之一,标准写法应该是H.264H264 视频格式是经过有损压缩的,但在技术上尽可能做的降低存储体积下获得较好图像质量和低带宽图像快速传输。2、一些相关名词解释下图为 H264 码流分层图2.1、VCL & NALH264 原始码流是由一个接一个 NALU(NAL Unit) 组成,它的功能分为两层,VCL(Video Coding Layer)视频编码层和转载 2021-06-09 17:06:13 · 492 阅读 · 0 评论 -
C++ 互斥锁、自旋锁、读写锁
加锁的目的就是保证共享资源在任意时间里,只有一个线程访问,这样就可以避免多线程导致共享数据错乱的问题。当已经有一个线程加锁后,其他线程加锁则就会失败,互斥锁和自旋锁对于加锁失败后的处理方式是不一样的:互斥锁加锁失败后,线程会释放 CPU ,给其他线程;自旋锁加锁失败后,线程会忙等待,直到它拿到锁;互斥锁是一种「独占锁」,比如当线程 A 加锁成功后,此时互斥锁已经被线程 A 独占了,只要线程 A 没有释放手中的锁,线程 B 加锁就会失败,于是就会释放 CPU 让给其他线程,既然线程 B 释放掉了 CP原创 2021-06-04 11:49:59 · 606 阅读 · 0 评论 -
C++11多线程并发基础入门教程
https://zhuanlan.zhihu.com/p/194198073https://blog.csdn.net/c_base_jin/article/details/89741247原创 2021-06-03 10:16:31 · 87 阅读 · 0 评论 -
C++ 原子操作
参考 https://www.cnblogs.com/ittinybird/p/4830834.html原创 2021-06-01 16:30:58 · 165 阅读 · 0 评论 -
哪些函数不能成为虚函数
常见的不能声明为虚函数的有:普通函数(非成员函数);静态成员函数;内联成员函数;构造函数;友元函数。1.为什么C++不支持普通函数为虚函数?普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时邦定函数。2.为什么C++不支持构造函数为虚函数?2.1含有虚函数的类包含一个虚指针,虚指针存储在对象的内存空间的。如果构造函数是虚的,就需要通过虚指针来调用虚函数表虚函数,可是对象还没有实例化,也就是内存空间还没有,就没有虚指针,所以构造函数不原创 2021-05-31 15:30:09 · 1263 阅读 · 0 评论 -
C++强制类型转换操作符 dynamic_cast
dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用。首先,dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的source对象是否真的可以转换成target类型,这种检查不是语法上的,而是真实情况的检查。dynamic_cast主要用于“安全地向下转型”dynamic_cast用于类继承层次间的指针或引用转换。主要还是用于执行“安全的向下转型(safe downcasting)”,也即是基类对象的指针或引用转换为同原创 2021-05-31 14:46:02 · 317 阅读 · 0 评论 -
C++ 常见面试题汇总
C++之 extern C的作用详解extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。...原创 2021-05-31 10:06:40 · 92 阅读 · 0 评论 -
C++ STL容器间的区别与选用标准
STL容器有vector、list、deque、map、multimap、unordered_map、set、multiset和unodered_map,他们之间有什么不同,各自的优缺点是什么,如何选用时适当的容器,这些问题需要去了解。vector 序列容器,类似于C语言中的数组,它维护一段连续的内存空间,具有固定的起始地址,可以在任何位置插入新元素,有随机访问功能,即提供[]操作符,并可以和标准C兼容。在效率方面,任意元素的读取、修改具有常数时间复杂度,在序列尾部进行插入、删除是常数时间复杂度,但在原创 2021-05-28 10:23:38 · 187 阅读 · 0 评论 -
C++中STL用法超详细总结
https://blog.csdn.net/u010183728/article/details/81913729原创 2021-05-27 18:56:45 · 98 阅读 · 0 评论 -
C++ 虚函数内存结构详解
参考 https://blog.twofei.com/496/原创 2021-05-27 18:45:59 · 157 阅读 · 0 评论 -
C++ 面试题总结
C++ 面试题总结https://www.cnblogs.com/bruce1992/p/14005868.html原创 2021-05-27 17:18:43 · 187 阅读 · 0 评论 -
C++ 多线程入门
一.概念在讲解多线程之前,有些概念还是有必要了解清楚的。①程序,进程,线程的区别程序:程序是由一系列的指令和逻辑组成的一个静态文件(如cpp文件),无论能不能运行,它都客观的存在于储存器中。进程:进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位–来源于百度百科。如果你是初学者,可能你并不能真正地理解这句话。通俗地说,系统为特定的静态程序分配好运行时需要的各种资源,这个时候系统会连带地生成一个PCB(进程控制块,一种数据结构)用来记录程序运行时(这里的运行并不是指原创 2021-05-25 09:55:32 · 102 阅读 · 0 评论 -
C++ lambda表达式
lambda 表达式作用:1.使用 STL 时,往往会大量用到函数对象,为此要编写很多函数对象类。有的函数对象类只用来定义了一个对象,而且这个对象也只使用了一次,编写这样的函数对象类就有点浪费。而且,定义函数对象类的地方和使用函数对象的地方可能相隔较远,看到函数对象,想要查看其 operator() 成员函数到底是做什么的也会比较麻烦。对于只使用一次的函数对象类,能否直接在使用它的地方定义呢?Lambda 表达式能够解决这个问题。使用 Lambda 表达式可以减少程序中函数对象类的数量,使得程序更加优原创 2021-05-25 09:33:48 · 125 阅读 · 0 评论 -
std::stringstream::str 用法
string str() const;void str (const string& s);Get/set contentThe first form (1) returns a string object with a copy of the current contents of the stream.The second form (2) sets s as the contents of the stream, discarding any previous contents. Th原创 2021-05-22 15:39:15 · 541 阅读 · 0 评论 -
C++ 设计模式详解
——简单工厂模式https://blog.csdn.net/CoderAldrich/article/details/83114571——工厂方法模式https://blog.csdn.net/CoderAldrich/article/details/83114648——抽象工厂模式https://blog.csdn.net/CoderAldrich/article/details/83114687原创 2021-05-20 17:22:10 · 68 阅读 · 0 评论 -
C++ 设计模式 观察者模式
参考 https://www.cnblogs.com/carsonzhu/p/5770253.html原创 2021-05-19 11:25:19 · 44 阅读 · 0 评论 -
c++设计一个不能被继承的类以及原因分析
设计一个不能被继承的类template <typename T> class MakeFinal{ friend T; private : MakeFinal() {} ~MakeFinal() {}}; class FinalClass : virtual public MakeFinal<FinalClass>{public : FinalClass2() {} ~FinalClass2() {}}原创 2021-05-11 14:18:38 · 164 阅读 · 0 评论 -
YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)
YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)详见 https://blog.csdn.net/xjhhjx/article/details/80291465原创 2021-04-27 11:37:29 · 366 阅读 · 0 评论 -
音视频学习从0到1- H264基本概念
音视频学习从0到1- H264基本概念一. H264基本概念.I帧: 关键帧,采用帧内压缩技术.举个例子,如果摄像头对着你拍摄,1秒之内,实际你发生的变化是非常少的.1秒钟之内实际少很少有大幅度的变化.摄像机一般一秒钟会抓取几十帧的数据.比如像动画,就是25帧/s,一般视频文件都是在30帧/s左右.对于一些要求比较高的,对动作的精细度有要求,想要捕捉到完整的动作的,高级的摄像机一般是60帧/s.那些对于一组帧的它的变化很小.为了便于压缩数据,那怎么办了?将第一帧完整的保存下来.如果没有这个关键帧后面解转载 2021-04-27 10:18:38 · 136 阅读 · 0 评论 -
C++函数前加两个冒号::但是前面没有类名
C++中调用函数前,加两个冒号::和不加两个冒号,作用一样吗?(1)不加冒号: 表示当前作用域(2)加冒号: 表示只使用类或命名空间中的变量或函数(3)双冒号前不加东西是全局变量或函数的意思...原创 2021-04-26 11:39:30 · 1961 阅读 · 0 评论 -
YUV 入门
YUV是编译true-color颜色空间(color space)的种类,Y’UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance或Luma),也就是灰阶值,“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。YUV 是一种彩色编码系统,主要用在视频、图形处理流水线中(pipeline)。相对于 RGB 颜色空间,设计 YUV 的目的就是为了编码、传输的方便,减少带宽占用和信息原创 2021-04-25 11:50:56 · 1647 阅读 · 0 评论 -
ffmpeg 入门
参考 https://blog.csdn.net/leixiaohua1020/article/details/25430425原创 2021-04-24 17:19:20 · 40 阅读 · 0 评论 -
C++ 枚举使用说明
枚举的声明方式:enum 枚举类型名 {枚举常量列表};如同结构体一样,枚举变量可以有不同方式声明:1.先定义后声明2.同时定义说明3. 直接说明设有变量a、b、c 是枚举类型weekday,可采用如下方式enum weekday {sun,mou,tue,wed,thu,fri,sat};enum weekday a,b,c;或者为:enum weekday {sun,mou,tue,wed,thu,fri,sat} a,b,c;或者为enum {sun,mou,tue,wed,原创 2021-01-18 11:56:20 · 293 阅读 · 0 评论 -
c++ 11 智能指针笔记
智能指针的使用智能指针在C++11版本之后提供,包含在头文件中,shared_ptr、unique_ptr、weak_ptr2.1 shared_ptr的使用shared_ptr多个指针指向相同的对象。shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,自动删除所指向的堆内存。shared_ptr内部的引用计数是线程安全的,但是对象的读取需要加锁。初始化。智能指针是个模板类,可以指定类型,传入原创 2020-12-19 15:39:09 · 117 阅读 · 1 评论 -
Linux系统下安装c++ boost开源库教程
=>>>安装Boost1、下载源码:进入网址:http://www.boost.org/users/download/在官网上可以下载源码包,目前官网上最新的软件包是boost_1_75_0 版本。针对Linux平台,本人下载的是boost_1_75_0.tar.bz2 文件。解压压缩包tar -xvf boost_1_75_0.tar.bz2安装boost库运行解压后生成的bootstrap.sh文件:cd ./boost_1_75_0./bootstrap.原创 2020-12-15 16:36:38 · 1413 阅读 · 0 评论 -
C++ 线程安全的单例模式总结
转载https://www.cnblogs.com/xiaolincoding/p/11437231.htmlC++ 线程安全的单例模式总结什么是线程安全?在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。如何保证线程安全?给共享的资源加把锁,保证每个资源变量每时每刻至多被一个线程占用。 让线程也拥有资源,不用去共享进程中的资源。如: 使用threadlocal可以为每个线程的维护一个私有的本地变量。转载 2020-12-11 10:55:15 · 125 阅读 · 0 评论 -
VS2015中添加QT插件
1.打开VS2015,在菜单栏中选择“工具 - 扩展与更新”,然后选择左侧的联机,找到“QT Visual Studio Tools”下载安装,如下图所示2. 菜单栏 -> Qt Vs tools -> Qt options -> Add,添加如下路径环境变量配置: 这台电脑 -> 属性 -> 高级系统设置 -> 环境变量 ,添加Path变量:4.安装配置完成,可以创建一个实例进行测试。...原创 2020-05-25 09:13:35 · 3425 阅读 · 0 评论