
C++
文章平均质量分 54
heibao111728
一定要拥有一家自己的公司
展开
-
动态库中宏定义与主程序宏定义值不同时,程序以哪个为准?
直接先给结论:主程序代码以主程序中宏值为准,库中代码以库中宏值为准,相互之间不干扰,所以在使用第三方库时如果遇到宏定以值,主程序一定要手动将值与动态库中保持一致,否则程序就会报错,下面我们以jrtplib库的RTP_SUPPORT_THREAD值为例,一起验证一下。在日常的工作中,不可避免的要使用一些第三方库,有的时候第三方库提供了一下宏定义值,根据不同的宏定义值会有不同的响应。此时就出现一个冲突,主程序中的宏值与编译动态库时的宏值不同时,在程序运行过程中会以主程序中的值为准还是以动态库中的值为准?原创 2024-12-20 11:10:37 · 260 阅读 · 0 评论 -
lamda表达式
我讨厌lamda表达式的另外一个重要原因是在之前的认知里lamda表达式的全部功能都能被函数替代,没有存在的必要。这段代码中为什么必须使用lamda表达式,问题在于index这个参数(包含了所需的行和列的信息),如果使用常用的普通函数作为槽函数,那么信号中无法发送index参数,因为在QT中槽函数的参数来源是信号中的参数,而此处的信号是一个点击事件,没有任何参数,所以普通的函数作为槽函数无法获取index这个参数,而lamda有一个优势就是可以使用两个作用域中的参数,刚好可以解决此问题。原创 2023-07-24 11:15:14 · 376 阅读 · 0 评论 -
QT国际化之tr()使用
在正式简绍之前先说点题外话,刚接触qt时,部分功能需要查询网络资料,现在回过头来看有一点非常让人意外,就是网络上对tr()使用的介绍,之前看了网上有大量类似下面这样的用法:tr("系统设置")了解之后可以很负责任的分享给新入坑的同学,tr()中包含中文,完全是坑爹的误导,如果再代码中出现,首先可以肯定的是作者根本不知道tr()的用法。借着这个背景我们开始分享QT国际化。所谓国际化就是让同一软件服务于不同语言的使用人员,比如中文、英文。这种场景下有没有可能只编写一个版本的程序实现呢?答案是肯定的,qt原创 2022-07-13 15:08:14 · 2192 阅读 · 0 评论 -
vs使用mingw生成的动态库
1、使用mingw编译生成动态库*.dll;2、使用vs工具通过*.dll生成*.lib;创建vs需要的lib文件创建def文件,这要用一个第三方的工具pexports,可以在mingw中使用命令mingw-get install pexports进行安装。$ pexports liblinphone-4.dll > linphone.def$ pexports libmedi...原创 2020-05-03 17:35:49 · 3202 阅读 · 1 评论 -
Windows程序退出后后台依然存在该进程
对于这类型的问题,80%的概率是发生在我们自己写的代码本身,并且80%的概率是发生在多线程程序中,当我们的客户端线程在主线程退出后才开始退出就会导致该问题发生,所以解决该问题的本质办法就是确保我们自己的客户线程一定得在主线程退出之前结束退出。...原创 2020-04-27 11:56:46 · 3445 阅读 · 0 评论 -
c++Debug版本程序可以正常运行,release版本不行
相信很多行友都遇到过这个问题,在debug模式下程序可以稳定的运行,但是当产品交付的时候切换至release版就各种出问题,并且由于release版不能调试没法定位问题。一旦发生了这种问题给大家指条明路,挨个去排查是不是有些变量没有赋初值导致(90%的概率是因为此问题导致)。...原创 2020-04-26 16:18:27 · 1715 阅读 · 0 评论 -
网络编程之epoll
网络编程中异步IO主要有select和epoll两种方式,汇总如下:select与epoll比较 名称 优点 缺点 select 跨平台,Windows和Linux都支持 可管理的socket数量较少,最大1024,且当socket数量较多时速度较慢 epoll 可管理的socket数量几乎不受限制,不会随管理的socket数量增多而导致处理速度慢 ...原创 2020-02-21 11:16:40 · 203 阅读 · 0 评论 -
gtest学习笔记
TESTTEST宏的作用是创建一个简单测试,他定义了一个测试函数,在该函数中可以使用任何C++代码并使用提供的断言来进行检查。a) TEST(test_case_name, test_name)b) TEST_F(test_fixture, test_name)TestSuite级别需要写一个类,继承testing::Test。然后实现两个静态方法:SetUpTestC...原创 2020-02-11 15:48:06 · 439 阅读 · 0 评论 -
linux编程之条件变量
Linux下条件变量pthread_cond_t在使用的时候必须要配合一把互斥锁pthread_mutex_t来使用,为什么会这样呢?其实我们自己想办法做一个条件变量,要达到条件变量的效果,也是必须加互斥锁才能完成的。假如,有这样一个场景,一个读线程、一个写线程,一个设置标记线程。当设置标记线程将标记更改为true时,我们允许读、写线程工作,否则让读、写线程等待。首先我们不适用系统提供的条...原创 2019-12-31 16:21:51 · 237 阅读 · 0 评论 -
内存池
详见:https://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html原创 2019-11-27 20:45:45 · 136 阅读 · 0 评论 -
指针数组与数组指针的区别
顾名思义指针数组的本质是一个数组,数组指针是一个指针;指针数组中保存的元素是指针,数组指针指向数组,我们首先看看指针数组与数组指针的定义,方便理解:char* argv[6] = {0}; //指针数组,数组可以保存6个元素,每个元素都是一个 char* 类型的变量;char (*pa)[6] = NULL; //数组指针,其指向一个长度为6的一维数组;通过上面的例子我们可...原创 2019-10-02 14:48:42 · 185 阅读 · 0 评论 -
c++ map排序
stl中一个特别常用的数据结构就是map,但是相信很多人对map的了解都处于初级阶段,今天我们通过一个一片博文给大家介绍一点map稍微深一点的知识。我们都知道map的底层是通过红黑树管理节点的,因此map中数据事实上已经是排好序的,但是map是根据什么方法进行排序的呢?今天我们就来聊一聊这个话题。在日常使用map的过程中我们知道构造一个map需要两个参数,一个是key,一个是value。其...原创 2019-08-04 15:53:51 · 1149 阅读 · 0 评论 -
C语言中结构体对齐
c语言中结构体会发生对齐,这点大多数人都清楚,其目的是为了让cpu存取数据更快,但是为了提高存取的速度制定的规则是怎么样的?一直没找到靠谱的解释,网上给的多种说法,总感觉有些牵强,有特别懂的同志烦请留言赐教。通过程序的实际运行大致得出如下结论:1、较短长度的字节会补齐到4个字节(见例1);2、如果多个连续较短字节,总长度未超过4字节,会补齐到4字节(见例2);3、单个变量大于4字节但不是4的倍数的...原创 2018-06-25 15:58:45 · 265 阅读 · 0 评论 -
析构函数写成virtual的好处
相信学习c++的很多同志都听过这样的建议:最好将类的析构函数写成虚函数,如下:class B{public: B() { printf("B()\n"); } virtual ~B() { printf("~B()\n"); }private: int m_b;};这么写到底有什么好处呢?我们通过示例给大家解释,示例1,析构函数为普通函数//示例1class B...原创 2018-06-26 14:27:25 · 4885 阅读 · 2 评论 -
std::auto_ptr智能指针使用
此篇博文记录编码过程中遇到的有关智能指针std::auto_ptr的使用方法,由于是记录使用过程中遇到的方法所以不会将该智能指针的全部方法简绍清楚,有关std::auto_ptr的详细教程请参考相应的教程。1、reset(pam)方法:使用pam重置智能指针,如:std::auto_ptr<Message> message;message.reset(mFifo.getNext...原创 2018-08-27 17:43:53 · 273 阅读 · 0 评论 -
c++中结构体位域使用注意事项
1、一个位域必须存储在同一个单元中,不能跨两个单元。如一个单元所剩空间不够存放另一位域时,应从下一单元起存放该位域。如下第一个unsigned short 中 没有足够的空间存储system_clock_reference_base_29_15_,所以应当先将第一个unsigned short用'0'补齐,从下一个能够容得下该数据的空间开始存放。2、可以使用无名域位,这样的域位作用只是用来...原创 2018-10-30 11:22:29 · 497 阅读 · 0 评论 -
delete与delete[]的区别
对于delete与delete的区别,教课书上告诉我们:delete : 用来释放new分配的单个对象指针指向的内存,delete[] : 用来释放new分配的对象数组指针指向的内存。其实实际情况是这样吗?我们使用new申请一个int或者char等标准数据类型的数组,然后使用两种方法释放一下内存看看结果,我们可以发现两种方式的效果是相同的。既然效果是相同的那为什么会有delete[]...原创 2018-12-11 11:25:18 · 5477 阅读 · 0 评论 -
c++多线程cpu占用率过高解决之道
多线程并发在我们日常的工作中占有相当的需求比例,但是多线程程序很容易造成CPU使用率过高的问题,问题的原因在于我们一般的线程函数是用来处理一些简单的、需要循环处理的事情,例如一般情况下,在线程函数中我们常常使用下面的逻辑代码while( is_running ){ // do work //......}如果 "do work" 的工作特别简单,或者有的时候我们在do...原创 2019-02-20 14:32:13 · 12178 阅读 · 5 评论 -
c++面试应对
1、简单说说什么是线程同步?线程同步一般发生在有两个或两个以上的线程对同一全局变量进行读写操作时,为了使程序达到预期的结果而采取的一些手段,常见的手段有锁机制,就是说线程对于全局变量的访问,首先得加锁防止其他线程同一时间操作该全局变量而导致处理结果发生异常。...原创 2019-03-04 18:40:36 · 151 阅读 · 0 评论 -
c++之覆盖、隐藏、重载
c++真的是得工作若干年之后在回去重新梳理一遍基本概念才会深深体会到大学时学到的只是皮毛。今天我们正真了解一下c++中什么是覆盖、隐藏和重载。首先来看一下定义:覆盖:当子类中包含与父类中同名且参数列表相同的虚函数时,此时我们称子类的虚函数覆盖掉了父类的虚函数。隐藏:当子类中包含与父类中同名且参数列表相同的非虚函数时,此时我们称子类的函数隐藏了父类的函数。重载:同一个类中函数名相同但...原创 2019-04-28 21:47:43 · 464 阅读 · 0 评论 -
c++ map 按value排序
引子我们都知道c++ map的底层使用的红黑树管理节点,因此map中的数据存放实际上已经市排好序的,但是是通过比较key的值进行排序的,很多时候我们需要对map的value进行排序这种时候我们该怎么解决呢?解决方案下面我们给出一种解决方案:将map中的数据拷贝存放在vector中,然后使用stl的sort()函数对vector进行排序。相见如下代码#include<...原创 2019-08-04 15:28:12 · 615 阅读 · 0 评论 -
memset 无法初始化较大堆空间
经常做C++的朋友估计遇到过这样的问题,使用new申请的较大空间(大于200*1024 byte),无法使用memset初始化,例如如下代码可以编译通过,但是运行时会中断,提示内存的非法访问:#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAX_SIZE 2 * ...原创 2018-05-24 17:50:06 · 1316 阅读 · 0 评论