C++开发精讲
文章平均质量分 86
C++基础精讲、C++11精讲、linux基础、网络编程、多线程、常见问题分析
Lemo`s Studio
这个作者很懒,什么都没留下…
展开
-
C++大型项目管理:一文讲透cmake最佳工程实践(可复用)
相比传统CMake,现代CMake强化了模块化、标准化的设计思想,提供了大量基于target的设计模式。核心是Target(构建目标)像编程一样认真对待CMake代码模块化利用CMake提供的Public传播等特性自动管理依赖等关系避免全局更改,而是使用带有作用域的target相关函数CMake项目结构CMakeLists写法参考为了更加方便的引入三方库,现代CMake提供了丰富的工具和规范。原创 2024-06-22 10:14:29 · 840 阅读 · 0 评论 -
C++开发调试:精通飞栈(Stack Overflow)问题的定位与预防
飞栈,即Stack Overflow,是程序在执行过程中调用栈超出其分配空间的现象。飞栈通常由无限递归、过深的递归、异常堆栈处理不当或局部变量过大引起。飞栈问题虽然棘手,但通过理解其原因、掌握定位方法,并采取适当的预防策略,可以显著降低其发生的概率。现代C++提供的新特性和工具,为我们提供了更多的解决方案。原创 2024-06-14 15:22:31 · 873 阅读 · 0 评论 -
C++类型转换深度解析:从基础数据类型到字符串,再到基础数据类型的完美转换指南
在 C++ 编程中,我们经常需要在基础数据类型(如intdoublefloatlong等)与string类型之间进行转换。这种转换对于处理用户输入、格式化输出、数据存储等场景至关重要。本文将详细介绍如何在 C++ 中实现这些转换。本文详细介绍了 C++ 中基础数据类型与string之间的转换方法。同时,也讨论了转换过程中可能遇到的问题和注意事项,以及提出的一套通用的转换方法。希望这些信息能够帮助 C++ 开发者更好地处理数据类型转换的任务。大家要是有不懂的地方,欢迎私信交流。原创 2024-06-13 11:01:12 · 1113 阅读 · 0 评论 -
深入 C++ 实践:如何在完全不改变已有模块架构的情况下,二次封装接口给外部模块使用
前文中我们讲到,如何通过应用 Pimpl 模式进行接口类实现类的分离,来进行接口的设计。没有读过前文的读者,可以通过这个链接去读下: 《深入 C++ 实践:通过 Pimpl 模式来谈接口类与实现类分离的设计原则但是,实际业务场景中是多变的,不可能通过一种方式适用所有场景。现在我们就来看看一种比较常见的情况:模块层/平台层代码已经完成了功能开发,但是业务比较复杂,或耦合较深,不便于修改现有接口暴露出来给外部模块使用。想基于已有的功能新增API接口暴露出来供外部使用。原创 2024-06-11 17:30:30 · 424 阅读 · 1 评论 -
深入 C++ 实践:通过 Pimpl 模式来谈接口类与实现类分离的设计原则
Pimpl 模式涉及将类(通常称为“Facade”或“接口类”)的实现细节移动到一个单独的类(通常称为“Impl”或“实现类”)中。接口类持有一个指向实现类的指针。编译单元的独立性:修改实现类不会导致使用接口类的代码重新编译。隐藏实现细节:实现类可以隐藏在私有头文件中,防止外部直接访问。灵活性:可以在不改变接口的情况下,自由地更改实现。protected:// 声明友元,typename关键字用于指示 Facade 是一个类型,而不是一个变量或函数。原创 2024-06-11 15:40:08 · 1252 阅读 · 0 评论 -
深入C++:实践中带你看 std::bind 和 std::placeholders 的各场景用法
是一个命名空间,它包含了一组占位符对象。这些占位符对象用于指示std::bind函数对象的参数位置。占位符的形式为_1_2_3,依此类推,表示第一个、第二个、第三个参数,等等。它在使用std::bind时非常有用。std::bind用于创建一个新的函数对象,该对象将原始函数的一些参数固定,而其他参数仍然可以在调用时指定。提供了占位符,用于表示这些在调用时指定的参数位置。原创 2024-06-07 14:19:21 · 797 阅读 · 0 评论 -
C++大型项目管理:通用CMake框架的架构奥秘
在当今的软件开发环境中,随着 C++ 项目的不断扩大和变得越来越复杂,有效地管理这些项目成为了一个重要的挑战。CMake 作为一个跨平台的构建系统,提供了强大的工具来帮助开发者组织和管理大型 C++ 项目。在本文中,我们将探讨为什么使用 CMake 进行 C++ 大型项目管理以及如何使用通用 CMake 框架进行项目工程的搭建。CMake 提供了一套强大的工具,能够帮助开发人员有效地管理和构建大型 C++ 项目。原创 2024-06-04 07:10:49 · 849 阅读 · 0 评论 -
巧用CMake编译策略:C++二次开发中的Release与Debug模式切换秘籍
在C++二次开发的过程中,理解各种编译模式并能灵活切换,对于提升软件性能和调试效率至关重要。本文将深入讨论Debug与Release模式的区别、默认编译模式、如何确保编译模式的一致性、编译模式不一致时可能遇到的问题及在依赖项为Release模式时,如何支持自身为Debug模式。在 C++ 项目开发中,Debug模式和Release模式是两种最常见的编译配置。Debug模式旨在增加调试信息,优化调试过程,而不注重运行效率和生成文件的大小。Release。原创 2024-06-03 16:17:10 · 1821 阅读 · 0 评论 -
C++高手进阶:从日志管理系统的封装看设计中对第三方库的隐藏
上文中介绍了怎么在自己的项目中设计自己的日志管理系统。没有看过的读者可以去看下原文:》》》C++高手进阶:如何设计自己的日志管理系统但是实际上真实的业务开发中,开发者通常不期望去让其它依赖本模块的人知道自己是怎样设计的,特别是自己依赖了哪些第三方库。那么,这就涉及到一个第三库隐藏的问题。即怎么隐藏自己的设计思路,只让被依赖方看到设计者想让他看到的,而隐藏掉不想让他看到的。本文就此进行展开讲解下。我们通过对日志管理系统的封装,将第三方库的实现细节隐藏起来,只暴露接口。原创 2024-05-31 15:12:50 · 1039 阅读 · 1 评论 -
C++高手进阶:如何设计自己的日志管理系统
对于开发者来说,最通常的定位手段,就是打断点来定位问题。这当开发者能看到全模块代码时,自然没什么问题。但是当项目中模块解耦比较好,每个开发团队只关注于本模块的开发,对其他模块的依赖仅仅是通过api接口,这样当模块间出现异常时,定位手段就显得有点不足,或是需要其他团队成员协助定位,这样人力和时间成本的开销就变大了。原创 2024-05-31 11:50:48 · 800 阅读 · 1 评论 -
C++高手进阶:Windows 模块加载的艺术与策略
场景: 假设有主模块A,在其上开发了模块B,以进行能力增强。那么对于模块A定义模块间交互的协议类,用于模块B来派生,自定义自己的加载、卸载业务逻辑。// xx.hpublic:private:// xx.cpp定义一个模块加载器类,用来管理模块的加载和卸载。在适当的时机,比如说模块A初始化和反初始化的时候,对模块B进行主动的加载和卸载。原创 2024-05-29 16:46:39 · 1453 阅读 · 0 评论 -
自力更生:0依赖三方库,手把手教你打造专属C++测试框架
当人们谈到测试框架的时候,首先想到的就是 google 的 gtest, 想着怎么在代码中集成 gtest 的框架,来实现自身代码的测试。然后就巴拉巴拉的费了老大劲将 gtest 嵌入到自己的代码中来。诚然,在自身程序接口稳定,且代码量达到一定程度的时候,上 gtest 是一个不错的选择。但是当自身代码不是很多,并不想带上一个厚重的第三方库的时候,那就得自己想办法搭建测试框架了。本文中我们来探讨下,在不依赖第三方库的情况下,如何搭建自己的测试框架。原创 2024-05-29 11:51:17 · 1092 阅读 · 0 评论 -
C++可变参技巧揭秘:从函数到模板,一网打尽
最近在用C++开发项目过程中,遇到了场景需要用可变参(...)的情况,发现开发业务相关同事,对这块理解不是很清晰,遂对此进行梳理总结,以便业务相关同事学习,以及后续遇到时的参考。对此不是很清楚的读者也可参考看下。原创 2024-05-28 14:48:34 · 1037 阅读 · 0 评论 -
C++编程揭秘:虚表机制与ABI兼容性的实例剖析
假设你的应用程序引用的一个库某天更新了,虽然 API 和调用方式基本没变,但你需要重新编译你的应用程序才能使用这个库,那么一般说这个库是源码兼容(Source compatible);反之,如果不需要重新编译应用程序就能使用新版本的库,那么说这个库跟它之前的版本是二进制兼容的(Binary compatible)。👉👉👉。原创 2024-05-26 21:36:22 · 902 阅读 · 0 评论 -
C++11_关键字_final and override
1 问题提出以前C++中虚函数没有一个强制的机制来标识虚函数会在派生类里被改写。vitual关键字是可选的,这使得阅读代码变得很费劲。因为可能需要追溯到继承体系的源头才能确定某个方法是否是虚函数。为了增加可读性,可以在派生类里也写上virtual关键字。但即使这样,仍然会产生一些微妙的错误。看下面这个例子:class B{public: virtual void f(short) {std::cout << "B::f" << std::endl;}};clas原创 2021-01-29 15:56:05 · 202 阅读 · 0 评论 -
C++11_关键字_一些说明
构造函数可以有多个重载,而拷贝构造函数、拷贝赋值函数只能有一个重载。什么是 big five ?构造函数、拷贝构造函数、拷贝赋值函数、移动构造函数、移动赋值函数.对于一个类而言,什么情况下使用big five ? 什么情况下使用默认的就可以了呢?一个类里面只要它带着指针的成员(point number),一般就需要自己去写出 big five .如果这个类不带point number,一般用默认的就可以了。以下面例子为例:class Foo {public: Foo(int i)原创 2021-01-29 15:16:13 · 132 阅读 · 0 评论 -
C++11_列表初始化及类内初始化
1 列表初始化语法 initializer_list<>C++11中,集合(列表)的初始化已经成为C++语言的一个基本功能,这种初始化的方法被称为“初始化列表”(initializer list),例如:#include <vector>#include <map>using namespace std;int a[] = {1, 3, 5};int b[]{2, 4, 6};vector<int> c{1, 3, 5};map<in原创 2021-01-25 17:00:37 · 2405 阅读 · 1 评论 -
C++11_关键字_Deleted
1 背景问题对于 C++ 的类,如果程序员没有为其定义特殊成员函数,那么在需要用到某个特殊成员函数的时候,编译器会隐式的自动生成一个默认的特殊成员函数,比如拷贝构造函数,或者拷贝赋值操作符。例如:demo1class X{ public: X(); }; int main(){ X x1; X x2 = x1; // 正确,调用编译器隐式生成的默认拷贝构造函数 X x3; x3 = x1; // 正确,调用编译器隐式生成的默认原创 2021-01-25 15:41:41 · 410 阅读 · 0 评论 -
C++11_关键字_Defaulted
1 问题背景C++ 的类有六类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符、移动构造函数以及移动赋值运算符。这些类的特殊成员函数负责创建、初始化、销毁,或者拷贝类的对象。如果程序员没有显式地为一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐式的为这个类生成一个默认的特殊成员函数。例如:demo1class X{ private: int a; }; X x;在 demo1 中,程序员并没有定义类 X 的默认构造函数,但原创 2021-01-25 15:00:23 · 288 阅读 · 3 评论 -
C++11_关键字_explicit
explicit是C++11中特意添加的一个关键字。通常情况下用于构造函数前面,表示显式表示,禁止构造函数的隐式转换。为什么要这么做呢?这么做有什么好处呢?我们先来看看下面的例子,顺便提几个知识点。conversion function vs non-explicit-one-argument ctor#include <iostream>using namespace std;class Fraction{ public: Fraction(int原创 2021-01-21 17:38:04 · 691 阅读 · 0 评论