自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 问答 (2)
  • 收藏
  • 关注

原创 MyVimrc

IMvimrcforOpenVMSsys" out.“evim”finishendif"else" endifendifendifau!" The!" packadd!matchit" endifset rulerset nusyntax on.cpp,.h,.cpp,.h,.cpp,

2025-04-15 16:07:18 585

原创 makefile学习mk4 Linux系统编程

你提供的 Makefile 定义了一个基本的 C 项目的构建过程。让我逐行解析这个 Makefile 的每个部分:⸻CC = gccAS = as⸻.s.o:这条规则是用来将汇编源文件(.s 文件)编译成目标文件(.o 文件)。然而,这个规则有些问题,as 命令不需要 -o $< -o $@,正确的用法应该是:.s.o:⸻.c.o:这条规则表示将 C 源文件(.c 文件)编译成目标文件(.o 文件)。是源文件,@ 是目标文件。这里 -c 表示只进行编译而不链接。⸻。

2025-03-23 18:38:35 619

原创 在 coc.nvim 插件中,自动补全时,候选词后面的 大写字母

在 coc.nvim 插件中,自动补全时,候选词后面的 大写字母 表示的是 补全项的来源。这通常用于指示当前候选项来自哪个补全源,帮助你理解候选项的来源是什么。这些大写字母帮助用户识别候选项的来源,特别是在有多个补全源同时提供补全时,能够帮助你选择最合适的补全项。6. P - 来自路径补全:表示补全项来自文件路径的补全,比如输入路径时的文件名补全。1. C - 来自 coc 插件:表示补全项是由 coc.nvim 插件本身提供的。5. B - 来自缓冲区(Buffer):表示补全项来自当前缓冲区内的文本。

2025-03-23 17:57:15 416

原创 Lua 的 Neovim 常用配置

以下是一份基于 Lua 的 Neovim 常用配置指南,涵盖基础设置、插件管理、代码补全、语法高亮、文件导航等核心功能。所有配置基于现代最佳实践,支持模块化扩展。

2025-03-23 17:24:38 448

原创 在 macOS 上安装 coc.nvim(推荐方式)

coc.nvim 是基于 Node.js + LSP 的自动补全插件,支持 C/C++、Python、JavaScript、Go 等多种语言,非常适合 Vim 作为 IDE 使用。这样,你的 Vim 就具备了强大的 代码补全和智能联想功能,体验接近 VS Code 了!然后输入 std::,看看是否出现补全菜单,如果出现补全窗口,则安装成功!在 macOS 上安装 coc.nvim(推荐方式)📌 4. 安装 C++ 补全(coc-clangd)📌 3. 安装 coc.nvim。

2025-03-23 16:25:40 540

原创 CMake与make的区别

CMake 和 Make 都是用于构建和编译项目的工具,但它们的作用和用途不同。

2025-03-23 14:57:30 893

原创 gcc -fPIC 选项

• 当编译源代码时,使用 -fPIC 生成的代码会尽量避免硬编码的地址,它会使用相对地址(比如通过基址寄存器访问变量和函数),从而使代码能够在加载时动态定位。在上述例子中,-fPIC 使得 mylib.o 中的代码能够在不同的内存地址中加载,而 -shared 选项用于生成共享库 libmylib.so。• 创建共享库(动态库):共享库需要位置无关代码,因为它们可能在不同的进程中加载到不同的内存地址。• 它确保代码能够在内存的任意位置执行,使得库能够在不同的进程中共享,避免了地址冲突的问题。

2025-03-23 14:49:19 217

原创 -E -S -o全称

E Expand macros & process Includes 仅执行预处理,不进行编译。这些选项都是 UNIX 编译器(如 GCC)长期沿用的缩写,方便用户快速操作。-S Stop before Assembling 仅编译到汇编,不进行汇编。编译后生成 my_program 而不是默认的 a.out。这会生成 main.s,其中包含 C 代码转换后的汇编指令。这会生成 main.i,其中包含展开的头文件和宏。-o Output file 指定输出文件名。

2025-03-23 10:59:41 225

原创 .o .s .i的含义

i Preprocessed file(预处理文件) “Intermediate” 或 “Include-expanded”• 这些后缀名的使用起源于 Unix 和早期 C 编译器(如 AT&T 的 PCC 和 GCC),后来成为业界标准。所以,这些扩展名的命名是 UNIX 传统、编译流程的需求以及简短易记的原则共同决定的!.o、.s、.i 这些后缀名的命名通常是历史习惯和文件用途决定的。.o Object file(目标文件) “Object”(目标)

