C++编译&调试
文章平均质量分 75
编译&调试
Tipriest_
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux 下开发 C/C++ 程序为什么头文件引用路径这么多和复杂
Linux系统头文件路径的复杂性源于对多架构、多语言和多版本的支持需求。/usr/include存放架构无关的C头文件,/usr/include/x86_64-linux-gnu存放x86_64架构特定的C头文件,实现Multiarch机制。C++标准库头文件则按版本和架构分层:/usr/include/c++/11存放GCC 11的通用C++头文件,/usr/include/x86_64-linux-gnu/c++/11存放架构相关的实现。这种分层结构避免了不同编译器版本和架构间的冲突,确保系统能同时支持原创 2025-12-30 21:21:32 · 1059 阅读 · 0 评论 -
C++ 中 std::move 的使用方法与注意事项
本文介绍了C++中std::move的核心概念和使用场景。首先区分了左值和右值的概念,指出右值引用允许为临时对象提供移动语义。std::move本质上是一个类型转换工具,将左值显式转换为右值引用以启用移动操作。文章详细讲解了四个典型使用场景:实现移动构造/赋值、优化函数返回值、避免容器操作中的不必要拷贝,以及在模板中配合std::forward实现完美转发。最后强调了正确使用std::move的判断标准,并提醒被移动后的对象处于有效但未指定状态,不应依赖其原有内容。原创 2025-12-29 10:22:29 · 960 阅读 · 0 评论 -
C++ 中string的初始化和使用方法
本文介绍了C++中字符串的常见类型和使用方法。重点讲解了std::string的基本操作,包括初始化、访问字符、拼接、查找等。特别解析了std::string二维数组的使用场景,通过示例代码展示了如何根据字符串前两个字符的值将第三个字符分类存储到对应数组位置中。文章还比较了C风格字符串和std::string的区别,强调了std::string在自动内存管理方面的优势。对于C++开发者理解字符串操作具有实用参考价值。原创 2025-12-29 10:14:32 · 797 阅读 · 0 评论 -
计算C++线程频率的一个小函数
该代码片段实现了一个计算当前运行频率的辅助函数calcCurrentHz,并在有限状态机FSM的run方法中调用。通过记录上次时间点last_tp,计算时间间隔dt的倒数得到当前频率hz,并使用ROS日志以1秒间隔输出实际运行频率。匿名命名空间封装了工具函数,避免命名冲突。该设计适用于需要监控循环执行频率的场景。原创 2025-12-28 17:09:39 · 89 阅读 · 0 评论 -
C++ 的 ranges 和 Python 的 bisect 在二分查找中的应用与实现
本文对比了C++20的std::ranges和Python的bisect模块在二分查找中的应用。C++20通过ranges::binary_search、lower_bound和upper_bound等函数提供了类型安全的二分查找,返回迭代器;Python的bisect模块则通过bisect_left和bisect_right返回索引位置,并支持直接插入元素。两者都能高效处理有序数据,但C++性能更优,而Python更易用。文章提供了完整的代码示例,展示了如何在两种语言中实现二分查找及其边界查询功能。原创 2025-12-24 16:40:24 · 429 阅读 · 0 评论 -
CMake 常用预设命令说明
本文介绍了CMake构建系统中常用的预设命令,包括指定CMake最低版本、定义项目名称和语言、设置编译模式、控制编译输出信息以及指定C++标准版本等关键功能。文章通过典型示例展示了这些命令的实际应用,并提供了命令行构建的基本操作说明。这些预设命令是构建C/C++项目的基础配置,能够确保项目在不同平台和编译器下正确构建,同时便于开发调试和版本控制。原创 2025-12-23 15:50:04 · 597 阅读 · 0 评论 -
记录使用valgrind调试ROS程序内存泄漏的一次过程
本文介绍了使用Valgrind工具调试ROS程序内存泄漏问题的方法。首先通过apt和snap安装Valgrind及Massif可视化工具,然后使用memcheck工具运行ROS节点生成调试日志。调试过程中发现gridPathFinder::initGridNodeMap函数存在内存未释放问题,通过多次分析确认问题并修复。需要注意的是,Valgrind运行ROS节点时速度会变慢,且需要通过关闭终端来结束调试进程。最后提到可使用launch文件的prefix前缀进行进一步调试。转载 2025-11-21 17:53:16 · 67 阅读 · 0 评论 -
典型的 ROS 2 ament_cmake构建CMake脚本中ament相关指令解释
本文解析了一个典型的ROS 2包的CMake构建脚本。该脚本使用ament_cmake构建系统,通过ament_*系列命令实现了包的依赖管理、接口导出和系统注册功能。具体包括:ament_target_dependencies()用于自动处理编译和链接选项;ament_export_*命令分别用于导出头文件路径、库文件和依赖关系;最后的ament_package()是核心命令,负责生成包导出文件并向ROS 2系统注册包信息。这些命令共同确保了ROS 2包能被其他包正确发现和使用,同时简化了跨平台构建的复杂度原创 2025-11-15 22:18:52 · 903 阅读 · 0 评论 -
C++中的公有继承,保护继承和私有继承说明
C++中的三种继承类型(public/protected/private)决定了基类成员在派生类中的可见性。公有继承保持基类接口不变(适合"is-a"关系),保护继承将基类public降级为protected,私有继承将所有基类成员变为private。ROS2节点类采用公有继承,允许派生类直接替代基类节点并使用其接口。选择继承方式应考虑是否需要对外暴露基类功能:公有继承完全保留接口,保护继承限制外部访问,私有继承完全隐藏实现细节,类似组合关系。原创 2025-11-15 21:20:43 · 624 阅读 · 0 评论 -
CMake 中 install 的使用原因和使用方法
CMake的install命令用于定义项目文件在安装时的部署位置和规则,主要作用包括跨平台统一部署流程、安装到标准系统目录、配合打包工具生成分发包以及支持多组件安装。基本用法包括安装可执行文件/库(TARGETS)、头文件/普通文件(FILES)和目录(DIRECTORY)。安装位置由CMAKE_INSTALL_PREFIX控制,默认值因系统而异。此外,可通过COMPONENT参数实现模块化安装。典型流程为:在CMakeLists.txt中定义安装规则后,执行make install即可将文件部署到指定位置原创 2025-11-14 21:03:27 · 421 阅读 · 0 评论 -
pkg-config 使用指南(简化C++库的编译和链接过程,判断库是否存在及版本)
pkg-config 简明指南 pkg-config 是 Unix/Linux 系统管理库编译信息的工具,通过读取 .pc 文件自动提供编译参数(如头文件路径、链接库名称),避免手动指定。基本用法包括:pkg-config --cflags --libs 库名 获取编译/链接选项,--exists 检查库是否存在,--modversion 查询版本。开发时可将输出直接嵌入 gcc 或 Makefile,通过 PKG_CONFIG_PATH 指定自定义路径。常见问题多为 .pc 文件缺失或路径错误,需确保安装原创 2025-10-16 21:09:53 · 343 阅读 · 0 评论 -
C++ 中 using 的使用方法详解
本文详细介绍了 C++ 中 using 关键字的多种用途:1) 命名空间导入(using namespace全局导入和using声明局部导入);2) 类型别名定义(替代typedef);3) 继承中引入基类成员;4) 模板别名功能。文章对比了using与typedef的区别,强调现代C++应优先使用using,并给出了最佳实践建议:避免在头文件中全局导入命名空间,推荐局部使用using声明,合理应用类型别名和模板别名功能。using关键字能显著提升代码可读性和可维护性。原创 2025-10-15 15:32:43 · 428 阅读 · 0 评论 -
C++浮点数取余函数fmod()介绍
C++标准库中的fmod()函数用于计算浮点数的除法余数,位于<cmath>头文件中。其函数原型支持double、float和long double类型,返回值的符号与被除数一致。使用时需注意除数不能为零,否则行为未定义。与整数取余运算符%不同,fmod()专为浮点数设计,适用于科学计算等场景。示例展示了如何计算5.3除以2.1得到余数1.1的过程。原创 2025-10-13 20:00:25 · 628 阅读 · 0 评论 -
C++ exit()函数使用场景与使用方法
exit()是C/C++标准库中用于终止程序的函数,定义在<cstdlib>头文件中。它接受一个状态参数(0表示成功,非0表示错误),会立即结束程序运行,并执行基本的清理工作:调用atexit注册的函数、刷新缓冲区、析构静态对象,但不会析构局部对象。与return相比,exit()更突然;与abort()相比,exit()会进行部分清理。适用于需要立即终止程序的场景,但需注意资源管理问题。合理使用可以提高程序的健壮性。原创 2025-10-13 16:46:42 · 486 阅读 · 0 评论 -
C++ 中 size_t 的用(用于跨平台编译)
size_t是C/C++中的无符号整数类型,用于表示对象大小、数组索引和内存分配等场景。它能够自动适配不同平台,确保足够存储当前系统的最大地址范围。常见应用包括sizeof返回值、STL容器的.size()方法、内存分配函数参数等。由于是无符号类型,需注意与有符号数混合运算可能导致意外结果,特别在循环遍历时要避免死循环。size_t比直接使用unsigned int更安全,适合跨平台开发。原创 2025-09-22 15:02:18 · 498 阅读 · 0 评论 -
C 语言标准输入输出库:`stdio.h` 的使用详解
stdio.h是C语言的标准输入输出头文件,提供终端I/O、格式化输入输出、文件操作等功能。它定义了三个标准流(stdin/stdout/stderr)和常用函数如printf、scanf、文件操作(fopen/fclose)等。使用时需注意安全规范,如用fgets替代gets、检查文件操作返回值、正确关闭文件等。掌握stdio.h是C程序员的基本功,涉及格式化I/O、文件读写和错误处理等重要编程技能。原创 2025-09-03 20:37:06 · 2577 阅读 · 0 评论 -
C/C++ 中的inline(内联函数关键字)详解
C/C++中的inline关键字用于定义内联函数,通过将函数代码直接插入调用位置来减少函数调用开销,提高运行效率。内联函数适合短小、频繁调用的函数,相比宏更安全但可能增大代码体积。文章详细介绍了inline的概念、作用、使用方法、适用场景及注意事项,并提供了示例说明其与宏的区别。inline仅作为编译器优化建议,最终是否内联由编译器决定,使用时需权衡性能和代码体积。原创 2025-09-03 19:50:13 · 1027 阅读 · 0 评论 -
C++ numeric库简介与使用指南
C++ <numeric> 库提供了多种数值运算工具,包括累加、相邻差值、内积和序列生成等功能。主要函数有 std::accumulate(求和/累乘)、std::inner_product(内积计算)、std::adjacent_difference(相邻元素差值)、std::partial_sum(部分和)和 std::iota(递增填充)。这些函数适用于支持迭代器的容器(如 vector、数组),具有泛型特性,可自定义运算规则。使用时需注意浮点精度问题,并行计算推荐C++17的 std::原创 2025-09-02 22:43:04 · 529 阅读 · 0 评论 -
创建一个只能直接构造和销毁,但不能被复制和移动的基类
这段代码定义了一个ROS的ControllerBase基类,通过=delete显式禁用了拷贝构造、拷贝赋值、移动构造和移动赋值操作,确保该类的对象不能被复制或移动。默认构造函数和虚析构函数被保留,允许直接构造和销毁对象。这种设计常用于需要严格控制对象生命周期的场景,如单例模式或资源管理类,防止错误的拷贝操作和多个对象持有同一资源。右值引用(&&)的禁用进一步强化了不可移动性。整体上,该基类实现了仅允许构造和销毁,禁止复制和移动的语义。原创 2025-09-02 21:47:14 · 368 阅读 · 0 评论 -
C++ 左值引用与右值引用介绍
C++11引入了左右值引用机制,左值引用(T&)只能绑定左值,用于避免拷贝和参数传递;右值引用(T&&)专用于绑定临时对象,支持移动语义和完美转发,提升性能。关键区别在于:左值引用操作持久对象,右值引用处理临时值。移动构造函数和std::forward利用右值引用实现资源转移和完美参数转发。使用时需注意悬挂引用和对象状态问题。该特性显著优化了C++的资源管理效率。原创 2025-09-02 21:22:30 · 972 阅读 · 0 评论 -
什么时候需要使用虚继承,什么是菱形继承
这篇文章解释了C++中虚拟继承(virtual inheritance)的作用及其在ROS控制框架中的应用。虚拟继承主要用于解决多重继承中的菱形继承问题,确保派生类只保留一份公共基类实例。文章分析了普通继承会导致的问题,如二义性访问和数据冗余,并说明虚拟继承如何通过共享基类实例来解决这些问题。同时指出虚拟继承不应滥用,因其会带来额外开销、降低可读性、增加代码复杂度,建议仅在可能出现重复基类的场景(如框架接口类)使用。在ROS的ros_control框架中,Controller类采用虚拟继承Controlle原创 2025-09-02 19:00:34 · 633 阅读 · 0 评论 -
C++ 中的 * 与 & 运算符详解
本文介绍了C++中指针操作的两个关键符号:*(解引用)和&(取地址)。&用于获取变量内存地址,返回指针;*用于访问指针指向的值。文章解析了它们的用法差异,包括指针定义与解引用、函数参数中的引用、以及指针与引用的结合使用,并通过交换变量的示例演示了实际应用。最后总结了这两个符号在不同场景下的作用:&用于取地址,*用于解引用,同时区分了指针声明和引用传递中的符号含义。原创 2025-09-02 17:15:34 · 857 阅读 · 0 评论 -
C++ 中类模板参数的使用详解
本文介绍了C++类模板的概念及其参数类型。类模板允许将类型或数值参数化,提高代码复用性和灵活性。主要参数类型包括:类型参数(最常用,用于泛型数据结构)、非类型参数(接受常量值)和模板模板参数(参数本身是模板)。类模板支持默认参数、特化和部分特化,可针对特定需求优化实现。合理使用类模板参数能编写高度通用的类,提升代码复用性。原创 2025-09-02 16:56:04 · 573 阅读 · 0 评论 -
C++ Iterator 使用方法详解
C++迭代器是访问容器元素的通用工具,提供统一方式遍历不同结构的容器(如vector、list等)。迭代器分为五类:输入、输出、前向、双向和随机访问迭代器,功能依次增强。通过iterator、const_iterator等类型别名使用,支持解引用、移动等操作。迭代器可与STL算法结合,C++11后可用auto和范围for简化代码。使用时需注意迭代器失效和越界问题。迭代器是STL核心,能提高代码效率和可维护性。原创 2025-09-02 15:38:01 · 1172 阅读 · 0 评论 -
C++ <utility>头文件详解及使用方法
C++标准库中的<utility>头文件提供了多种实用工具,主要包括std::pair(存储键值对)、std::swap(交换对象)、std::move(实现移动语义)、std::forward(完美转发)以及std::declval(类型推导)等功能。这些工具广泛应用于泛型编程、性能优化和简化代码逻辑中,例如在容器操作、函数返回值处理和模板元编程等场景。通过合理使用这些工具,可以提升代码的效率和可读性,是现代C++开发中的重要组成部分。原创 2025-09-01 21:55:07 · 541 阅读 · 0 评论 -
stdexcept介绍与使用指南
C++ 的 <stdexcept> 头文件提供了一套标准异常类(如 out_of_range、invalid_argument 等),但这些异常需要手动抛出,不会自动应用于原生数组或容器的 operator[] 越界访问。它们的实际用途体现在: 标准库容器:vector::at() 等安全方法在越界时会主动抛出 std::out_of_range; 自定义代码:开发者可手动抛出这些标准异常类(如 if (index >= size) throw out_of_range(...)),使错误原创 2025-09-01 21:42:38 · 1026 阅读 · 0 评论 -
C++ multiset数据结构的使用情况说明
摘要: multiset(C++ STL)适用于需要动态维护有序集合且允许重复元素的场景。其特性包括自动排序(O(log n)操作)、支持重复值、迭代器稳定。典型应用包括: 动态数据(如游戏排行榜、股票价格)的实时排序 统计元素出现次数(如投票系统) 支持删除任意元素的优先队列 高效区间查询(如分数段统计) ✅ 关键区别: 需有序+重复 → multiset 需有序+去重 → set 仅统计频率 → unordered_multiset原创 2025-09-01 17:22:54 · 826 阅读 · 0 评论 -
C++关于手动抛出异常,自动抛出异常以及一些不会抛出异常的情况说明
本文介绍了C++中异常的三种抛出方式:显式抛出(使用throw关键字)、库函数/运行时自动抛出(如vector::at()越界检查、new内存分配失败)以及未定义行为导致的程序崩溃。重点说明了try-catch仅用于捕获异常而不会触发异常,并区分了标准库会抛出异常的行为(如边界检查)与原生操作可能导致的未定义行为(如数组越界访问)。文章通过代码示例演示了不同场景下的异常处理方式,帮助读者理解C++异常机制的工作原理。原创 2025-09-01 17:13:19 · 434 阅读 · 0 评论 -
C++ 用于处理异常的exception库使用指南
C++的exception库提供了异常处理机制,通过try、catch和throw关键字实现错误管理。exception类是所有标准异常的基类,包含what()方法返回错误信息。文章介绍了异常处理的基本概念、标准异常类的使用、自定义异常类的创建方法,以及异常传播机制和注意事项。异常处理能提高代码健壮性,但需注意性能开销和析构函数中的使用限制。原创 2025-09-01 17:08:33 · 352 阅读 · 0 评论 -
C++ 用于运行时类型识别的typeinfo库使用指南
C++中的typeinfo库支持运行时类型识别(RTTI),包含type_info类和typeid操作符。type_info提供类型名称获取(name())和比较功能,typeid可获取表达式或类型的type_info对象。该功能在多态编程中尤为重要,能动态识别派生类类型,但会带来一定性能开销。示例展示了如何通过typeid获取基类和派生类类型信息并进行比较。使用时需注意多态性影响和编译器差异。typeinfo为调试、日志和多态实现提供了有效工具。原创 2025-09-01 16:54:00 · 411 阅读 · 0 评论 -
C++标准库断言头文件<cassert>使用指南
<cassert>是C++标准库中用于调试断言的头文件,通过assert(condition)宏验证程序假设条件是否成立。若条件为假,程序会输出错误信息并终止。断言常用于开发阶段捕获逻辑错误,但不应用于生产环境(可通过定义NDEBUG禁用)。文中展示了除零检查和ROS硬件接口中的指针验证两个典型用例,强调断言在调试和防御性编程中的作用,同时提醒断言不应替代正常错误处理机制。合理使用断言能提升代码可靠性和可维护性。原创 2025-08-29 17:23:47 · 462 阅读 · 0 评论 -
C++模板类的详细介绍和使用指南
摘要:C++模板类是一种支持泛型编程的强大特性,通过类型参数化实现代码复用。文章介绍了模板类的基本概念、定义方式(使用template关键字)和实例化过程,并展示了多参数和非类型参数的用法。通过vector和priority_queue等STL容器示例,说明了模板类如何根据传入类型生成不同实现。同时指出模板在编译时实例化可能导致的代码膨胀问题,并提及模板特化、SFINAE等高级技巧。模板类能显著提升代码灵活性,是C++泛型编程的核心工具。原创 2025-08-29 17:01:04 · 488 阅读 · 0 评论 -
C++中float与double的区别和联系
C++中的float和double均为浮点类型,但存在显著差异:float为4字节单精度,提供约6-7位有效数字;double为8字节双精度,精度达15-16位。double数值范围更大,精度更高,现代CPU中性能接近float但更稳定。默认浮点字面量为double,float需加f后缀。建议优先使用double以确保精度,仅在存储受限或大量数据时选用float。原创 2025-08-29 15:40:18 · 737 阅读 · 0 评论 -
C++函数声明的参数名称可以不写
C++函数声明和定义在参数命名上具有灵活性:声明时可省略或使用不同参数名(编译器仅校验类型和顺序),而定义时必须指定参数名以便函数体使用。虽然语法允许差异,但为保持代码可读性,建议声明和定义采用一致的参数命名。示例显示声明中第三个参数未命名,而定义中则补充了参数名"cmd"以用于函数实现。原创 2025-08-27 15:37:02 · 357 阅读 · 0 评论 -
C++ 中 ::(作用域解析运算符)的用途
C++中的作用域解析运算符::主要用于明确指定变量、函数或类型所属的命名空间或类作用域。关键应用场景包括:访问被局部变量遮蔽的全局变量、调用特定命名空间的成员、类外定义成员函数、访问静态成员、使用作用域枚举、解决多重继承冲突、模板类成员定义,以及访问全局命名空间成员。该运算符能有效消除命名冲突,提高代码的可读性和安全性,是C++中管理作用域的重要工具。原创 2025-08-27 14:20:39 · 738 阅读 · 0 评论 -
C 语言标准输入输出头文件stdio.h及其常见用法
stdio.h是C语言标准输入输出头文件,提供格式化输入输出、字符处理、文件操作等功能。主要函数包括printf/scanf进行格式化IO,fgets/fputs处理字符数据,fopen/fclose管理文件读写。该头文件定义FILE类型和NULL、EOF等宏。使用需注意安全性,避免不安全的gets,推荐fgets替代,并注意检查返回值、及时关闭文件。stdio.h是C语言IO操作的核心,掌握其基本用法对文件处理和标准IO至关重要。原创 2025-08-23 23:27:20 · 1117 阅读 · 0 评论 -
C++的struct里面可以放函数,讨论一下C++和C关于struct的使用区别
文章摘要:本文解析了C++中struct结构体可以包含函数的原因。在C++中,struct本质上与class相同(仅默认访问权限不同),因此支持成员函数、构造函数等面向对象特性。通过UserValue示例展示了构造函数自动初始化和成员函数手动调用的区别,说明这种设计将数据与操作绑定,符合面向对象思想,使代码更模块化、易维护。C++的struct支持函数是区别于C语言的重要特性。原创 2025-08-23 22:39:06 · 531 阅读 · 0 评论 -
linux进程调度相关头文件sched.h介绍与使用指南
本文介绍了 sched.h 文件在用户态和内核态的不同作用。用户态的 <sched.h> 是 POSIX 标准的一部分,提供进程调度 API,包括调度策略、优先级设置等函数。内核态的 include/linux/sched.h 则是 Linux 调度系统的核心,定义了进程结构体 task_struct、调度类等关键内容。两者共同构成了 Linux 系统的进程调度机制,用户态通过系统调用最终作用于内核调度器。文章还对比了两者的差异并给出了用户态调度的代码示例。原创 2025-08-23 13:58:26 · 568 阅读 · 0 评论 -
C/C++ 头文件命名约定
C++头文件包含形式分为三类:1)C++原生头文件(如<iostream>);2)C++封装的C标准库头文件(如<csignal>对应C的<signal.h>);3)系统/扩展头文件(如<unistd.h>)。主要区别在于命名空间和标准化程度:C++封装版本将符号置于std命名空间,POSIX等非标准头文件保留.h后缀。最佳实践是优先使用C++封装版本(<cxxx>),系统相关头文件保持原样。原创 2025-08-23 13:53:30 · 683 阅读 · 0 评论 -
C++ csignal库详细使用介绍
C++的<csignal>库提供了处理操作系统信号的机制,允许程序响应外部事件(如用户中断或程序错误)。它支持信号处理函数注册、信号发送等核心功能,定义了常见的信号宏如SIGINT、SIGSEGV等。使用时需注意异步安全性问题,推荐使用volatile sig_atomic_t共享变量,并考虑系统差异。虽然适合简单场景,但复杂需求建议结合系统API或高级库,并注意线程安全问题。该库是C++标准库的一部分,继承自C语言的<signal.h>,提供跨平台的基本信号处理能力。原创 2025-08-22 23:40:30 · 818 阅读 · 0 评论
分享