
C/C++
文章平均质量分 71
C/C++
witton
这个作者很懒,什么都没留下…
展开
-
C++ lambda表达式转成普通的函数指针
C++ lambda表达式,如何转成普通的函数指针进行函数参数传递?原创 2025-01-17 11:51:26 · 902 阅读 · 0 评论 -
SwissTable详解
最近在看到一文说Go 1.24有一项重大的性能改进,就是将默认的Map由原来的拉链式HashTable改为使用开放式的SwissTable,实现了性能的大幅提升。于是就查了一下SwissTable相关资料,它是由Google工程师在开源库absl中实现的一种Hash算法。本文就与大家一起来研究一下它。原创 2025-01-15 13:08:20 · 737 阅读 · 0 评论 -
C语言面的向对象编程(OOP)
如果使用过C++、C#、Java语言,一定知道面向对象编程,这些语言对面向对象编程的支持是语言级别的。C语言在语言级别不支持面向对象,那可以实现面向对象吗?原创 2025-01-02 18:38:04 · 486 阅读 · 0 评论 -
windows下glib库的编译与调试
glib库是一个纯C库,源于GIMP,它是GIMP、GTK/GTK+以及GNOME等的基石库,在Linux下起作举足轻重的作用。对于学习C语言及数据结构,glib库也是一个非常不错的选择。在学习的过程中如果能够调试代码,将会对代码有更直观的理解。原创 2024-12-25 17:01:14 · 1105 阅读 · 0 评论 -
libevent使用IOCP网络模型的示例
这段时间抽空研究了一下强大的网络库libevent,其使用标准C语言编写,支持Windows、Linux、Mac等等主流操作系统,早期版本不支持Windows的IOCP,最新版本已经添加上了,在网上找了一下资料,发现使用IOCP的libevent示例太少,于是结合网上的资料,自己整理编写了一下libevent使用IOCP的小例子。原创 2016-07-01 15:09:59 · 8614 阅读 · 3 评论 -
跨平台宏的写法
(若转载,请注明原出处与作者,作者:Witton) 前段时间在写代码的时候,有一段代码发现用宏比较方便,于是就用宏完成了这段代码,写完之后,看到这段代码是相当的整齐,有一种赏心悦目的感觉。现将之贴出来与大家分享: #define FUNCTION(T,N)\ int GetBase##N##Array()\ {\ return (int)&gCharBaseDat原创 2007-04-30 17:50:00 · 1913 阅读 · 0 评论 -
跨平台函数指针的写法
(若转载,请注明原出处与作者,作者:Witton)前段时间,我在项目中用到了函数指针, 其写法示例如下://Myclass.hclass CMyClass;typedef void (CMyClass:: *MyCALLBACK)();class CMyClass{ MyCALLBACK m_MyHandler[5];protected: v原创 2007-05-11 13:05:00 · 1143 阅读 · 0 评论 -
跨平台UNICODE编程总结
这段时间在架构整个服务器,虽然前段时间受到了5.12汶川8.0级大地震的影响(深切悼念在此次大地震中遇难的同胞们),但是,我的工作还是在不断地向前推进着。为了让我们的服务器能够跨平台(主要是WINDOWS与LINUX),且能支持世界上的各种语言,我写了一个跨平台的且支持UNICODE的库。其实,我在之前也有写过跨平台方面的代码,积累了不少的经验,但在写这个库的过程,还是遇到过许多问题,我觉得其原创 2008-06-16 13:25:00 · 1684 阅读 · 4 评论 -
关于友元函数的跨平台问题
今天我在项目中写了一段代码,这段代码中有两个类A和B,类A中的一个保护成员函数需要访问类B中的私有成员变量,为了简便起见,我将类A中的这个保护成员函数设置成类B的友元函数,在VC下编译通过,没有任何问题。但是在LINUX下编译却出现了错误,说该函数是保护的。在LINUX下我的GCC/G++版本是4.4.1,根据错误提示,我将类A中的那个保护成员函数改为public就OK了。我记得在GC原创 2010-02-03 13:51:00 · 645 阅读 · 0 评论 -
跨平台Unicode编程的一点问题
最近在做一个跨平台的库,想让这个库支持ANSI和UNICODE,但是在LINUX下不像WINDOWS下有那么多UNICODE的函数可供使用,比如fopen在LINUX下并没有像WINDOWS中一样有一个_wfopen,这就需要作另外的处理,这个不是今天想说的问题。 我今天想说的问题是在LINUX下与WINDOWS下都有一个支持UNICODE的函数:wprintf。这个原创 2008-04-24 17:12:00 · 1051 阅读 · 0 评论 -
跨平台模板的写法
(若转载,请注明原出处与作者,作者:Witton) 由于工作的原因,自己写的代码,需要跨平台运行(windows与Linux),但是由于VC编译器与gcc/g++编译器的差别,有的代码,在VC下面编译OK,在Linux下却未必编译得过,下面就是一个典型的例子:请先看一下下面的一段代码是否有问题:#include using namespace std;template原创 2007-04-30 17:10:00 · 1314 阅读 · 0 评论 -
解决Clang 18+不能链接GCC14编译的库的问题
解决Clang18+不能链接GCC编译的库的问题。原创 2024-12-05 10:46:04 · 1105 阅读 · 0 评论 -
MSYS2 MinGW64使用Protobuf新版本踩坑
MSYS2下的MinGW64使用ProtoBuf时遇到的一些问题及解决办法。原创 2024-12-02 11:32:04 · 518 阅读 · 0 评论 -
KMP模式匹配算法
笔者在网上看到一介绍KMP模式匹配算法的博文,讲得比较详细易懂,特转载分享记录一下。转载 2024-11-28 13:31:27 · 80 阅读 · 0 评论 -
C语言实现Go的defer功能
之前笔者写了一篇博文,介绍了如何在C++语言中实现Go的defer功能,那在C语言中是否也可以实现这样的功能呢?本文就将介绍一下如何在C语言中实现Go的defer功能。我们还是使用为了实现该功能,需要借助编译器的扩展功能,GCC/Clang的cleanup属性,微软目前的编译器不支持该扩展属性,所以本文介绍的方法不适用于微软编译器。原创 2024-10-26 23:00:03 · 1268 阅读 · 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 · 7318 阅读 · 6 评论 -
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 · 2494 阅读 · 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 · 938 阅读 · 0 评论 -
C++ 20 Module
C++ 20 Module介绍原创 2024-01-23 00:08:13 · 2183 阅读 · 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 · 13352 阅读 · 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 · 2696 阅读 · 0 评论 -
类成员函数大小问题
上周,我一同事,在调试我们项目的时候,发现我写的一段代码中,有一个类成员函数指针数组有大小有点怪异,便叫我过去瞧瞧。有如下一段定义:interface IPLUnknown{ virtual ~IPLUnknown() {}};interface IPLRunnable : public IPLUnknown{ virtual BOOL Init(v原创 2009-11-15 20:56:00 · 1205 阅读 · 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 · 1314 阅读 · 1 评论 -
解决lldb调试时可能出现的personality set failed: Function not implemented
解决lldb调试时可能出现的personality set failed: Function not implemented原创 2023-08-13 19:47:46 · 1685 阅读 · 0 评论 -
搭建ubuntu容器内C/C++开发调试环境
由于ubuntu容器的C/C++开发调试环境与虚拟机或者实体机的配置有点不一样,所以本文记录一下ubuntu容器的C/C++开发调试环境的搭建。原创 2023-06-05 17:10:30 · 1807 阅读 · 0 评论 -
Visual Studio 2022使用CMake+MinGW+Clang+LLDB作为开发环境
VS 2022使用CMake+MinGW+Clang+LLDB作为开发环境。原创 2023-05-26 16:55:17 · 4461 阅读 · 0 评论 -
Visual Studio 2022 CMake+MinGW+GDB 调试目标程序
Visual Studio 2022 CMake+MinGW+GDB 调试目标程序原创 2023-05-14 23:51:11 · 1634 阅读 · 3 评论 -
CMake自动按目录结构编译Protobuf代码
CMake自动按目录结构编译protobuf代码原创 2023-04-26 17:49:55 · 2550 阅读 · 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 · 719 阅读 · 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 · 1395 阅读 · 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 · 1476 阅读 · 0 评论 -
CMake项目使用ctest+gtest进行单元测试
使用CMake中的ctest进行单元测试原创 2023-04-15 17:12:17 · 5015 阅读 · 0 评论 -
Windows下的高效网络模型IOCP完整示例
IOCP即完成端口(I/O Completion Port),与Linux下的epoll一样,是一种非常高效的网络模型。原创 2023-03-23 14:21:40 · 1076 阅读 · 0 评论 -
MiniDump不生成或者生成0字节
通过分析发现是另一个线程在退出时出现了宕机,但是主线程退出时还没来得及调用或者未完全调用完生成MiniDump文件,整个进程就结束了。简单粗暴的方法就是主函数退出前休眠一段时间,让异常处理程序有充分的时间生成MiniDump。今天的MiniDump却不能正常工作,在ExceptionFilter函数中打日志,时而有输出,时而没输出,有输出都是在函数开头的日志有输出,后面的就没输出了。今天在使用C写一个Windows多线程程序时,发现退出过程中有段错误,为了方便快速的定位问题,我使用了MiniDump。原创 2023-03-22 18:30:51 · 1763 阅读 · 4 评论 -
Visual Studio 2022使用MinGW来编译调试C/C++程序
VS 2022使用MinGW来开发C/C++程序原创 2022-08-07 17:23:16 · 17843 阅读 · 22 评论 -
C语言使用MinGW中的GCC生成平面(flat)二进制文件
最近抽空在看自制操作系统相关的书籍,比如《自己动手写操作系统》、《Orange’S:一个操作系统的实现》、《一个64位操作系统的设计与实现》、《30天自制操作系统》等等,只有《30天自制操作系统》是可以完全在Windows下编译、链接、生成镜像的(使用的自制的非标准工具),其它几个全部都是在虚拟机中安装Linux系统,在Windows下编写源码,Linux下进行源码的编译链接,然后生成镜像。这就导致需要在Windows与Linux之间来回切换。笔者尝试改写书中Makefile,用于MinGW环境下完全编译链原创 2022-06-30 18:41:49 · 1310 阅读 · 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 · 4212 阅读 · 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 · 562 阅读 · 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 · 554 阅读 · 2 评论 -
对C++变长参数中的字符串进行转义
使用过SQL的读者应该都知道SQL存在注入的可能,即没有严格检查用户输入数据的合法性。这里不讨论SQL的注入以及防止注入,只谈一下在C++中对将要执行的SQL中的字符串参数进行转义。最近项目中遇到一个SQL相关的问题,用户在客户端输入了一个字符串数据,这个字符串数据需要保存到数据库,但是恰好有一个用户输入了一个带引号的字符串数据,导致服务器在执行SQL语句进行存储的时候出现语法错误。我们在实际项目中,应该会封装一个函数来对SQL语句进行格式化,比如:string FormatSQL(const cha原创 2021-02-24 16:21:28 · 948 阅读 · 0 评论