2025-03-23 10:57:01 154

原创 编译过程中不同文件的后缀名意义

在 C 语言的编译过程中,不同阶段会生成不同后缀的文件,同时可以使用不同的编译选项来控制编译流程。gcc -c main.s -o main.o # 进行编译+汇编(不链接),生成 main.o。gcc -S main.i -o main.s # 只进行编译(不汇编),生成 main.s。gcc -E main.c -o main.i # 只进行预处理,生成 main.i。这样,.o、.s、.i 及 -E、-S、-c 这些选项的作用就清楚了!.c C 源代码文件 C 语言的原始源代码文件。

2025-03-23 10:56:22 256

原创 C语言编译为可执行文件的步骤

gcc main.c -o main -lm # 链接数学库(libm.so)这样,你就完成了 C 语言程序从源码到可执行文件的整个编译流程!

2025-03-23 10:47:52 176

原创 makefile 赋值

这实际上是变量作用域的一种表现,因为Makefile的变量作用域是全局的,后面的赋值会覆盖前面的赋值。如果变量的值依赖于其他变量,而这些变量的值在后续可能被修改,那么使用这种方式是很合适的。选择哪种赋值方式取决于你的具体需求,比如变量的值是否需要依赖于其他变量的后续修改,或者你是否希望变量在Makefile的不同部分具有不同的值等。这种方式是“直接”的或“静态”的,意味着变量的值在赋值时就被确定下来,后续对依赖变量的修改不会影响到这个变量的值。的值也不会改变,因为它在赋值时就已经确定了。

2024-08-09 16:44:34 325

原创 需要拷贝操作的类也需要赋值操作,反之亦然

在C++中,确实存在一种普遍的观点,即如果一个类需要自定义拷贝构造函数(copy constructor)来处理对象的拷贝,那么它很可能也需要自定义拷贝赋值运算符(copy assignment operator)来处理对象的赋值。反之亦然,如果一个类需要自定义拷贝赋值运算符,那么它也很可能需要自定义拷贝构造函数。这是因为这两个操作通常都涉及到对象内部资源的复制或管理,而它们之间的需求往往是相似的。然而,需要注意的是,这并不是一个绝对的规则。

2024-07-19 09:47:52 310

原创 C++ 需要析构函数的类也需要拷贝和赋值操作

防止浅拷贝:默认的拷贝构造函数和拷贝赋值运算符执行的是浅拷贝,即只复制对象成员变量的值。如果类包含指向动态分配内存的指针,浅拷贝会导致两个对象指向同一块内存,从而在销毁时发生重复释放的错误(double-free),或者在一个对象销毁后,另一个对象访问已释放的内存(use-after-free)。深拷贝:为了安全地复制对象,需要实现深拷贝,即创建资源的新副本,并将新副本的地址赋给新对象的指针成员。资源所有权:在某些情况下,类的设计可能要求对象对资源拥有唯一所有权(如智能指针)。

2024-07-19 09:36:07 377

原创 三/五法则

C++的三五法则是类设计中的一个重要原则,它帮助开发者理解和管理类的拷贝控制操作。通过遵循这些规则,开发者可以避免常见的资源泄露、重复释放等问题,并优化程序的性能。在实际开发中,应根据类的具体需求来决定是否需要自定义这些特殊的成员函数。

2024-07-19 09:27:29 412

原创 struct和class区别

总结来说,struct和class在类型、继承性、构造函数、内存管理、修饰符和特性、初始化、参数传递、职能和应用场景等方面存在显著的差异。这些差异使得它们在不同的编程场景和需求下有不同的适用性和优势。struct和class在编程中确实存在显著的差异,这些差异主要体现在它们的类型、继承性、构造函数、内存管理、以及使用场景等方面。转载自 百度 文言一心。

2024-06-29 20:03:58 825

原创 C++ Primer 421页 我们不能将 StrBlobPtr 绑定到一个 const StrBlob 对象。这个限制是由于构造函数接受一个非 const StrBlob 对象的引用而导致的

