自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(164)
  • 资源 (6)
  • 收藏
  • 关注

原创 CMake Object Library:避免重复编译的优雅之道

在 CMake 项目中,当需要将同一源文件同时用于构建静态库和共享库时,传统方法会导致源文件被重复编译,浪费时间和资源。CMake 提供的 Object Library 可以解决这一问题。Object Library 是一种特殊的库,它只将源文件编译成对象文件,而不进行链接。这些对象文件可以被复用到多个其他目标中,从而避免重复编译。通过使用 Object Library,可以显著提高编译效率,减少资源浪费。具体实现方式是通过 add_library(objlib OBJECT src/lib.c) 创建 O

2025-05-20 15:43:37 408

原创 使用 Modern CMake 构建现代 C++ 项目:target从入门到实践

CMake 是 C++ 项目的主流构建系统,Modern CMake 是推荐的最佳实践。本文介绍了 Modern CMake 的核心理念,包括通过 target_* 系列命令管理依赖、清晰的目录结构设计、使用 target_sources() 管理源码、安装与导出库、以及 CMakePresets.json 的使用。Modern CMake 强调通过 target 管理一切,避免全局变量,确保依赖清晰。文章还展示了如何安装库并让下游项目通过 find_package() 引用,以及如何通过 CMakePre

2025-05-15 16:47:53 499

原创 【C++ 编译优化】为什么你应该开启 -Wall -Wextra -pedantic -Werror

让编译器当你的“代码把关人”,是写出高质量 C++ 的第一步。把警告当成错误处理,不是因为你怕错,而是因为你在意质量。

2025-05-14 16:40:18 396

原创 C++ 代码覆盖率分析:使用 CMake + Gcovr 生成 HTML/XML/JSON 报告

完整代码覆盖率流程编译:使用选项,生成.gcno文件。运行:运行测试,生成.gcda文件。分析:使用gcov解析.gcda和.gcno文件。生成报告gcovr读取gcov输出,并生成 HTML、XML、JSON 报告。通过这套方法,我们可以高效地分析 C++ 代码的测试覆盖率,并在 CI/CD 中集成代码质量检查。

2025-02-25 13:29:28 435

原创 vscode 设置在编辑器的标签页超出可视范围时自动换行(workbench.editor.wrapTabs)

workbench.editor.wrapTabs”: true 是 VS Code(Visual Studio Code) 的一个设置项,它的作用是 在编辑器的标签页超出可视范围时自动换行,而不是显示滚动条。如果同时打开多个文件,当标签页(Tab)数量过多时,它们会自动换行显示,而不是挤在一行里导致部分标签不可见。默认值:false(不开启,超出时会出现滚动条)适用于小屏幕或同时打开多个文件时提高可读性。需要修改settings.json。

2025-02-05 16:35:46 1194

原创 如何打开vscode系统用户全局配置的settings.json

settings.json 是 Visual Studio Code(VS Code) 的用户配置文件,它存储了 编辑器的个性化设置,包括界面布局、代码格式化、扩展插件、快捷键等,是用户全局配置(影响所有 VS Code 项目)settings.json 配置文件 - 适合高级用户,自定义更复杂的设置。图形界面(UI Settings) - 适合不熟悉 JSON 配置的用户。VS Code 的 settings.json。📌 settings.json 的作用。

2025-02-05 16:28:53 3869

原创 C++ Brain Teasers:重载决议最佳匹配和歧义

要调用 std::string 重载,我们需要一个用户定义的转换序列(底部),这涉及创建一个新的临时 std::string 对象。如果重载对至少一个参数具有更好的转换,并且对任何其他参数没有更差的转换,则该重载被视为最佳可行函数,并通过重载解析选择。如果存在从参数到参数类型的隐式转换,则该重载将添加到可行函数集。但是第一个重载对第一个参数的转换更好(int → int 优于 int → float),而对第二个参数的转换并不差(两个重载都是 int → int),因此它被重载解析选为最佳可行函数。

2024-12-31 17:41:40 353

原创 C++ Brain Teasers: 未指定和实现定义的行为-函数参数的求值顺序

C++ 中没有从左到右或从右到左求值的概念。任何表达式的任何部分的求值顺序(包括函数参数的求值顺序)均未指定(下面列出了一些例外情况)。编译器可以按任何顺序求值操作数和其他子表达式,并且可能在再次求值同一表达式时选择其他顺序。大多数程序都有一些未指定或实现定义的行为;与未定义的行为相反,这没什么问题。只是不同的实现在允许的行为集内可能会表现得略有不同。C++ 标准并未严格指定所有内容;它为实现留下了一些自由。这允许每个实现在特定系统上做出最好的选择。

