- 博客(708)
- 收藏
- 关注
原创 C++(23):利用this参数实现lambda的递归调用
相当于重载了其operator运算符,加入了this参数,因此我们可以利用其完成递归调用。可以大致认为lambdaAdd与DoAdd的实现类似,只不过lambda是一个匿名类。所以实际上lambda也是一个类型,并且有其成员函数operator。因此可以利用this实现lambda的递归调用。
2026-01-02 14:27:24
90
原创 VSCode:编译C/C++多文件程序
2.将之前的${fileDirname}\\${fileBasenameNoExtension}.exe修改为${fileDirname}\\test.exe。基于之前的单文件程序,我们可以进行小的修改,从而完成多文件程序的编译。可以看到终端上输出了:Hello new World!也是跟之前已经得,只要设置好断点,就可以进行单步调试了。1.将之前的"${file}"修改为"*.cpp"1.修改.vscode/task.json。2.修改程序为多文件。方法跟之前是一样的,
2026-01-02 09:07:42
151
原创 VSCode:自动保存文件
3.设置Files:Auto Save为onFocusChange。VSCode可以设置文件离开焦点后自动保存文件。2.在设置的搜素里输入auto save。
2026-01-01 12:54:50
154
原创 VSCode:编译C/C++单文件程序
vscode会自动生成一个.vscode目录,目录中有一个文件task.json。然后选择第一个C/C++:gcc.exe 构建和调试活动文件...如果编译有错误,只需参考上面的task.json即可。并且在当前目录下生成了一个文件m.exe。单击代码要设置断点的地方。点击调试C/C++文件。
2026-01-01 10:36:23
123
原创 Win11:彻底卸载VSCode
C:\Users\<用户名>\AppData\Roaming\Code。C:\Users\<用户名>\.vscode。
2025-12-28 21:11:30
87
原创 Win11:安装gcc/g++编译器
本文介绍了在Windows系统上安装MinGW-W64编译器的完整步骤。首先从WinLibs官网下载UCRT runtime版本的15.2.0/13.0.0工具链,解压至C:\mingw64目录。然后通过系统属性设置环境变量,将C:\mingw64\bin添加到Path变量中。最后通过命令行测试gcc和g++命令验证安装成功,输出信息显示已正确安装15.2.0版本的MinGW-W64编译器(x86_64-ucrt-posix-seh版本)。整个过程包含了下载、解压、环境变量配置和验证等关键步骤。
2025-12-22 09:30:04
25
原创 C++:function_traits统一抽取和描述可调用对象的类型信息
的意思是,当某个类型存在T::operator()时,该类型继承于上面已经定义了的function_traits<decltype(&T::operator())>类型。而ft7的输出表明,对于使用auto参数的泛型lambda,是没有可以取到地址的operator(),这是因为其内部的operator()其实是一个模版函数。另外可以看到的是,普通的lambda其实是内部实现了一个const类型的operator()其实是要求该类型的operator()可以取到地址,也就是说存在T::operator()
2025-12-03 22:27:50
48
原创 Docker:搭建Sdbusplus库开发环境4 导出/导入image
Docker生成好的image经常要拷贝到别的机器上使用,可以使用如下的方法导出/导入。ubuntu_user.tar:导出后生成的文件。ubuntu:user:要导出的image。
2025-12-01 21:58:03
35
原创 Docker:搭建Sdbusplus库开发环境4 编译脚本
该脚本使用ubuntu:user,并指定了当前宿主机的用户为docker容器的用户,进行程序编译。可以看到程序被正确的编译在了build_container目录,并且是可执行的。可以看到我在目录list_user中有一个程序文件list_user.cpp。在这个文件里,我添加了对sdbusplus和systemd库的依赖。编译环境已经搭建好了,下一步就是用编译环境编译本地的程序。至此,我们的sdbusplus库的编译环境就搭建好了。1.本地程序目录list_user。完成后,查看目录list_user。
2025-11-29 10:14:33
374
原创 C++:实现一个通用的线程池
6.任务保存在tasks.emplace([task]() { (*task)();}这个lambda。3.submit的精髓是将函数和参数绑定后,完成其调用,就不再需要参数,因此就可以将其封入一个void()类型的lambda,这样就可以将这个统一形式的lambda保存到std::queue<std::function<void()>> tasks;2.submit函数用于向线程池派发任务,可以看到R是函数的返回类型,而task是将函数与参数绑定后的packaged_task对象。
2025-11-28 21:27:55
173
原创 C++:实现一个通用的类,封装各种函数,保存到vector中
注:这种方式只能保存函数参数快照,也就是在生成AnyCallable对象时,函数的参数也随之绑定了,不能动态的修改,如果是动态参数需要后续再生成AnyCallable对象。1.我们创建了一个funTrans函数,用于把函数的静态信息,比如调用参数和返回值类型保存到一个AnyCallable对象中。4.在需要的时候从vector中取出AnyCallable对象,调用其接口完成函数的调用,获取返回值。5.AnyCallable类提供了两种获取返回值的方式,一种是通过函数的返回值,另一种是通过传递参数。
2025-11-28 15:18:53
227
原创 Docker:搭建Sdbusplus库开发环境3 设置登录用户
容器是root身份登录的,但是有的时候,我们需要以不同的用户身份进行登录,以设置文件的归属者。可以看到当指定了用户名后,容器也将登录用户切换到了指定的用户。可以看到按照指定的用户名,用户id,组id创建了登录用户。1.新建目录build_user,并进入目录。2.在目录中新建文件Dockerfile。
2025-11-25 21:39:30
66
原创 Ubuntu(25.04):开机后小键盘数字锁定键默认关闭
lrwxrwxrwx 1 root root 32 10月 18 09:09 /etc/systemd/system/display-manager.service -> /lib/systemd/system/gdm3.service。虚拟机里按照的Ubuntu-25.04,然后每次打开后由于跟Win11的numlock初始状态不一样,所以总是来回的提示numlock开启/关闭。可以看到我的是gdm3,也就是GNOME。表示当前numlock是开启的。1.先确定登录界面程序。即可关闭numlock。
2025-11-25 09:51:19
97
原创 Docker:搭建Sdbusplus库开发环境2 编译Sdbusplus库
2.5在正式的image中,我们安装必要的工具(预build中安装的工具不会被自动带过来),然后把预build中编译好的sdbusplus库拷贝进来。我们在容器中安装了gcc和g++等基本的工具,这只是第一步,我们知道docker是一层一层添加的,下面我们添加Sdbusplus库到docker中。2.1我们以ubuntu:gcc为基础,先做个预builder,在这个里面我们安装编译Sdbusplus需要的库以及python组件。可以看到已经可以成功的编译使用Sdbusplus库的程序了。
2025-11-24 22:27:04
237
原创 Docker:搭建Sdbusplus库开发环境1 安装gcc g++
有时我们需要自己建一个docker image,用于安装开发环境,这样项目可以统一使用一套开发环境,不需要每个人都来搭一套。1.我们先从docker hub上拉下来基本的ubuntu24.04。我们来尝试搭一个可以使用Sdbusplus做为库的编译环境。可以看到容器正确的安装了gcc和g++可以看到了生成ubuntu:gcc。3.启动容器,查看gcc和g++2.创建Dockerfile。
2025-11-24 21:47:55
233
原创 OpenBMC:BmcWeb建立浏览器侧VM通道
可以看到afterGetSocket主要就是读取属性endpointId和socket,然后创建一个NbdProxyServer对象,该对象的构造函数创建了一个acceptor用于作为unix socket的server端运行,等待vm的service来连接,peerSocket用于与作为client的vm service进行通信。也就是通过建立了一个web socket连接了浏览器,然后又建立了一个unix socket连接vm service。从unix socket读取数据。
2025-11-19 11:16:12
58
原创 OpenBMC: BmcWeb建立KVM通道
BmcWeb需要做的是建立一个通道,一端通过web socket连接浏览器,一端通过tcp连接VNC server,然后将双方的数据转发即可。经过这种转发,就将web前端的web socket请求转换为了对vnc server的tcp请求,从而实现了通过前端的NoVNC对vnc server的连接,实现了KVM。doRead用于从vnc server读取数据,然后再将读到的数据原封不动的通过web socket发送出去。从web socket读到的数据放入inputBuffer中,然后调用doWrite。
2025-11-18 14:45:29
174
原创 OpenBMC: BmcWeb处理WebScoket4 start
可以看到start函数注册了acceptDone,而acceptDone又调用了doRead,进而调用了handleMessage,然后通过messageHandler调用了用户提供的回调。WebSocketRule::handleUpgrade在创建了ConnectionImpl对象后,会调用start函数。
2025-11-18 13:47:38
30
原创 Linux开发:readlink命令读取软连接指向的文件
Linux提供了命令readlink也可以完成读取软链接所指向的路径。可以编程读取软连接指向的文件的路径。
2025-11-07 21:25:11
62
原创 C++(23):延长for循环临时变量生命期
编译程序:g++ -O0 -g -fsanitize=address,undefined -fno-omit-frame-pointer -o m m.cpp --std=c++20。编译程序:g++ -O0 -g -fsanitize=address,undefined -fno-omit-frame-pointer -o m m.cpp --std=c++23。循环冒号以后的初始化器部分中,除了函数传参以外的所有生成的临时对象生命期都被自动延长到循环结束之后。可以看到产生了悬挂引用。
2025-10-31 23:19:53
79
原创 C++:通过const T&延长临时对象的生命期
1)如果实参是一个存活足够久的 lvalue(命名的 std::string 或 static 对象),返回的引用是安全的。所以不要以为“只要有引用就延长寿命,其实只有直接用临时初始化命名引用变量(或绑定到临时的子对象)时会延长。2)如果实参是一个临时(prvalue),那么返回的引用会悬垂(未定义行为)根据 C++ 的寿命延长规则,这种通过函数返回的对临时子对象的引用。因此,按照延长寿命规则,那个用于初始化引用的临时。时,该临时对象的寿命会被延长到引用变量的寿命结束。绑定的是第 2 个临时(返回的。
2025-10-31 17:08:10
81
原创 C++(23):通过print和printIn进行输出
说实话也许是习惯了C语言的printf输出,所以使用cout进行输出其实体验并不觉得怎么好,也许是每次都要<<输出时,需要多写一个字符吧。也许是听到了一些程序员的心声,C++23增加通过print和printIn进行输出。std::println:行为与 std::print 相同,但在输出后。适合需要在同一行多次输出或精确控制换行位置的场景。std::print:按给定的格式把内容写出,但。方便用于“输出一整行”的场景。
2025-10-27 22:23:20
122
原创 C++(23):lambda可以模版参数
可以看到f1和f2的输出是一样的,那么在lambda中使用模版有什么意义呢,我觉得最为主要的是可以约束参数a和b是同一类型的。可以看到如果传递不同类型的参数,使用模版的lambda会编译报错的,但是使用auto的lambda不会。可以看到f1使用了模版参数。
2025-10-23 21:45:20
38
原创 C++(23):contains检查字符串是否包含子字符串
运行输出:Hello, World!编译:g++ -o m m.cpp -std=c++23。
2025-10-22 23:11:11
55
原创 C++(23):定义类的静态运算符函数
C++23,可以定义类的静态运算符函数,从而直接使用直接进行调用。编译:g++ -o m m.cpp -std=c++23。
2025-10-21 22:18:21
38
原创 OpenBMC: BmcWeb处理WebScoket3 对象初始化
也就是说在定义路由时提供的回调句柄,被传入了WebSocketRule对象,而这个WebSocketRule对象又用于构造ConnectionImpl,最终将其传递到ConnectionImpl中。可以看到先创建了一个WebSocketRule对象,然后该函数返回了这个对象,而WebSocketRule对象提供了onopen等函数用于设置句柄。这个构造函数传递了很多句柄,比如openHandlerIn,messageHandlerIn等待,这些句柄是如何获得的呢?
2025-10-21 14:51:43
269
原创 OpenBMC: BmcWeb处理WebScoket2 产生WebSocket对象
介绍了当有WebScoket请求后,会调用handler->handleUpgrade来处理。所以handler->handleUpgrade调用的是App::handleUpgrade。介绍了,Connection在构造的时候,传入的handlerIn是指向App的指针。可以看到是创建了ConnectionImpl类型的对象,然后其start函数。就是寻找匹配的路由,然后调用validatePrivilege。最终调用的是rule.handleUpgrade。validatePrivilege可以参考。
2025-10-20 20:32:02
195
原创 OpenBMC: BmcWeb处理WebScoket1 判断是否为WebSocket
HTTP Upgrade 是一个 HTTP/1.1 机制,允许客户端在初始的 HTTP 请求/响应后,把同一个 TCP 连接从一个协议切换到另一个协议(例如从 HTTP/1.1 切换到 WebSocket 或 h2c)。doUpgrade会判断是否为websocket,如果是就会返回true,也就是上面的handle会提前完成处理返回,不会调用后面的handler->handle(req, asyncResp);然后返回true,而由于返回了true,所以handle函数会直接返回。
2025-10-20 14:33:23
201
原创 C++(11):lambda函数是const函数
默认情况下,lambda 的 operator() 是 const 成员函数,意味着在 lambda 体内不能修改通过值捕获的捕获变量。因此如果想要修改捕获的变量,需要使用mutable。如果不使用mutable,则会编译报错。
2025-10-18 21:03:29
65
原创 Typescript:log模块
浏览器调试窗口,控制台中输入:setLogLevel(LogLevel.Error)1.对于Vue3项目,将该文件导入到main.ts。
2025-09-17 10:13:24
258
原创 Python3:使用venv虚拟环境
在我们开发Python项目的时候,有的时候会存在多个项目并存的情况,这时不同的项目可能会使用同一个包,但是却要用不同的版本,如果将包安装在Python3的。针对这种情况,python提供了虚拟环境,使得每个应用可能需要各自拥有一套“独立”的Python运行环境。进入到python的项目目录,可以通过如下方式创建 venv虚拟环境。完成后,项目目录中会创建一个.venv目录。目录下,那么这个问题就很难解决。这就是venv提供的功能。2.创建venv虚拟环境。4.虚拟环境下安装包。
2025-08-13 16:19:00
562
原创 MCP:UVX的安装
使用MCP server离不开uv(类似于pip这样的包管理工具),那么Windows下如何安装uv呢?那么说明uv已经成功的安装了。1.首先打开命令行窗口。等待命令执行完毕即可。
2025-07-23 23:30:17
1323
原创 MCP:Cline+DeepSeek在VSCode上配置
3.2在API Provider中选择DeepSeek,然后在下方输入步骤2.3中获取的API Key, Model选择deepseek-chat就可以,然后点击右上角的Done。需要注意的是这个API Key最好找一个地方保存,因为后续无法在DeepSeek的网页中再次读取到该内容。3.1先点击VSCode左侧工具栏的Cline图标,然后点击右上放的配置图标。2.3点击左侧的API keys,然后点击创建API Key。4.3生成代码,使用Act模式,在输入框内输入你的需求。
2025-07-22 22:52:14
1109
原创 Rust:在Windows上安装
1.首先安装x86_64-pc-windows-msvc。4.推荐安装的VSCode插件。执行安装程序,一路回车就可以。安装时选择 C++ 环境。
2025-06-11 14:17:33
626
原创 nlohmann json:检查类型并取出数据
本文展示了一个使用C++20和nlohmann/json库检查并提取JSON数据的通用方法。核心是parseAndCheckJsonFields模板函数,它接受JSON对象和键列表,检查每个键是否存在且类型匹配(通过checkJsonType函数),并返回包含提取值的元组。示例中解析了包含字符串、整数、自定义结构体、字符串数组和嵌套JSON的数据,展示了类型安全的数据提取过程。代码通过模板元编程和结构化绑定实现了简洁的类型检查和数据访问,编译时需启用C++20支持。
2025-05-21 15:31:22
324
原创 sdbusplus:interface中使用variant类型
Add vv s 1 s 2 vv后需要通过s指定后面的参数1是string类型,然后再通过s指定后面的参数2也是string类型,所以完成的是"1" + "2" = "12"Add vv i 1 i 2 vv后需要通过i指定后面的参数1是int类型,然后再通过i指定后面的参数2也是int类型,所以完成的是1+2=3。可以看到Add的输入参数是两个可变类型vv,返回值也是可变类型v。
2025-05-20 21:08:31
132
原创 GoogleTest:GMock2 EXPECT_CALL
EXPECT_CALL的第二个参数是对象的方法名,可以通过匹配参数器,指定期望传进来的参数,比如上例的EXPECT_CALL(person, setAge(20)),就是代表期望传递进函数setAge的参数是20,当然也可以使用一些预定义的宏,比如Ge,Eq,可以参考。需要说明的是不仅仅可以MOCK_METHOD定义重载的虚函数,普通函数也可以通过MOCK_METHOD定义,比如上面代码中的TEST(PersonMock, setAge20)如果参考可以是任何值,那么可以使用"_",参考setAge18;
2025-05-14 22:24:37
173
原创 GoogleTest:GMock1初识
项目通常是多人并行开发的,有的时候需要使用别人开发的接口,但是在测试的时候却不一定都已经开发完成了,这个时候可以使用GMock进行模拟。3.4通过EXPECT_CALL设置Mock对象的接口行为,比如上面WillRepeatedly表示会一直返回。3.2然后通过MOCK_METHOD0定义一个mock接口函数。3.1需要先通过类继承定义一个Mock类。3.5然后通过EXPECT_EQ完成测试项。3.3在TEST内部定义一个Mock对象。使用gmock需要包含以下头文件。编译gmock需要链接以下库。
2025-05-05 20:49:34
154
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