对象,你期望的是任何指向它的指针或引用都不应该能够修改这个对象。在实际应用中,你可能还需要考虑其他因素,比如线程安全、异常安全性等。的,这也将是未定义的行为。提供一个额外的构造函数,该构造函数接受一个。这个构造函数可以创建一个只能读取的。正确性的要求,因为它仍然持有一个到非。提供更严格的限制,以确保它不会违反。引用,那么它确实不能用于指向一个。对象不能被修改,因此如果你有一个。对象中存储的字符串的引用。,那么它内部可能会修改传入的。这个类,它通常被设计为与。转载自 百度 文言一心。的构造函数接受一个非。

2024-06-29 19:32:40 242

原创 glibcxx、glibc、libstdc++、GCC和g++之间的关系

这些组件在软件开发中各自扮演不同的角色,但彼此之间相互依赖,共同构成了GNU/Linux和其他类Unix系统中软件开发的基础。

2024-06-20 21:10:32 1074 2

原创 C++ 已经有auto了,为什么还需要尾置返回类型

auto 与 尾置返回类型

2024-05-12 16:08:07 516

原创 C++开发Vim常用配置

以上是一些常用的Vim配置建议,你可以根据自己的需求和习惯进行调整。记得将这些配置保存在你的Vim配置文件(通常是。)中,以便在Vim启动时自动加载。以上内容来自百度文心一言。

2024-05-12 08:04:07 428

原创 git 撤回某次commit

要撤回某次commit,你可以使用git revert命令。这将创建一个新的commit,它将撤消指定commit所做的更改。请注意,使用git reset --hard命令会丢失所有未提交的更改,所以在使用前请确保你不需要这些更改。在这里,^符号表示commit的父提交。git 撤回某次commit。提示:AI自动生成,仅供参考。

2024-05-11 09:01:03 795 1

原创 lldb常用调试命令

lldb常用命令

2024-05-10 07:27:26 897

原创 MacOS 本机状态常用查询指令

请注意,上述命令可能因 macOS 版本的不同而有所差异。如果你在使用过程中遇到问题,建议查阅相关的 macOS 文档或寻求专业的技术支持。在 macOS 的终端中,你可以使用多种命令来查询本机的状态信息。(如果你在使用笔记本电脑)

2024-05-01 10:44:23 907

原创 C++编译 error:‘virtual xxxx‘ is protected

在C++中,当编译器遇到一个错误信息提示“‘virtual xxxx’ is protected”时,这通常意味着你正在尝试从一个派生类的成员函数中调用一个基类中被声明为protected的虚函数。为了解决这个编译错误,你需要确保你的派生类中的函数正确地继承并实现了基类中声明为protected的虚函数。如果你需要从外部访问这个虚函数,你可能需要在基类中提供一个public的非虚拟接口来调用它,或者在派生类中提供一个public的虚拟接口来覆盖它。// 调用protected的虚函数。

2024-04-28 10:57:18 423

原创 计算机网络常识汇总

CUDA解码技术直接调用GPU中的流处理器进行解码运算,这相较于之前调用GPU中相应的专用视频解码模块,大大提升了计算效率。在实际应用中,无论是深度学习模型的训练,还是中间变量和计算过程的处理,都可以放在GPU上以充分利用硬件加速。CUDA提供了一种可扩展于C、C++、Python和Fortran等语言的编码接口,并行化后的代码能够在NVIDIA GPU上运行,以大幅加速应用程序。随着技术的不断发展和项目的复杂性增加,开发者还需要不断学习和更新自己的知识体系,以适应新的挑战和需求。

2024-04-18 13:38:10 552 1

原创 Linux C++开发需要掌握一系列的技能

这些技能构成了Linux C++开发的核心能力。随着技术的不断发展和项目的复杂性增加,开发者还需要不断学习和更新自己的知识体系,以适应新的挑战和需求。Linux C++开发需要掌握一系列的技能,这些技能涵盖了编程语言、系统编程、网络编程、开发工具等多个方面。

2024-04-18 13:35:29 389 2

原创 C++常识汇总

重定义通常指的是在C++中,当派生类继承基类时,如果派生类中的成员与基类中的成员具有相同的名称,则派生类的成员会隐藏基类的成员。这被称为名称隐藏或重定义。在这种情况下,通过派生类对象访问该成员时,将访问派生类中的成员而不是基类中的成员。要访问基类中被隐藏的成员,需要使用作用域解析运算符(::)。需要注意的是,重定义与重写不同。重写是子类对父类方法的扩展或修改,而重定义则是派生类成员隐藏了基类成员。重载是在同一作用域内使用相同的函数名但不同的参数列表来定义多个函数。

2024-04-18 11:15:32 734 1

空空如也

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

TA关注的人

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