2024-12-31 16:42:34 224

原创 链接成功但找不到符号的原因及解决方案

问题描述在链接过程中,动态库链接成功,但被其他人调用时,编译器无法找到动态库中的符号,导致编译失败。例如:可能原因静态库未正确包含在链接过程中:静态库可能没有被正确添加到链接命令中。头文件未正确包含:使用符号的代码中可能没有正确包含相关头文件。链接顺序不正确:链接顺序不正确可能导致符号未解析。我这里的动态库libmathtoolkit.so链接libGeometry.a成功,但是在提供给第三方使用时发现找不到定义,原因是静态库中的符号未被使用,链接器优化掉了这些符号解决方案强制链接静态库。

2024-12-31 10:03:12 672

原创 CMake:打印出脚本中所有可访问的变量

CMake 提供了一个非常有用的命令:get_cmake_property,它可以动态检索 CMake 的元信息,例如变量列表、缓存变量、模块路径等。参考学习:https://stackoverflow.com/questions/9298278/cmake-print-out-all-accessible-variables-in-a-script。通过学习和应用上述方法,你可以轻松获取和操作 CMake 的元信息,编写出更加高效、健壮的构建脚本。想知道当前的 CMake 是否支持模块功能?

2024-12-03 15:51:51 619

原创 CMake 与 pkg-config 编写和集成 .pc 文件

pkg-config 是一个用于管理库的编译和链接参数的工具。它通过读取 .pc 文件(Package Config 文件)来获取库的元数据信息,如包含目录、库路径、依赖关系等。这样,开发者无需手动管理这些复杂的编译选项,简化了构建过程。编写 .pc 文件基础结构一个标准的 .pc 文件通常包含以下几个部分:变量定义:用于简化路径管理。基本信息:库的名称、描述和版本。编译和链接标志:指示如何包含和链接库。依赖关系:列出库所依赖的其他库。示例 .pc 文件。

2024-10-15 15:45:26 1640

原创 使用C++ 17 variant and visit实现 Multiple Dispatch

get_objects(): 假定这个函数返回一个 std::vector,其中包含若干 std::variant 对象,即飞船或小行星的列表。std::visit: 通过传入的两个 std::variant(obj 和 other),std::visit 会自动匹配其中包含的类型,并将其传递给 lambda 函数。对于每对 obj 和 other,使用 std::visit 来处理它们的类型并调用适当的 lambda 函数。= default;

2024-08-26 14:52:41 854

原创 Flake8 和 Autopep8 使用指南

Flake8 和 Autopep8 集成到 CI/CD 流程中,确保在代码提交和合并时自动进行检查和格式化,1.1 基本使用运行 Flake8 来检查指定目录下的代码:bash复制代码此命令将扫描 my_project 目录中的所有 Python 文件,并输出检测结果。1.2 配置Flake8 支持在多个位置进行配置,包括用户目录和项目目录中的配置文件。配置文件可以是 setup.cfg、tox.ini、.flake8 文件中的 [flake8] 段落。

2024-08-09 17:41:26 1112

原创 Flake8 与 Autopep8 兼容性指南

为了确保代码风格的一致性和自动化管理,理解这两个工具的功能差异以及它们之间的版本兼容性是非常重要的。本文将从功能区别、版本对应关系、兼容性检查方法等方面进行总结,帮助您更好地使用这两个工具。pipdeptree 是一个工具,可以帮助您查看 Python 包的依赖关系,从而确认 Flake8 和 Autopep8 使用的 pycodestyle 版本是否一致。锁定版本: 使用 pip 的 requirements.txt 文件锁定 Flake8 和 Autopep8 的版本,确保它们之间的依赖关系兼容。

2024-08-09 17:32:03 680

原创 clang-tidy 使用指南

clang-tidy 需要一个编译数据库来了解如何编译你的代码。编译数据库通常是一个名为 compile_commands.json 的文件。在这个示例中,clang-tidy 会对 test.cpp 文件进行分析,并报告任何潜在的问题。例如,它可能会警告 test 函数中的未使用变量 x。clang-tidy 是一个用于 C++ 代码的静态分析工具,可以帮助你发现代码中的潜在问题和改进点。这将在 build 目录中生成一个 compile_commands.json 文件。

