- 博客(736)
- 收藏
- 关注
原创 踩坑日记:Windows到Linux代码移植之宽字符窄字符的“相爱相杀”
头文件别漏!:Linux下转换需要<codecvt>,Windows需要,漏了会报“函数未定义”;编码要统一:转换时优先用UTF-8,避免中文/特殊字符路径乱码(Windows默认GBK,转UTF-8才和Linux兼容);别依赖编译器扩展:Windows上能跑的代码,未必符合C++标准,移植到Linux第一步就是“抛弃MSVC的小特权”。最后虽然折腾了小半天,但搞定的那一刻还是爽~也提醒自己,以后写代码尽量别“迁就”某一个编译器的脾气,多写标准C++,采用真正的跨平台标准写法,才是真的省事儿。
2026-01-05 17:27:37
337
原创 踩坑日记:Linux环境变量 | 为何启动服务总要手动加路径?
环境变量是Linux系统中存储系统/程序运行配置信息的“键值对”,本质是内存中的临时数据,供Shell和进程调用。常见的PATHHOME等,都是典型的环境变量。Linux环境变量的核心是“作用域”和“持久化”,本次问题本质是我未将服务依赖路径配置为永久生效的环境变量,而同事已完成配置。掌握环境变量的配置文件、作用域及核心变量用法,不仅能解决服务启动问题,还能应对大部分日常开发的环境配置坑。最后提醒:修改全局配置文件(如)前务必备份,避免配置错误导致系统异常;
2025-12-29 19:46:59
594
原创 踩坑日记:头文件保护宏救不了多重定义!CRC抽离的教训
我当时就懵了:不对啊!我明明加了保护宏,怎么还会重复定义?更诡异的是,我检查了,里面根本没直接包含!第一反应是CMake配错了,或者编译缓存有问题。于是make clean再重新编译,结果还是一样。反复检查保护宏拼写,确认没写错。这就奇怪了——保护宏不是防重复包含的吗?// CRC表(用static限制作用域,只在本文件可见)// ... 其余252个值// 函数实现(整个项目只此一份)if (!i < len;i++) {声明。
2025-12-25 15:57:43
697
原创 C++ Protobuf 赋值全解析:set、add、mutable 到底怎么用?
/ 声明protobuf版本// 订单消息// 订单ID// 商品名// 价格// 用户消息// 单值基本类型(整型)// 单值基本类型(字符串)// 单值基本类型(布尔)// 单值嵌套消息(一对一)// 重复基本类型(数组)// 重复嵌套消息(数组)用 protoc 编译后会生成user.pb.h和user.pb.cc,后续 C++ 代码需要包含这个头文件并链接 Protobuf 库。方法类型方法名示例适用字段类型核心作用setset_id()
2025-12-18 10:31:10
795
原创 踩坑日记:C++ 项目 LNK2019 链接错误排坑,C/C++ 混合编译的名字改编陷阱
LNK2019这类“符号不匹配”错误,在C/C++混合编译场景中非常常见。让C++编译器按C的规则处理C函数符号——要么用extern "C",要么统一编译语言(全C或全C++)。记住这个关键点,下次遇到类似错误就能秒定位了~
2025-12-01 15:33:08
687
原创 动态库导出宏 vs 源码直编:聊聊项目中两种接口复用方式的取舍
想严格控制接口、实现模块独立升级?选动态库导出宏。想快速开发、方便调试或测试内部逻辑?选源码直编。记住,技术选型能解决当前项目痛点、让团队协作更顺畅的方式,就是最合适的方式。
2025-11-11 17:40:33
842
原创 踩坑日记:头文件里少写点 #include 吧,真的能省不少事
头文件保护符或#ifndef):这东西是为了防止同一个头文件被重复包含,跟减少#include不是一回事。就算加了保护符,#include多了照样会让代码膨胀。不完全类型:前向声明后的类属于"不完全类型",只能用来声明指针/引用,不能做其他操作——就像你知道"有个人叫张三",但不知道他身高体重,没法给他做衣服。接口和实现分离:头文件尽量只放类的声明(接口),实现放cpp里。这样头文件里需要的依赖更少,也更容易用前向声明替代#include。不是说#include。
2025-11-10 17:45:10
997
原创 踩坑日记:编译器报一堆“基类未定义”的错
这个问题本质是“复制粘贴后没仔细检查”。头文件保护符虽然简单,但作用关键,每个头文件必须用独一无二的名字(通常建议用“__文件名_H__”的格式,比如ievent.h对应istate.h对应编译器很“死板”,它只认保护符的名字,不认头文件内容。哪怕两个文件毫无关系,只要保护符重名,就可能引发连锁错误。下次再遇到“明明定义了却报未定义”的问题,不妨先检查一下头文件保护符是不是“撞衫”了~
2025-11-10 17:30:46
403
原创 VSCode手动触发CMake配置
但问题来了,有时候新创建了文件,写了新的代码,但是没改 CMakeLists,这时候可能是因为没有自动构建,导致有些代码下面显示红色波浪线,虽然编译没错,但是强迫症表示及其难受,其实这个问题可以重新跑一遍配置解决,但是不知道为啥有时候不自动触发。今天Coding中发现个挺有意思的事儿 —— 每次我改完 CMakeLists.txt 文件,它都会自动弹出来 “配置项目” 的流程,跑一遍之后代码里加的头文件什么就能正常识别了,还挺省心。琢磨了半天,查了点资料又自己试了试,分享给有同样需求的朋友~
2025-11-07 17:39:52
402
1
原创 一篇关于 “抽象类实例化错误” 的犯蠢踩坑记录
今天踩了个 C++ 继承的坑,折腾了半天才解决,一部分是粗心大意了,另一部分是基础知识实践不牢,记录一下过程共勉~
2025-11-06 19:20:59
288
2
原创 C++lambda表达式用法详细讲解
C++11的lambda表达式是一种匿名函数机制,其核心语法为捕获列表mutable->返回类型{函数体}。主要特性包括:1)捕获列表支持值捕获、引用捕获和混合捕获,控制外部变量访问方式;2)可选mutable关键字允许修改值捕获的变量;3)可自动推导或显式指定返回类型。典型应用场景包括STL算法参数和回调函数,通过捕获列表可访问外部变量,相比普通函数更灵活简洁,特别适合一次性使用的短小函数逻辑。C++14还扩展了初始化捕获和泛型lambda特性。
2025-11-05 14:18:34
666
原创 Windows下cmd使用网络共享目录时报错CMD 不支持将 UNC 路径作为当前目录的解决方法
在CMD窗口下,使用net use命令将网络存储地址映射成本地盘地址,即可使用。也就是将网盘地址内的文件内容映射成本地盘符P根目录下,即可解决。
2025-10-22 14:32:16
159
1
原创 lib和dll静态库和动态库
无论哪种lib,都是给编译/链接阶段告诉链接器“你用的函数/类在哪里,是否存在”;静态库的lib:直接把代码复制进来;动态库的导入库:记录dll的位置信息,相当于“给链接器一个定心丸”。把库代码编译成二进制指令,打包成一个.dll文件,运行时才会被加载到内存。相当于“把别人写好的代码,放在一个‘共享文件’里,谁需要谁就临时来借(加载)”。
2025-10-20 17:37:08
810
原创 我的创作纪念日
首先就是收获了一些粉丝和阅读量,让我在校招面试中也更有竞争力,同时收获了一个习惯,也获得了这么多的学习笔记,是的有时候就是把这里当做学习云记录,一举多得!做好自己的工作,主动学习,主动深入,持续学习,保持热爱!我总是在觉得值得记录或分享的时候及时做记录。哈哈还是小菜渣一枚,暂时还没啥值得说的成就~
2025-09-04 19:40:45
198
原创 C++设计模式之单例模式
优先使用 C++11 的 “局部静态变量” 实现,C++11 标准明确规定:局部静态变量的初始化在多线程环境下是线程安全的(即只会被初始化一次,且初始化过程会阻塞其他线程)。单例模式通过严格控制实例创建过程,解决了这类问题。当两个线程同时调用 getInstance() 且此时实例尚未创建时,可能都通过 “实例是否存在” 的判断,进而各自创建一个实例,破坏单例的唯一性。单例模式是最常用的设计模式之一,属于创建型模式,其核心目标是确保一个类在程序生命周期中只能创建一个实例,并提供一个全局访问点来获取该实例。
2025-08-12 23:50:15
418
原创 VS2019C++逐语句调试中进入非使用函数现象的一个例子的解释
运算符,用于访问其管理的原始对象的成员。在调试时,“逐语句(F11)”会跟踪到每一个函数/运算符的调用,因此会先进入。的一个重载运算符(本质是函数),F11 会严格按照执行顺序进入每一个函数调用,因此会先处理。因此,调试器会先 step into 这个运算符函数(即你看到的。F11逐语句进入,是先进的shared_ptr.hpp中的。后使用“逐过程(F10)”跳出,再 F11 进入。执行完成后,调试器会获取到原始指针,继续执行。并非直接访问原始指针的成员,而是调用。这个函数,而不是使用到的函数。
2025-08-12 20:05:51
284
原创 C++设计模式学习记录
本渣渣初入职场,在熟悉组内项目代码过程中,发现掌握常用的设计模式及其重要,之前虽然对设计模式有所了解,但是仅限于概念性的认识,并没有熟练掌握,因此开贴监督学习设计模式。
2025-08-11 23:08:35
446
原创 C++详解:__declspec (dllexport)
是 Microsoft Visual C++ 编译器提供的,专门用于在 Windows 平台开发动态链接库(DLL)时,将 DLL 中的符号(函数、类、变量等)标记为“可导出”,以便其他程序(如 EXE 或其他 DLL)加载该 DLL 后能访问这些符号。
2025-08-01 11:09:43
921
原创 C++开发中stdafx.h和stdafx.cpp的作用
通过合理使用预编译头,大型项目的编译时间可以从分钟级缩短到秒级,尤其在频繁增量编译时效果显著。在传统的C++项目开发中(尤其是使用Microsoft Visual Studio时),,特别是在大型项目中。
2025-07-30 14:09:59
1233
原创 C++枚举值隐式分配机制详解
C++11 引入的强类型枚举(enum class)禁止隐式转换为整数,需显式转换(如 static_cast(Flag::A))。在 C++ 中,枚举(enum)是一种用户定义的类型,用于将一组命名的整数常量(枚举值)组合在一起。枚举值的隐式分配机制指的是编译器在未显式指定枚举值时,自动为枚举成员分配整数值。当枚举成员未显式指定值时,编译器会按定义顺序从 0 开始递增分配值,每次递增 1。如果部分枚举成员显式指定了值,后续未指定值的成员会基于前一个显式值递增。允许重复值,但需谨慎使用。
2025-07-29 11:20:49
284
原创 VS2019C++项目调试问题及打断点附加到进程调试显示“当前不会命中断点,还没有为该文档加载任何符号”
这意味着调试器没有找到(或无法正确匹配)与源代码对应的调试符号文件(.pdb 文件),或者目标代码根本不在当前执行路径上。首先要在项目属性中设置,确保生成pdb调试信息。
2025-07-25 11:12:09
1262
原创 C++深度理解:POD类型(Plain Old Data)
平凡性(Trivial):类型具有编译器生成的默认特殊成员函数标准布局(Standard Layout):类型在内存中的布局与C语言兼容。
2025-07-17 17:22:31
1202
28
原创 C++关于函数声明的种种
在C++中,函数声明的完整语法比表面看起来更灵活,一直对于函数声明的修饰和限制符模棱两可,最近熟悉项目代码,遇到好多声明不能快速理解,特此整理一网打尽。这些扩展语法使C++能够更精确地表达函数的行为和约束,是高级C++编程的重要组成部分。声明函数不抛出异常,C++11后改用。
2025-07-16 13:51:34
379
原创 C++宏定义中do { ... } while(false, false)的使用
这是一种特殊的宏定义技巧,强制分号结尾,确保宏作为单个语句使用,并且支持宏执行多个操作(如定义变量、调用多个函数),使用 do-while 可以将它们包裹在一个代码块中,确保语法正确性。两个false循环条件恒为假,循环体只执行一次,这与直接使用 while (false) 效果相同,但为了强调宏的展开不应该依赖于循环条件,或者是历史遗留的写法。lz在阅读代码时,发现宏定义中使用 do { …} while (false, false)觉得有趣特此记录。
2025-07-14 15:03:46
246
原创 在C++项目开发中,为什么应尽量避免全局数据,如果无法避免,使用全局函数或者静态成员函数来返回全局变量?
在C++项目开发中,为什么应尽量避免全局数据,如果无法避免,使用全局函数或者静态成员函数来返回全局变量
2025-07-04 09:41:57
638
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