C/C++
文章平均质量分 73
C/C++
witton
这个作者很懒,什么都没留下…
展开
-
C语言实现Go的defer功能
之前笔者写了一篇博文,介绍了如何在C++语言中实现Go的defer功能,那在C语言中是否也可以实现这样的功能呢?本文就将介绍一下如何在C语言中实现Go的defer功能。我们还是使用为了实现该功能,需要借助编译器的扩展功能,GCC/Clang的cleanup属性,微软目前的编译器不支持该扩展属性,所以本文介绍的方法不适用于微软编译器。原创 2024-10-26 23:00:03 · 1164 阅读 · 0 评论 -
VSCode+clangd让写C/C++代码更丝滑
使用C/C++写了十几二十年的代码了,这两年做的项目都是使用Go语言来写的代码了,主要使用Goland来写Go,写起来是相当的丝滑,自动提示、补充代码就不说了,很多IDE都有的功能,它还支持自动添加代码import包,提示如何修复错误等等。C/C++也有IDE可以做到了,这一切都要归功于LLVM的优秀设计,让编译器实现模块化,出了clang、clangd、clang-tidy等等优秀的产品,真是C/C++爱好者的福音。原创 2024-03-31 18:32:36 · 4854 阅读 · 5 评论 -
ubuntu使用LLVM官方发布的tar.xz来安装Clang编译器
ubuntu系统上的软件相比CentOS更新还是比较快的,但是还是难免有一些软件更新得不那么快,比如LLVM Clang编译器,目前ubuntu 22.04版本最高还只能安装LLVM 15,而LLVM 18 rc版本都出来了。这样就可以正常使用新版本的clang编译器了,如果还有找不到的文件,也可以通过这样的方式添加路径。来说明如何使用LLVM官方发布的tar.xz文件来安装Clang编译器。原创 2024-02-23 19:04:11 · 1853 阅读 · 0 评论 -
解决ubuntu系统cannot find -lc++abi: No such file or directory
ubuntu本身也可以直接通过apt install命令来安装编译好的clang编译器。不过目前22.04版本下最高可安装版本还是停留在LLVM 15。原创 2024-02-23 18:01:30 · 762 阅读 · 0 评论 -
C++ 20 Module
C++ 20 Module介绍原创 2024-01-23 00:08:13 · 1759 阅读 · 0 评论 -
VSCode使用Makefile Tools插件开发C/C++程序
提起Makefile,可能有人会觉得它已经过时了,毕竟现在有比它更好的工具,比如CMake,XMake,Meson等等,但是在Linux下很多C/C++源码都是直接或者间接使用Makefile文件来编译项目的,可以说Makefile是基石。另外,针对C++ 20的一些特性,像比较流行的CMake工具,目前支持还不完善,如果想要尝鲜C++ 20的一些新特性,比如Module,目前最好是使用Makefile比较方便。,在其后点笔那个的图标按钮,则会弹出所有目标,生成目标如下,选择。在工作区编写一个C++文件,原创 2024-01-18 17:23:20 · 10446 阅读 · 2 评论 -
解决Windows下VSCode控制台乱码问题
我们在Windows使用VSCode编写C/C++程序时,如果代码中的中文字符串使用的是UTF8编码,且代码内没有设置控制台的输出编码,或者编译时没有指定运行时编码(GCC可以在编译时使用。插件,不过该插件是直接使用的Windows的控制台,Windows控制台默认是使用的GBK编码,代码输出UTF8编码的字符串就会出现乱码。clang目前只能是utf-8),则在调试或者运行时,VSCode控制台输出的中文字符可能会为乱码。,这样VSCode中启动的控制台全部会使用UTF8编码输出。原创 2024-01-18 15:36:08 · 2373 阅读 · 0 评论 -
类成员函数大小问题
上周,我一同事,在调试我们项目的时候,发现我写的一段代码中,有一个类成员函数指针数组有大小有点怪异,便叫我过去瞧瞧。有如下一段定义:interface IPLUnknown{ virtual ~IPLUnknown() {}};interface IPLRunnable : public IPLUnknown{ virtual BOOL Init(v原创 2009-11-15 20:56:00 · 1187 阅读 · 1 评论 -
VS2022解决Protobuf compiler version 23.4 doesn‘t match library version 4.23.4
解决VS2022+MinGW+CMake使用Protobuf时,CMake报版本不匹配的问题原创 2023-08-21 14:40:47 · 1109 阅读 · 1 评论 -
解决lldb调试时可能出现的personality set failed: Function not implemented
解决lldb调试时可能出现的personality set failed: Function not implemented原创 2023-08-13 19:47:46 · 1455 阅读 · 0 评论 -
搭建ubuntu容器内C/C++开发调试环境
由于ubuntu容器的C/C++开发调试环境与虚拟机或者实体机的配置有点不一样,所以本文记录一下ubuntu容器的C/C++开发调试环境的搭建。原创 2023-06-05 17:10:30 · 1719 阅读 · 0 评论 -
Visual Studio 2022使用CMake+MinGW+Clang+LLDB作为开发环境
VS 2022使用CMake+MinGW+Clang+LLDB作为开发环境。原创 2023-05-26 16:55:17 · 3975 阅读 · 0 评论 -
Visual Studio 2022 CMake+MinGW+GDB 调试目标程序
Visual Studio 2022 CMake+MinGW+GDB 调试目标程序原创 2023-05-14 23:51:11 · 1388 阅读 · 3 评论 -
CMake自动按目录结构编译Protobuf代码
CMake自动按目录结构编译protobuf代码原创 2023-04-26 17:49:55 · 2254 阅读 · 0 评论 -
使用Glib中测试框架对C代码进行单元测试
在Windows上做开发可能很少甚至没有听过GLib库,但是在Linux下,它却是一个非常重要的库,Linux下的著名桌面GUI GNOME的基石就是它,GNOME是使用GTK开发的,而GTK的底层库就是GLib。,按官网的介绍:GLib是一个通用的,跨平台的实用库,它提供了许多有用的数据结构,宏,类型转换,字符串实用库,文件实用库,一个抽象的主循环等等。它是使用的LGPL许可发布的,可以在Unix、Linux、Windows、MacOS平台上运行。原创 2023-04-21 18:26:27 · 674 阅读 · 0 评论 -
C/C++开发中使用pkg-config来引用依赖库
pkg-config是一个命令行工具,通过它,可以知道库的include路径lib路径以及需要链接的库名,这三样信息是C/C++开发必不可少的信息。其实这些信息都是以文本文件(*.pc)的存放在系统中的,64位Linux一般在,32位Linux一般在,MinGW一般在MinGW安装目录的下。可以看一下MinGW下的Name: GLib可以看到里面有很多信息,但最重要的是在编译链接时所需要的信息Libs和Cflags,它会自动把所依赖的其它库给包含进来,非常省事。原创 2023-04-20 18:49:49 · 1247 阅读 · 2 评论 -
使用CMake的CPack工具打包项目
在实际的开发中,可能会有各种各样的配置文件需要在打包的时候一起发布出去,这里在根目录下创建一个bin目录(将所有项目生成的文件全部指定生成到此目录下的各个项目目录中),下面再创建一个demo目录(根据项目来取名),在demo目录中创建一个config.ini文件。可以在build_CPack_Packages\win64\7Z\demo-0.1.0-win64查看打包的情况,这里有额外的include与lib,并不是想要的,是因为使用的GTest为自行编译的库,如果不想让它们出现在包中,可以。原创 2023-04-18 12:04:50 · 1300 阅读 · 0 评论 -
CMake项目使用ctest+gtest进行单元测试
使用CMake中的ctest进行单元测试原创 2023-04-15 17:12:17 · 4561 阅读 · 0 评论 -
Windows下的高效网络模型IOCP完整示例
IOCP即完成端口(I/O Completion Port),与Linux下的epoll一样,是一种非常高效的网络模型。原创 2023-03-23 14:21:40 · 890 阅读 · 0 评论 -
MiniDump不生成或者生成0字节
通过分析发现是另一个线程在退出时出现了宕机,但是主线程退出时还没来得及调用或者未完全调用完生成MiniDump文件,整个进程就结束了。简单粗暴的方法就是主函数退出前休眠一段时间,让异常处理程序有充分的时间生成MiniDump。今天的MiniDump却不能正常工作,在ExceptionFilter函数中打日志,时而有输出,时而没输出,有输出都是在函数开头的日志有输出,后面的就没输出了。今天在使用C写一个Windows多线程程序时,发现退出过程中有段错误,为了方便快速的定位问题,我使用了MiniDump。原创 2023-03-22 18:30:51 · 1583 阅读 · 4 评论 -
Visual Studio 2022使用MinGW来编译调试C/C++程序
VS 2022使用MinGW来开发C/C++程序原创 2022-08-07 17:23:16 · 14699 阅读 · 22 评论 -
C语言使用MinGW中的GCC生成平面(flat)二进制文件
最近抽空在看自制操作系统相关的书籍,比如《自己动手写操作系统》、《Orange’S:一个操作系统的实现》、《一个64位操作系统的设计与实现》、《30天自制操作系统》等等,只有《30天自制操作系统》是可以完全在Windows下编译、链接、生成镜像的(使用的自制的非标准工具),其它几个全部都是在虚拟机中安装Linux系统,在Windows下编写源码,Linux下进行源码的编译链接,然后生成镜像。这就导致需要在Windows与Linux之间来回切换。笔者尝试改写书中Makefile,用于MinGW环境下完全编译链原创 2022-06-30 18:41:49 · 1228 阅读 · 0 评论 -
Linux下使用CMake构建含nasm汇编的C/C++项目
CMake的出现极大的方便了C/C++项目的编译管理,避免了手工写Makefile的繁琐。如果在C/C++项目中有需要使用到外联汇编语言,CMake也一样可以进行编译管理。在Linux下常用的C/C++编译器为GCC。近些年,随着LLVM项目的发展,Clang也占有了一席之地。但它们在Linux平台下,背后默认的汇编器依然是GAS。GAS使用语法格式为AT&T,与我们平常学习的Intel格式截然不同。它们的差别这里就不赘述了,网络上很多这方面的资料。那我们能不能在Linux平台也使用我们熟悉的In原创 2022-05-29 00:24:09 · 3828 阅读 · 1 评论 -
C++学习资料
本文转自:https://github.com/0voice/cpp_new_features???????????? 2021年最新整理, C++ 学习资料,含C++ 11 / 14 / 17 / 20 / 23 新特性、入门教程、推荐书籍、优质文章、学习笔记、教学视频等???? 直达 (# C++11) (# C++14) (# C++17) (# C++20) (# C++23)???????????? 【重磅推荐收藏:C++ 参考手册】 - 11~20你想要查的,他都有????转载 2021-10-21 10:18:04 · 529 阅读 · 0 评论 -
C++实现Go的defer功能
在Go语言中有一个关键字:defer,它的作用就是延迟执行后面的函数,在资源释放方面特别有用,比如下面一段C/C++的示例代码:void test(){ FILE* fp = fopen("test.txt", "r"); if (nullptr == fp) return; if (...) { fclose(fp); return; } if (...) { fclose(fp); return; } if (...) { fclose(fp); r原创 2021-07-08 18:38:14 · 517 阅读 · 2 评论 -
对C++变长参数中的字符串进行转义
使用过SQL的读者应该都知道SQL存在注入的可能,即没有严格检查用户输入数据的合法性。这里不讨论SQL的注入以及防止注入,只谈一下在C++中对将要执行的SQL中的字符串参数进行转义。最近项目中遇到一个SQL相关的问题,用户在客户端输入了一个字符串数据,这个字符串数据需要保存到数据库,但是恰好有一个用户输入了一个带引号的字符串数据,导致服务器在执行SQL语句进行存储的时候出现语法错误。我们在实际项目中,应该会封装一个函数来对SQL语句进行格式化,比如:string FormatSQL(const cha原创 2021-02-24 16:21:28 · 911 阅读 · 0 评论 -
C++模板类成员函数使用SFINAE特性匹配智能指针
最近在项目中需要一个根据权重来计算随机的功能,为了能共用,写了一个模板类,代码如下:template<typename T>class RandomByWeight{public: RandomByWeight() : m_sum(0) { } void push_back(const T& v) { m_sum += v.GetWeight(); m_vctSum.push_back(m_sum); m_vctData.push_back(v); }原创 2021-02-23 15:01:21 · 506 阅读 · 0 评论 -
使用C++11模板SFINAE特性重写序列化与反序列化
序列化与反序列化在编程中是最常见不过了,项目中原来写的序列化与反序列化是使用的普通类成员函数来写的,每一个数据类型都写了一个operator<<以及operator>>函数,整个代码相当长,而且冗余度高。如果使用C++11的模板来写就会感觉相当简洁。原创 2020-11-10 17:16:18 · 885 阅读 · 0 评论 -
C语言随机数
昨天项目中遇到随机数相关的问题,其实并不是问题,只是没有使用对。项目中使用的自己写的类似C语言的rand()的伪随机函数,但是种子设置有点问题,所以出现了两次战斗有绝大部分相同结果的问题。C语言的rand()函数在使用前需要使用srand()函数来设置随机种子,这样才不会出现相同的随机序列。rand()函数的取值范围为[0,RAND_MAX],Windows下的RAND_MAX为32767。实际应用中,我们可能需要生成范围大于RAND_MAX的随机数,直接使用rand()函数就无能为力了。其实把rand原创 2020-10-21 11:58:01 · 442 阅读 · 0 评论 -
使用VSCode环境编程的一些注意事项
VSCode由于插件众多,支持的语言也非常多,是越来越好用,越来越火。有一款插件叫Code Runner支持VSCode下一键运行各种语言,非常好用,但笔者在使用过程中遇到一些问题,需要修改配置才能正常使用,这里作一个记录:一、Go语言Go语言的包管理是以目录界限的,一个目录中只允许一个包,但允许有多个文件共属这个包。比如Go目录下有两个文件:main.go和util.go,它们的内容如下:main.gopackage mainfunc main() { println("你好,世界!")原创 2020-07-11 20:27:16 · 869 阅读 · 0 评论 -
如何利用VC编写有汇编代码的跨平台代码
在C/C++中添加内联汇编很容易,只需要用__asm(VC中)或者__asm__(gcc/g++中)关键字就可以在C/C++中添加内联汇编了。但是VC中的内联汇编与gcc/g++中的内联汇编在格式不大相径庭,VC中使用的是Intel的语法格式,而gcc/g++使用的是AT&T语法格式。所以我们在编写跨平台的C/C++代码的时候,若有需要用到汇编代码的时候,就显得有点为难了!虽然我们可以编写两个版本原创 2007-05-12 13:39:00 · 2412 阅读 · 0 评论 -
Writing custom visualizers for Visual Studio 2005
Writing custom visualizers for Visual Studio 2005转载 2010-11-05 17:27:00 · 942 阅读 · 0 评论 -
Visual Studio中使用NASM编译汇编文件
NASM相对MASM和GAS而言,是一款比较中庸的汇编器,它语法简洁、功能强大,而且跨平台、免费,是外联汇编的不错选择。 使用Visual Studio开发项目时,如果需要外联NASM汇编,可以使用VS中集成的功能进行设定,让它自动编译相应的汇编文件。在VS2005以前的版本中,可以使用“生成事件”来设置汇编文件的编译工作;在VS2005及以上版本中,可以使用“自定义生成规则”来设定。这原创 2012-07-12 11:00:36 · 5128 阅读 · 0 评论 -
在Visual Studio调试器中显示Unreal的数据类型的值
在Unreal引擎中大量使用了自定义的数据类型如:FName,FString,TArray等等,对于这些自定义的数据类型,我们无法直接查看到这些数据的值,但是我们可以编写VS中的autoexp.dat文件中的脚本,来达到我们需要在调试器中显示的方式。 由于在VS2003中的autoexp.dat脚本不支持表达式,而无法全部满足我们对Unreal引擎中自定义的数据类型的调试显示。经过研原创 2010-10-31 17:07:00 · 2580 阅读 · 0 评论 -
如何在不安装VC2008发布包的情况下,发布VC2008生成的程序
在前面的Blog中有提到,VS2005及以上版本的程序发布与之前版本有一个差别就是清单文件,这个清单文件包含了运行此应用程序所需要的一些文件配置信息,如平台,版本等等,这个清单文件可以内嵌在应用程序中,也可以单独存在。在应用程序运行时就会根据这个清单文件去找相应的依赖文件,默认首先是查找系统目录下的WinSxS目录,如果找不到会在应用程序所在目录去查找。 如果运行程序所在的机器上没有安装原创 2012-08-08 09:54:41 · 1486 阅读 · 0 评论 -
C++安全方便高效地复制对象数组
在C++中,我们经常遇到需要对一个对象数组进行复制,比如下面一个结构:struct STest{ int a; int b; vector vctInt;};我们定义了两个数组:STest A[20];STest B[20];需要将数组A中的所有内容复制到B数组中,通常我们的做法都是这样:for(size_t i = 0; i < AR原创 2013-05-05 21:39:30 · 9471 阅读 · 0 评论 -
自己动手解决HEAP: Free Heap block XXX modified at YYY after it was freed问题
前段时间接手的项目中有出现HEAP: Free Heap block XXX modified at YYY after it was freed问题,作为C/C++程序员,如果代码写得不规范,出现这样的问题就不足为奇了。出现这样问题的根本原因就是野指针,即:对已经释放了的内存进行写操作。如:int* p = new int;int* pp = p;delete p;*pp = 1原创 2013-05-10 16:56:38 · 7571 阅读 · 7 评论 -
在VisualGDB中配置预编译头加快编译速度
VS对C++的支持相较GCC太弱了,连续几个VS版本对C++的改进都很小、很少。对Cpper也许是一种痛,我们也许希望能使用VS的强大编辑功能,组合GCC以及GDB的强大编译器以及调试功能进行开发。自从有了VisualGDB,这一切都变成真的了,那VS默认会有预编译头,GCC呢?VisualGDB呢?我们只能手动去写Makefile,不错,手动去写,下面就与大家分享VisualGDB中的预编译头设置。原创 2016-09-16 00:20:10 · 2281 阅读 · 1 评论 -
C/C++通用Makefile
最近的项目又回到了Linux上运行,这就需要在Linux下编译项目,写Makefile针对习惯了Windows的程序员来说是一件痛苦的事,如果有一个通用的Makefile该多好啊,本着这样的目的,我再次研究了一下Makefile,写出了一个实用的通用Makefile,该Makefile在Windows以及Linux平台下作了一些简单测试,未发现问题,如果大家在使用过程中发现有问题可...原创 2017-02-23 14:14:40 · 2094 阅读 · 5 评论 -
麻将和牌算法
麻将牌有1-9万,1-9条,1-9筒,东南西北,中发白各4张,共34种136张牌。有些地方的麻将还有梅兰花竹、春夏秋冬各一张。一般将梅兰花竹、春夏秋冬用作万能牌(赖子牌、混牌)。麻将和牌的算法一般分为直接计算法与查表法两种:直接计算法就是按照和牌的规则进行计算;查表算法就是预先把所有和牌的牌型穷举出来组成一张表,在使用的时候直接查表即可。这两种算法各有优劣:直接计算法占用内存比较小,占用CPU会...原创 2018-11-07 11:59:55 · 9017 阅读 · 0 评论