2024-08-08 16:58:34 1404 1

原创 vscode显示120字符或者80字符提示线或者显示垂直标尺

一般规定一行代码不超过80或者120个字符。取决于团队的编码规范。文件-》首选项-》设置-》搜索或添加editor.rulers。vscode显示120字符或者80字符提示线或者显示垂直标尺。打开全局设置的settings.json。不同公司不同团队有不同的规定。效果,颜色可以根据需要设置。添加提示线并配置颜色。

2024-01-16 18:38:11 6815

原创 lambda中的constexpr变量

x 和 z 可以在 lambda 函数中使用而不被捕获,是因为它们具有不同的存储持续时间。x 是一个 constexpr 变量,这意味着它具有在编译时确定的常量值。另一方面,z 是一个全局变量,这意味着它具有静态存储持续时间,并且可以从程序的任何部分访问,包括在 lambda 函数内部。x 是一个 constexpr 变量,它在编译时被确定并存储在只读内存中。这是因为constexpr变量在编译期就已经被计算出来,并且它的值是在编译时确定的,所以在lambda表达式中使用它是安全的。

2023-05-08 15:05:21 308

原创 python的 __init__.py文件中使用__all__变量

显示函数的文档:在终端中运行pydoc module_name.function_name,其中module_name是包含要查看文档的函数的模块的名称,function_name是要查看文档的函数的名称。生成HTML格式的文档:在终端中运行pydoc -w module_name,其中module_name是要生成文档的模块的名称。显示模块的文档:在终端中运行pydoc module_name,其中module_name是要查看文档的模块的名称。显示pydoc的帮助:在终端中运行pydoc -h。

2023-05-05 16:45:49 1904

原创 C++ 预编译头文件(Precompiled Header,PCH)

后续编译时,如果其他源文件中也包含了同样的预编译头文件,编译器会直接使用之前生成的二进制文件,而不是重新预处理一遍头文件。它的原理是先将一些常用的头文件预处理,生成一个二进制文件(通常是.pch文件),然后在后续的编译中,直接引用这个二进制文件,避免了重复的预处理过程,从而提高了编译速度。例如,如果你预编译了“stdafx.h”头文件,你就会得到一个预编译头文件,每次你包含“stdafx.h”头文件时,编译器都会自动搜索名为“stdafx.h.gch”的预编译头文件。

2023-05-05 16:22:27 1150

原创 常用类型推导和比较

常用类型推导和比较。

2023-02-03 13:47:14 171

原创 聚合体初始化(aggregate initialization)

总的来说,在C++17中满足如下条件之一的对象被认为是聚合体是一个数组或者是一个满足如下条件的类类型classstructunion):没有用户定义的和explicit的构造函数没有使用using声明继承的构造函数没有private和protected的非静态数据成员没有virtual函数没有的基类然而,要想使用聚合体初始化来初始化基类中没有private或者protected的成员没有private或者protected的构造函数。

2023-02-01 17:19:07 965

原创 C++ 17 variant and visit

std::variant是C++ 17的重要新特性。它非常常用以至于不得不去学习它。它实际上是C语言中的union的拓展。它可以存储多种多样的类型,具体类型只有在运行时才能确定。你甚至可以存储自定义的类型。或者是定义一个元素都是variant的数组。这个数组里面每一个元素的类型都可以不相同!而std::visit是与之配套的访问器。通过std::visit能够不关心具体类型地写出算法,实现算法的泛用。

2022-11-17 13:12:37 753

原创 try_emplace向std::map实例中高效并有条件的插入元素

map是STL里重要容器之一。它的特性总结来讲就是:所有元素都会根据元素的键值key自动排序(也可根据自定义的仿函数进行自定义排序),其中的每个元素都是的键值对,map中不允许有键值相同的元素,因此map中元素的键值key不能修改,但是可以通过key修改与其对应的value。如果一定要修改与value对应的键值key,可将已存在的key删除掉,然后重新插入。cpp17 使用我们需要用键值对填充一个map我通常会使用insert或emplace函数对map。

2022-11-01 23:17:10 3197

原创 std::copy, std::copy_if

std::copy, std::copy_if。

2022-10-30 20:46:08 258

原创 快速或安全的访问std::vector实例的方法, std::vector的插入排序

