C/C++
文章平均质量分 61
C++相关知识
xupeng1644
道阻且长,行则将至!
展开
-
Linux下编译Zipper库
Linux编译ZipperCentOS编译Zipper原创 2022-07-12 23:08:46 · 622 阅读 · 0 评论 -
Linux下编译fmt库
下载fmt的下载地址为https://github.com/fmtlib/fmt/tags,以下载版本8.1.1为例,下载后文件为fmt-8.1.1.tar.gz。编译使用命令tar -zxvf fmt-8.1.1.tar.gz进行解压,解压完成后文件夹fmt-8.1.1中目录结构如下:.├── ChangeLog.rst├── CMakeLists.txt├── CONTRIBUTING.md├── doc├── include├── LICENSE.rst├── README.rs原创 2022-03-30 11:31:52 · 4693 阅读 · 0 评论 -
Linux下编译googletest
下载下载地址为https://github.com/google/googletest/tags,以版本release-1.10.0的tar.gz包为例,下载完成后的文件为 googletest-release-1.10.0.tar.gz。安装googletest使用CMake来进行构建。使用命令tar -zxvf googletest-release-1.10.0.tar.gz解压缩,解压缩完成后,目录googletest-release-1.10.0结构如下:[root@instance-1a原创 2022-03-29 16:03:00 · 2516 阅读 · 1 评论 -
GDB使用gdb-stl-views打印STL容器元素
简介使用gdb调试C++程序时,无法使用命令p 变量名输出STL容器的元素数据。例如有一个std::vector<int> datas变量, 执行p datas,输出如下:(gdb) p datas $2 = { <std::_Vector_base<int, std::allocator<int> >> = { _M_impl = { <std::allocator<int>> = {原创 2022-03-24 16:54:16 · 4444 阅读 · 0 评论 -
Linux下编译hiredis
下载工程地址为https://github.com/redis/hiredis/。以hiredis 1.0.0为例:下载地址为v1.0.0。下载后的文件为hiredis-1.0.0.tar.gz。编译与安装步骤如下:tar -zxvf hiredis-1.0.0.tar.gzcd hiredis-1.0.0cmake .cmake --build .(也可以使用make)make install PREFIX=安装目录编译安装完成后,将安装目录下的include文件原创 2022-01-24 13:47:40 · 1775 阅读 · 0 评论 -
__VA_ARGS__和##__VA_ARGS__的区别(转载)
参考链接: #、##、__VA_ARGS__和##__VA_ARGS__的作用 linux中的 VA_ARGS 宏说明 最近看到linux的一段代码,对__VA_ARGS__和##__VA_ARGS__有点疑惑,所以在网上查了一下。 linux源码如下,函数功能就不废话了: #define module_driver(__driver, __register, __unregister, ...) \static int __init __driver##_init(void) \{ \转载 2021-11-26 09:29:00 · 499 阅读 · 0 评论 -
gflags的使用(转载)
google开源的gflags是一套命令行参数解析工具,比getopt功能更强大,使用起来更加方便,gflags还支持从环境变量、配置文件读取参数(可用gflags代替配置文件)。本文简单介绍gflags的使用,内容主要译自 http://gflags.googlecode.com/svn/trunk/doc/gflags.html 。 定义参数 ...转载 2021-11-23 15:35:11 · 1320 阅读 · 0 评论 -
C++ #include头文件随想
现象在使用boost时,#include文件的方式如下[#include带路径方式]:#include <boost/property_tree/json_parser.hpp>#include <boost/property_tree/ptree.hpp>#include <boost/timer/timer.hpp>#include <boost/pool/object_pool.hpp>假定boost文件夹位于XXX/include目录下,原创 2021-07-22 11:25:40 · 577 阅读 · 0 评论 -
内存泄漏分析工具tMemoryMonitor(转载)
【引言】今天给大家介绍一款腾讯自主研发,荣获2015年十佳组件第一名的“tMemoryMonitor”内存泄漏分析工具。该腾讯内部工具已经在腾讯WeTest官网内开放给用户使用,助您在工作中扫除内存泄露问题,让工作精益求精。链接:wetest.qq.com工具使用入口【工具简介】tMemoryMonitor简称TMM,是一款运行时C/C++内存泄漏检测工具。TMM认为在进程退出时,内存中没有被释放且没有指针指向的无主内存块即为内存泄漏,并进而引入垃圾回收机制,在进程退出时检测出堆内存中所有没有被引用的内存单转载 2021-07-08 13:17:21 · 512 阅读 · 0 评论 -
#pragma的常用方法讲解(转载)
概述 我们在写代码时,总会遇到头文件多次包含的情况,刚开始时我们使用宏定义进行控制,之后发现有#pragma once这样简单的东西,当时是很兴奋,以为#pragma就这一种用法。唉~,现在想想当时还是年轻啊,不过还是年轻好啊。 1、什么是预处理 预处理是将源文件的文本作为翻译的第一阶段操作的文本处理步骤。 预处理不会分析源文本,但会为了查找宏调用而将源文本细分为标记。 主要包括了下面三个方面: 预处理指令预处理运算符预定义宏,这个有很多了,比如__FILE__、__LINE__和__DATA__.转载 2021-07-08 12:50:27 · 510 阅读 · 0 评论 -
C++ minidump类
奉行拿来主义,直接在github找了一个:kingsunc/MiniDump。查看dmp文件一直都直接用VisualStudio直接打开;据说用WinDbg效果会更好!对于一些使用VisualStudio无法找到奔溃点的情况使用WinDbg也许就能解决。...原创 2021-07-08 10:38:38 · 397 阅读 · 0 评论 -
C++11 线程对象创建后既不join()也不detach()的后果
C++11中,线程对象(std::thread)创建后,有两种状态:joinablenonjoinable那么分别在什么情况下位于上面两种状态呢?线程对象通过默认构造函数构造时线程状态为nonjoinable;线程对象通过有参构造函数创建时状态为joinable。joinable状态的线程被调用join()或者detach()会变成nonjoinable状态。线程对象析构时,会判断线程的状态。如果线程处于nonjoinable状态时,会调用**terminate()**函数直接令程序退出。原创 2021-07-07 16:06:45 · 2970 阅读 · 4 评论 -
sleep实现原理(转载)
两个问题假设现在是 20018-12-03 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 20018-12-03 12:00:01.000 的时候,这个线程会不会被唤醒?某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0) 。既然是 Sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么?对于第一个问题,答案是:不一定。因为你只是告诉操作系统:在未来的1000毫秒内我不想再参与到CPU竞争。那么1000毫秒过去之后,这时候也许另外一个线程正在转载 2021-06-29 09:46:43 · 2111 阅读 · 0 评论 -
C++ Windows时间函数 QueryPerformanceCounter()与QueryPerformanceFrequency()
介绍供WIN9X使用的高精度定时器:QueryPerformanceFrequency()和QueryPerformanceCounter(),要求计算机从硬件上支持高精度定时器。头文件为 windows.h头。函数的原形是:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency); // 获取时钟频率BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount); // 获取时钟计数值数据类原创 2021-06-28 16:27:32 · 5548 阅读 · 0 评论 -
C++ 实现反射机制(转载)
版权声明:本文为CSDN博主「YzlCoder」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/y1196645376/article/details/51455273前言JAVA有着一个非常突出的动态相关机制Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括metho转载 2021-06-23 13:59:01 · 3201 阅读 · 0 评论 -
Windows.h下CONTAINING_RECORD宏解析(转载)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/f_r_e_e_x/article/details/49274299CONTAINING_RECORD宏的作用就是根据结构体,类型和结构体中成员变量地址和名称则可求出该变量所在结构体的指针。假设我们知道ABCD结构体中b的地址和名称求整个b所在结构体ABCD的指针。#include <Windows.h>#include <转载 2021-06-17 10:26:25 · 643 阅读 · 0 评论 -
完成端口(IOCP)详解[2/2](转载)
版权声明:本文为CSDN博主「PiggyXP」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/piggyxp/article/details/6922277五 使用完成端口的基本流程说了这么多的废话,大家都等不及了吧,我们终于到了具体编码的时候了。使用完成端口,说难也难,但是说简单,其实也简单 ---- 又说了一句废话=。=大体上来讲,使用完成端口只用遵循如下几个步骤:1 调用 CreateIoComplet转载 2021-06-16 19:10:04 · 1848 阅读 · 0 评论 -
完成端口(IOCP)详解[1/2](转载)
版权声明:本文为CSDN博主「PiggyXP」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/piggyxp/article/details/6922277一 前言本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中……酝酿了两年之后,终于决定开始动笔了,但愿还不算晚……这篇文档我非常详细并且图文并茂的介绍了关于网络编程模型中完成端口的方方面面的信息,从转载 2021-06-16 18:37:28 · 765 阅读 · 0 评论 -
leveldb Arena分析(转载)
版权声明:本文为 cheng-zhi 原创文章,可以随意转载,但必须在明确位置注明出处!Arena简介Arena 是 leveldb 项目里面使用的轻量级的内存池对象,leveldb 用这个对象来管理内存的分配,简化了 new 和 delete 的调用,我们也可以从这个轻量级的内存池对象学习 google 大神工程师是如何管理内存的。内存管理模型这是罗道文网站上关于 leveldb 的一张 Arena 的内存模型图:Arena 使用下面几个成员变量来描述上面的模型图// 当前内存块未分.转载 2021-06-15 17:50:15 · 797 阅读 · 0 评论 -
C++ 前向声明(转载)
在C++中有一种使用其他类的方式:前向声明。这个的用法和**#include**一个头文件的方式很像,但是两者的使用有很大的区别。与#include的区别前向声明指在A程序中引入新的类型B,但是B并不是一个完整清晰的类,因为我们只知道只是一个B类,但是我们不清楚它的具体函数接口实现以及成员变量;不能定义一个B的类型,只能使用指针和引用的方式;直到后面找到B的定义我们才真正直到B的具体实现,才可以调用它的实现方式;如果直接在程序中#include则可以直接定义这个类。使用场景看起来好像直接添加头文件的转载 2021-06-10 09:43:08 · 1655 阅读 · 0 评论 -
LW_OOPC介绍(转载)
摘要本文介绍一种轻量级的面向对象的C语言编程框架: LW_OOPC. LW_OOPC是Light-Weight Object-Oriented Programming in(with) C的缩写, 总共一个.h文件, 20个宏, 约130行代码, 非常的轻量级, 但却很好的支持了很多面向对象的特性, 比如继承, 多态. 可以优美的实现面向接口编程. 这个框架是由台湾的高焕堂先生以及他的MISOO团队首创, 之后由我继续改进优化, 最后, 经高焕堂同意以LGPL协议开源(开源网址参见后文).用C语言实现O转载 2021-06-09 20:05:29 · 1607 阅读 · 0 评论 -
C++ 柔性数组(转载)
1 引言 定长数组包 在平时的开发中,缓冲区数据收发时,如果采用缓冲区定长包,假定大小是 1k,MAX_LENGTH 为 1024。结构体如下:// 定长缓冲区struct max_buffer{ int len; char data[MAX_LENGTH];}; 数据结构的大小 >= sizeof(int) + sizeof(char) * MAX_LENGTH为了防止数据溢出的情况,data 的长度一般会设置得足够大,但也正是因为这样,才会导致数组的冗余.转载 2021-06-09 18:00:39 · 1552 阅读 · 0 评论 -
C++11 实现defer功能(转载)
说明使用过swift开发过iOS应用的广大搬砖工都知道, 在swift语言里, 有一个很好用的关键字 defer,这个defer有什么用呢?在某个函数或者代码块中, 如果使用了defer 添加了一段代码, 会发生什么呢?哈哈, 当然是 在代码块结束时, 一定会调用这段代码了。这样有什么好处呢?我们知道, 有些操作需要很多步骤,其中一步出错,就可能需要是整个操作流程结束, 但是结束之前那些已经申请的资源怎么办呢? 如果不处理肯定会出现资源泄露的啊。这是defer就派上用场了,使用defer 之后,转载 2021-06-09 16:00:11 · 1681 阅读 · 0 评论 -
SetConsoleTextAttribute 设置Windows控制台字体背景颜色(转载)
简介SetConsoleTextAttribute是Windows系统中一个可以设置控制台窗口字体颜色和背景色的计算机函数,该函数被广泛应用于软件开发中。使用此函数前,必须包含Windows.h头文件,即#include 。函数介绍原型BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);参数1 hConsoleOutput是设备句柄,由函数GetStdHandle(nStdHandle)返回。GetStd转载 2021-06-08 10:52:58 · 1365 阅读 · 0 评论 -
如何基于protobuf实现一个极简版的RPC(转载)
基于 protobuf 的 RPC 可以说是五花八门,其中不乏非常优秀的代码例如 brpc, muduo-rpc 等。protobuf 实现了序列化部分,并且预留了 RPC 接口,但是没有实现网络交互的部分。本文想介绍下,如何实现基于 protobuf 实现一个极简版的 RPC ,这样有助于我们阅读 RPC 源码。一次完整的 RPC 通信实际上是有三部分代码共同完成:protobuf 自动生成的代码RPC 框架用户填充代码本文假设用户熟悉 protobuf 并且有 RPC 框架的使用经验。转载 2021-06-07 09:37:29 · 1733 阅读 · 0 评论 -
C++ 线程基类
这里简单实现了一个线程基类,其中未包括线程关闭的方法,等待后续添加。XThread.h#pragma once#include <thread>class XThread{public: XThread() = default; virtual ~XThread() = default;public: virtual void Run() = 0; // 必须被子类实现,本身不能被实例化public: void Start(); // 线程启动函数privat原创 2021-06-05 11:21:41 · 1433 阅读 · 0 评论 -
C++ 日志框架总结
这么多年自己还真没怎么写过日志框架,都是用的第三方库,用过Log4Cpp、spdlog、muduo中的日志部分。想自己总结下,又发现了一篇分析极为到位的C++日志框架总结:一文详解C++日志框架,遂放弃自己动手的想法,奉行拿来主义。CSDN地址为https://blog.csdn.net/liang19890820/article/details/109153251。wexin公众号地址为:https://mp.weixin.qq.com/s/92JNr29Px0TORsJqh3KjmQ。...原创 2021-06-04 09:42:07 · 1969 阅读 · 0 评论 -
extern C的思考
背景C语言和C++有着千丝万缕的联系,C++的另外一个名称是C With Class。同时差异也是有的。C语言不支持重载函数,是因为C语言编译器编译出来的函数在符号表中的标识符即为函数名本身(这里以VisualStudio2015为例),支持重载函数意味着它们在符号表中的标识符是一样的,也就无法对他们进行区分。C++支持重载函数,是因为C++编译器编译出来的函数在符号表中的标识符包含了参数的信息。我们支持重载函数本来就是靠参数的不同来区分不同的函数,所以包括参数信息的标识符也就可以被分区开了。担忧原创 2021-06-02 17:33:07 · 1274 阅读 · 0 评论 -
C++游戏服务器开发常用工具介绍(转载)
C++游戏服务器开发常用工具介绍 在软件开发过程中需要使用的工具类型实属众多,从需求建模到软件测试,从代码编译到工程管理,这些工具都对项目有着不可替代的作用。庄子有云,“吾生也有涯,而知也无涯,以有涯随无涯,殆已”。代入到项目开发中就是说,如果对知识点无差别的全面攻击,不仅会导致所学甚泛却无一深入的尴尬,也会占用太多的有效时间从而影响项目进度。作为一个C++游戏服务器开发者来说,我们时刻肩负着线上游戏开发和维护任务,可以优先学习对自己工作最常用且最重要的,解决实际问题最为紧迫。本文对一些常用工具给出转载 2021-05-19 23:40:56 · 1699 阅读 · 0 评论 -
Qt初学者的一些学习方法、参考资料
1,简介最近有一些朋友加我,询问Qt入门学习的方法、资料我基本都一一作答,根据情况给出了一些参考意见感觉很多新手开始学习时很迷茫,不知道学习哪些方面、看什么资料这里干脆写一篇文章,把自己的学习过程给大家介绍一下,包括一些对于学习的想法2,开始熟悉Qt如果你是完完全全的新手,刚开始学习Qt,那么推荐你先看一下我关于Qt的一篇入门介绍的PPT,里面简单介绍了Qt是什么、发展历史和现状、Qt适合做什么、一些使用Qt开发的案例。还有Qt主要包含哪些知识点,以及推荐了一些学习的资料、博客、社区。能让转载 2020-05-31 15:41:14 · 2096 阅读 · 0 评论 -
Qt VS中设置.ui文件的生成的.h的目录
在解决方案资源管理器中,右键.ui文件,单击属性,打开属性页:选择uic, 在Output Directory中设置生成的.h文件的目录。原创 2020-05-31 11:31:36 · 3418 阅读 · 0 评论 -
printf() 输出控制符
转载 2020-06-24 19:39:03 · 1843 阅读 · 0 评论 -
C 标准库中输出到字符串、到文件的相关函数
输出到标准输出int printf(const char* format, ...)发送格式化输出到标准输出stdout。如果成功,则返回写入的字符串数,否则返回一个负数。int vprintf(const char* format, va_list arg)使用参数列表发送格式化输出到标准输出 stdout。如果成功,则返回写入的字符总数,否则返回一个负数。输出到流streami...原创 2020-03-18 13:48:48 · 1633 阅读 · 0 评论 -
正确使用 realloc()
众所周知,realloc() 的作用就是将已经 malloc 的内存块,重新扩展加长。当你并没有使用高端的内存池的时候,临时从堆中申请加大内存,这是很有用的。但是如何正确地使用 realloc() 呢?调用方法函数原型#include <stdlib.h>void *realloc(void *ptr, size_t size);传入参数1 需要被扩展大小的内存指针2 扩...转载 2020-02-13 00:10:59 · 2544 阅读 · 0 评论 -
malloc、calloc、realloc的区别
mallocmalloc分配的内存是位于堆中的,并且没有初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部分的内存空间。函数原型void *malloc(unsigned int size)功能用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,且分配的大...转载 2020-02-12 23:54:30 · 1333 阅读 · 0 评论 -
C语言 "#"和"##"的用法
1. 前言使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.2. 一般用法#include<cstdio>#include<climits>using namespace std;#define STR(s) #s#define CONS(a,b) int(a##e##b)int main(){ printf(STR(vck));...转载 2019-12-04 18:53:38 · 1304 阅读 · 0 评论 -
getUpdateCount成员函数不能返回正确数量
关于这个问题,在stackoverflow上看到了一段解释,跳转说函数getUpdateCount的实现为:uint64_t MySQL_Prepared_Statement::getUpdateCount(){ checkClosed(); throw MethodNotImplementedException("MySQL_Prepared_Statement::getUpdat...原创 2019-09-19 18:47:53 · 1057 阅读 · 0 评论 -
jdbc中excute,excuteUpdate,excuteQuery函数解释
executeQuery(String sql) 执行select语句,它返回的是查询后得到记录集(resultset)。 executeUpdate(String sql) 执行update,insert,delete语句,它返回的是语句执行后说影响到的记录条数...转载 2019-09-19 10:19:40 · 1598 阅读 · 0 评论 -
使用getString成员函数获取表字段数据出错
MySQL Connector++ 使用getString获取表字段数据出错 sunnyu 2016-12-08 91 阅读C/C++MySQL Linux下一个使用MySQL Connector++ 1.1.0 连接MySQL数据库的程序,在连接数据库获取数据时程序崩溃, 确定数据库中存在记录值,查看Core Dump文件,发现崩溃点发生在调用 M...转载 2019-09-18 14:47:55 · 979 阅读 · 0 评论 -
使用Connector/C++操作MySQL
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...转载 2019-09-18 14:46:04 · 2375 阅读 · 0 评论