可能是STL容器中适用范围最广的,因为其存储数据的方式和数组一样,并且还有相对完善的配套设施。不过,非法访问一个vector实例还是十分危险的。如果一个vector实例具有100个元素,那当我们想要访问索引为123的元素时,程序就会崩溃掉。如果不崩溃,那么你就麻烦了,未定义的行为会导致一系列奇奇怪怪的错误,查都不好查。经验丰富的开发者会在访问前,对索引进行检查。这样的检查其实比较多余,因为很多人不知道有内置的检查机制。

2022-10-30 20:26:57 991

原创 以O(1)的时间复杂度删除未排序std::vector中的元素

# 以O(1)的时间复杂度删除未排序std::vector中的元素

2022-10-30 19:46:53 1119

原创 高效擦除/移除(Erase–remove idiom)std::vector元素

擦除/移除std::vector元素

2022-10-30 19:29:50 4163

原创 向 lambda 传递 this的拷贝

lambda里捕获了 *this,所以传递进 lambda的是一份拷贝。因此,即使在 d被销毁之后使用捕获的对象也没有。如果我们使用[this]、[=]或者 [&]捕获 this,那么新线程将会陷入未定义行为,因为当线程中打印name的。这里,捕获 *this意味着该 lambda生成的闭包将存储当前对象的一份拷贝。向 lambda 传递 this的拷贝。时候将会使用一个已经销毁的对象的成员。

2022-09-18 16:33:07 1561

原创 泛型Lambda

泛型Lambda

2022-09-18 16:27:43 787

原创 C++ 11 & 14 中的Lambda表达式 补充

lambda的本质

2022-08-21 17:26:31 338

原创 CPP design pattern Singleton

CPP design pattern Singleton

2022-06-26 15:38:22 359

原创 std::boolalpha

1.头文件#include <iostream>2.使用说明让输出流将bool解析成为true或者 false3、示例代码#include <iostream>void test_boolalpha(){ std::cout << "true is " << true << std::endl; std::cout << "false is " << false << std::endl;

2022-05-16 17:26:55 611

原创 函数名作为字符串输出(Function Names as Strings)

GCC 预定义了两个标识符来保存当前函数的名称。 标识符 __FUNCTION__ 包含函数在源代码中出现的名称。 标识符 __PRETTY_FUNCTION__ 包含以特定语言方式漂亮打印的函数名称。https://www.onlinegdb.com/ online gdb 验证这些名称在 C 函数中始终相同,但在 C++ 函数中它们可能不同。 例如,这个程序:#include <stdio.h>void test_macroFunction(int i, int j){

2022-05-16 17:16:46 464

原创 使用C++11解决内存泄露--智能指针

C++11提供了智能指针,使用智能指针后不需要用户自己释放内存空间,一旦使用时对象超出了自己的生命周期,就会进行自动释放,从而有效解决了内存泄露的问题。在实际编程时,有三种智能指针可供使用,分别是:std::shared_ptr、std::unique_ptr和std::weak_ptr。1 共享智能指针:std::shared_ptrstd::share_ptr指针的每一个拷贝都指向同一个对象,只有在引用计数为零时内存才会被释放。指针声明原型为:template class shared_pt

2022-03-25 10:45:18 1305

原创 常量表达式值 constexpr

常量表达式值(constant-expression value)。通常情况下,常量表达式值必须被一个常量表达式赋值,而跟常量表达式函数一样,常量表达式值在使用前必须被初始化。一、常量表达式1.1 运行时常量性与编译时常量性在C++中,我们常常会遇到常量的概念。常量表示该值不可修改,通常是通过const关键字来修饰的。比如:const int i = 3;const还可以修饰函数参数、函数返回值、函数本身、类等。在不同的使用条件下,const有不同的意义,不过大多数情况下,const描述的都

2022-03-24 17:08:23 1851

原创 C++基础之元编程与constexpr

元编程(metaprogramming)是一个典型的复合词,他由前缀 meta- 和词根 programming 复合而成,有“对一个程序进行编程”的意思。换句话说,编译器先编译你的代码,得到一份新的代码,然后再编译新的代码来解决问题。模板元编程技术,即把一些可以在编译时完成的求值计算,通过模板特化的技术绑定到具体的实例化代码上,从而减少不必要的代码量,提升代码的运行效率。一、C++的元编程1.1 为什么要元编程呢?前面我们知道了什么是元编程,那么为什么要有这种编写技巧呢?无外乎两点:减少重复的代

2022-03-24 14:16:48 2717 1

原创 模板偏特化 Partial specialization

偏特化是指如果一个 class template 拥有一个以上的 template 参数,我们可以针对其中某个(或多个,但不是全部)template 参数进行特化,比如下面这个例子template <typename T>class C {...}; //此泛化版本的 T 可以是任何类型template <typename T>class C<T*> {...}; //特化版本,仅仅适用于 T 为“原生指针”的情况,是泛化版本的限制版所谓特化,就是特殊情

2022-03-23 18:42:20 836

原创 std::vector

#include <iostream>#include <vector>#include <algorithm>using namespace std;int main(){ vector<int> v {1, 2, 3, 2, 5, 2, 6, 2, 4, 8}; const auto new_end (remove(begin(v), end(v), 2)); v.erase(new_end, end(v));

2022-03-17 17:37:17 565

原创 循环遍历map容器,erase元素的问题

#include <iostream>#include <map>using namespace std;int main(){ map<string,string> testMap{ {"cpp","cpppp"}, {"java","javaaaa"}, {"shell","shelllll"}, {"python", "pythonnnn"} }; map<st

2022-03-14 16:45:19 690

原创 c++11中 std::ref() 和 引用 &

使用std::ref可以在模板传参的时候传入引用,否则无法传递&是类型说明符, std::ref 是一个函数,返回 std::reference_wrapper(类似于指针)用std::ref 是考虑到c++11中的函数式编程,如 std::bind.C++11的设计者认为bind默认应该采用拷贝,如果使用者有需求,加上std::ref()即可。同理std::thread也是这样。example:#include <functional>#include <iostre

2022-03-11 15:58:46 790

CMake Object Library:避免重复编译的优雅之道

CMake Object Library:避免重复编译的优雅之道

2025-05-20

使用 Modern CMake 构建现代 C++ 项目:target从入门到实践

使用 Modern CMake 构建现代 C++ 项目:target从入门到实践示例

2025-05-15

C++ 代码覆盖率分析:使用 CMake + Gcovr 生成 HTML/XML/JSON 报告 源码

C++ 代码覆盖率分析:使用 CMake + Gcovr 生成 HTML/XML/JSON 报告 源码

2025-02-25

C++控制台渲染一朵逼真的玫瑰花

C++控制台渲染一朵花,vs2015 EasyX_2018春分版图形库实现,工程和图形库均在资源里

2019-03-07

OpenCV3.4.2-YOLOv3.7z

OpenCV-YOLOv3示例代码、预训练模型以及测试图像/视频。让我们看看YOLO如何在一张图片中检测目标。 首先,它把原图按比例平均分解成一张有13x13网格的图片。这169个单元会根据原图的大小而改变。对于一张416x416像素的图片,每个图片单元的大小是32x32像素。处理图片时,会以图片单元为单位,预测单位中的多个边界框。 对于每个边界框,这个网络会计算所包含物体的边界框的置信度,同时计算所包含的目标是属于一个特定类别的可能性大小。 非最大抑制(non-maximum suppression)可以消除低置信度的边界框,以及把同时包围着单个物体的多个高置信度的边界框消除到只剩下一个。

2020-03-04

MFC图像处理.rar

x64 realse可运行 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#、Ch、Ruby,GO的支持。

2020-01-03

第十届蓝桥杯大赛选手资源数据包(单片机)

驱动代码说明 1-本文件夹中提供的驱动代码供参赛选手完成程序设计参考之用。 2-选手可以自行编写相关代码或以该代码为基础,根据试题中的时钟频率要求,调整延时间隔。 3-提供驱动代码的测试环境:IAP15F2K61S2单片机 @12MHz。 DS1302

2019-03-22

numpy matplotlib 及其依赖whl文件包

python2.7适用的机器学习第三方插件 numpy matplotlib 及其依赖whl文件包 离线(在线)安装合集,内附安装顺序及执行命令代码

2020-02-06

dbg_amd64.rar

QT中配置msvc所用Windbg Windbg是Microsoft公司免费调试器调试集合中的GUI的调试器,支持Source和Assembly两种模式的调试。Windbg不仅可以调试应用程序,还可以进行Kernel Debug。结合Microsoft的Symbol Server,可以获取系统符号文件,便于应用程序和内核的调试。Windbg支持的平台包括X86、IA64、AMD64。

2020-02-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除