![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
cpp
文章平均质量分 74
XX風
翻山越岭
展开
-
cmake中使用vcpkg
(2) CMake 项目中的 vcpkg | Microsoft Learn. https://learn.microsoft.com/zh-cn/vcpkg/users/buildsystems/cmake-integration.(4) 在CMake工程中使用vcpkg提供的库 - CSDN博客. https://blog.csdn.net/xiyangmo/article/details/119650550.来管理你的第三方依赖库,并将它们集成到 CMake 项目中。希望这对你有所帮助!原创 2024-04-29 15:46:14 · 668 阅读 · 0 评论 -
基于libssh2拷贝文件夹下所有文件到本地目录
基于libssh2,使用层次遍历的方式,从远端拷贝文件到本地目录,支持所有目录(等同于ssh -r效果)原创 2024-04-26 17:31:15 · 278 阅读 · 2 评论 -
D-Bus API设计指南(译文)
摘要D-Bus的最常见用途是实现一项服务,该服务将被多个客户端程序使用,因此,在总线上导出的所有接口都形成一个公共API。设计D-Bus API就像设计任何其他API:都有很大的灵活性,但是要遵循一些设计模式并避免反模式。本指南旨在说明编写D-Bus API的最佳实践。多年来,在许多项目中使用D-Bus对其进行了完善。对于使用诸如GDBus这样的通用D-Bus库来实现api,将给出建议,但是详细的实现说明留给了库的文档。请注意,您不应使用的 dbus-glib 实现 D-Bus 的服务,因为它已被废弃,翻译 2020-11-17 10:16:01 · 1551 阅读 · 0 评论 -
信号与信号量的区别
信号与信号量的区别:1.信号:(signal)是一种处理异步事件的方式。信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程外,还可以发送信号给进程本身。2.信号量:(Semaphore)进程间通信处理同步互斥的机制。是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。...原创 2021-02-25 10:12:05 · 616 阅读 · 0 评论 -
c++线程中的几种锁
这个是在中兴面试中被面试问到的一个题“你知道线程中的自旋锁么?”,我当时一脸懵逼,不知道。回来后整理下,在这里对线程中的锁进行一个学习。线程之间的锁有:互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言,锁的功能越强大,性能就会越低。1、互斥锁互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量。也就是说是为了避免多个线程在某一时刻同时操作一个共享资源。例如线程池中的有多个空闲线程和一个任务队列。任何是一个线程都要使用互斥锁互斥访问任务队列,以避免多个线程同时访问任务队列以发生错乱。在某一时刻原创 2021-03-15 16:33:46 · 1381 阅读 · 0 评论 -
char* 和 char[]的区别
#char* 和 char[]的区别从一开始写c 程序,我就一直有一个疑惑,当自己动手写的时候这个问题依旧存在,这引起了我的思考,这也许是一个很基础的问题但是确实一个十分重要的问题,不能眼高手低,踏踏实实体会char *string ="hello" 和 char string[] = "hello";前面改变他的内容是十分容易崩溃的,但是后者改变他的内容是完全正确的 一.首先要搞清楚内存分配 1.内存分配有以下几部份内容组成 1)栈区,由编译器自动释放和分配,转载 2021-03-03 13:47:46 · 237 阅读 · 0 评论 -
字符串常量到底存放在哪个存储区
**字符串常量,放在哪个存储区呢?是“自动存储区”还是“静态存储区”中?比如:char *pstr=“hello world!”;这里,"hello world!"是一个字符串常量,pstr是在栈中的变量。我想问,字符串常量,在哪个内存区域分配空间呢?好像应该不是在“栈区“分配空间吧!!!****一、预备知识—程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈转载 2021-03-02 22:59:35 · 2809 阅读 · 0 评论 -
C++ COM编程之接口背后的虚函数表
这篇文章主要介绍了C++ COM编程之接口背后的虚函数表,COM的背后,就是接口,而接口的背后,就是虚函数表,需要的朋友可以参考下前言学习C++的人,肯定都知道多态机制;多态就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。对于多态机制是如何实现的,你有没有想过呢?而COM中的接口就将这一机制运用到了极致,所以,不知道多态机制的人,是永运无法明白COM的。所以,在总结COM时,是非常有必要专门总结一下C++的多态机制是如何实现的。多态什么是多态?上面也说了,多态就是.原创 2021-02-05 23:01:37 · 348 阅读 · 0 评论 -
C++ COM编程之什么是接口?
这篇文章主要介绍了C++ COM编程之什么是接口?在C++中,可以使用抽象基类来实现COM接口,需要的朋友可以参考下什么是接口?说到COM,就不得不说接口了;在进行COM开发的过程中,可以说,我一直都在和各种各样的接口打交道。那接口是什么?对于COM来说,接口是一个包含一个函数指针数组的内存结构,每一个数组元素包含的是一个由组件所实现的函数的地址;所以,对于COM,接口就是这样的一个内存结构,其它东西都是一些COM并不关心的实现细节。在C++中,可以使用抽象基类来实现COM接口。由于一个COM组件.原创 2021-02-05 23:00:24 · 1004 阅读 · 0 评论 -
C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结
前言这篇文章总结的是C++中的类型转换,这些小的知识点,有的时候,自己不是很注意,但是在实际开发中确实经常使用的。俗话说的好,不懂自己写的代码的程序员,不是好的程序员;如果一个程序员对于自己写的代码都不懂,只是知道一昧的的去使用,终有一天,你会迷失你自己的。C++中的类型转换分为两种:1.隐式类型转换;2.显式类型转换。而对于隐式变换,就是标准的转换,在很多时候,不经意间就发生了,比如int类型和float类型相加时,int类型就会被隐式的转换位float类型,然后再进行相加运算。而关于隐式转换不转载 2021-02-05 21:46:18 · 334 阅读 · 0 评论 -
C++中的RTTI机制详解
前言RTTI是”Runtime Type Information”的缩写,意思是运行时类型信息,它提供了运行时确定对象类型的方法。RTTI并不是什么新的东西,很早就有了这个技术,但是,在实际应用中使用的比较少而已。而我这里就是对RTTI进行总结,今天我没有用到,并不代表这个东西没用。学无止境,先从typeid函数开始讲起。typeid函数typeid的主要作用就是让用户知道当前的变量是什么类型的,比如以下代码:复制代码 代码如下:#include #include using namespac转载 2021-02-05 21:44:29 · 803 阅读 · 1 评论 -
c++怎么调用c函数 为什么生成的符号不一样
C C++相互调用在项目中融合C和C++有时是不可避免的,在调用对方的功能函数的时候,或许会出现这样那样的问题,但只要我的C代码和我的C++代码分别都能成功编译,那其他就不是问题。近来在主程序是C语言,而调用C++功能函数的时候,C++的*.h头文件都能找到,功能函数也都定义了,最重要的是,单独编译C++的时候,完全没有问题,但当用主程序的C调用C++的功能函数时,总是提示该函数未定义(undefined),这里分析问题的出处便是混合调用出现的问题了。关键点在这里:我们就靠在C++的*.h和*.cpp的原创 2021-02-04 17:43:12 · 672 阅读 · 0 评论 -
【C++基础之二十一】菱形继承和虚继承
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/17877219菱形继承是多重继承中跑不掉的,Java拿掉了多重继承,辅之以接口。C++中虽然没有明确说明接口这种东西,但是只有纯虚函数的类可以看作Java中的接口。在多重继承中建议使用“接口”,来避免多重继承中可能出现的各种问题。1.菱形继承先看一下菱形继承长什么样。B和C从A中继承,而D多重继承于B,C。那就意味着D中会有A中的两个拷贝。因为成员函数不体现在类的内存大小上,所转载 2021-02-04 17:14:39 · 192 阅读 · 0 评论 -
浅析C++智能指针和enable_shared_from_this 机制
The following article is from 后端技术小牛说 Author 小牛后端技术小牛说微软程序员,关注获取大厂内推](#)来自公众号:后端技术小牛说大家好,我是小牛,今天跟聊一下 BAT 面试 C++ 开发工程师必问的一个考点:智能指针。小艾:你昨晚面 C++ 去了?小牛:对啊,不是这个厂主要技术栈都是 C++ 嘛,我就面去了。小艾:问了点啥啊?小牛:BAT 这 C++ 问的都差不多,又问智能指针了。小艾:那来讲讲呗。小牛:来。智能指针的引入大家都知道,指.转载 2021-02-04 15:53:40 · 295 阅读 · 0 评论 -
各种输出函数的比较(printf/fprintf/sprintf/snprintf/vprintf/vfprintf/vsprintf/vsnprintf)
对于程序猿来说,printf函数可以说是最熟悉的一个工具了。利用它可以将各类调试信息输出到指定的设备(比如串口)中,实现对程序运行状态的掌控和分析。不过,在实际的应用中,相信大家除了printf函数之外,应该还见过几个与其类似的函数,包括fprintf、sprintf、snprintf、vprintf、vfprintf、vsprintf、vsnprintf等等。那么,这些看上去很类似的函数之间,到底有什么区别,各自的作用到底是什么?今天就来总结一下。首先列出全部的函数申明,以供参考。#include &转载 2021-01-31 19:34:22 · 969 阅读 · 0 评论 -
C/C++引用和指针的区别
为什么C/C++语言使用指针?答案:①一方面,每一种编程语言都使用指针。不止C/C++使用指针。每一种编程语言都使用指针。C++将指针暴露给了用户(程序员),而Java和C#等语言则将指针隐藏起来了。“Everything uses pointers. C++ just exposes them rather than hiding them,”It’s easier to give someone an address to your home than to give a copy of yo原创 2021-01-21 17:52:12 · 279 阅读 · 1 评论 -
Pimpl技术的基本应用
Pimpl 意思为“具体实现的指针”(Pointer to Implementation),它通过一个私有的成员指针,将指针所指向的类的内部实现数据进行隐藏,是隐藏实现,降低耦合性和分离接口实现的一个现代 C++ 技术,并有着“编译防火墙(compilation firewall)”的名头。Pimpl技术的基本应用其中利用了C++11的std::unique_ptr来让Impl指针的内存更易受控制。此外由于声明了析构函数,导致默认的移动构造/赋值函数不能生成,若默认行为符合自己的需求,则需显式声明原创 2021-01-09 00:05:34 · 453 阅读 · 0 评论 -
C++之善用PIMPL技巧
PIMPL(Pointer to Implementation)这个手法可以解決/改善C++编码时常碰到的2大问题。1.class增加private/protected成员时,使用此class的相关 .cpp(s) 需要重新编译。2.定义冲突与跨平台编译Q1.class增加private/protected成员时,使用此class的相关 .cpp(s) 需要重新编译假设我们有一个A.h(class A),並且有A/B/C/D 4個.cpp引用他,他们的关系如下图:如果A class增加了priv原创 2021-01-08 23:58:00 · 260 阅读 · 0 评论 -
指针的初识和解引用
让我们来 看一下以下的代码int a=10;int b=20;int *p= &a;*p=10;p=&b;*p=200;p=&a;int **pp=&p;*pp=&a;**pp=1000;*pp=&b;**pp=2000;看到这样的代码是不是一脸的懵逼,现在让我们来看看他的每一句都是什么意思。开始之前我们先了解一下指针和解引用。指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(pointsto)存在电脑存储器转载 2021-01-08 21:46:52 · 589 阅读 · 1 评论 -
STL标准库常见面试题(一)
本博客内容:参考:https://blog.csdn.net/tianya_team/article/details/50753759https://www.cnblogs.com/wulala1119/p/4758345.htmlhttps://blog.csdn.net/weixin_41055260/article/details/109249974一、vector的底层(存储)机制二、vector的自增长机制三、list的底层(存储)机制四、什么情况下用vector,什么情况下用lis转载 2021-01-08 10:46:29 · 730 阅读 · 0 评论 -
派生类不继承基类的static成员
我们可以1、在派生类中引用基类型的静态字段,2、通过派生类类型引用基类的静态字段,例如:public class Base { public static int test = 0; } public class Derived : Base { public void Method() { test = 100; } } public class Program { static void Main(string\[\] args) { Der原创 2021-01-07 22:22:26 · 865 阅读 · 0 评论 -
详解C++ RAII机制
什么是RAII?RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。为什么要使用RAII?上面说到RAII是用来管理资源、避免资源泄漏的方法。那么,用了这么久了,也写了这么多程原创 2021-01-07 21:33:39 · 800 阅读 · 0 评论 -
C++四种类型转换运算符
上节讲到,隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,让程序员意识到自己在做什么。但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有表明存在什么风险,风险程度如何。再者,C风格的强制类型转换统一使用( ),而( )在代码中随处可见,所以也不利于使用文本检索工具(例如 Windows 下的 Ctrl+F、Linux 下的 grep 命令、Mac 下的 Command+F)定位关键代码。为了使潜在风险更加细化,使问题追溯更加方便,使书写格式更加转载 2021-01-07 00:00:22 · 311 阅读 · 1 评论 -
gcc的-g,-o,-c,-D,-w,-W,-Wall,-O3等参数的意义
一、-g-g可执行程序包含调试信息-g为了调试用的加个-g 是为了gdb 用,不然gdb用不到二、-o-o指定输出文件名-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。一般语法:gcc filename.c -o filename上面的意思是如果你不打 -o filename(直接gcc filename.c )那么默认就是输出a.out.这个-o就是用来控转载 2021-01-06 20:39:25 · 7356 阅读 · 0 评论 -
[c++11]右值引用、移动语义和完美转发
c++中引入了右值引用和移动语义,可以避免无谓的复制,提高程序性能。有点难理解,于是花时间整理一下自己的理解。左值、右值C++中所有的值都必然属于左值、右值二者之一。左值是指表达式结束后依然存在的_持久化对象_,右值是指表达式结束时就不再存在的_临时对象_。所有的具名变量或者对象都是左值,而右值不具名。很难得到左值和右值的真正定义,但是有一个可以区分左值和右值的便捷方法:看能不能对表达式取地址,如果能,则为左值,否则为右值。看见书上又将右值分为将亡值和纯右值。纯右值就是c++98标准中右值的概念,如非转载 2021-01-05 20:11:26 · 163 阅读 · 0 评论 -
申明(声明)、定义及默认参数
变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定bai义。变量声明:用于向程序表明变量的类型和名字。区别:定义也是声明,extern声明不是定义。定义分配存储空间,而声明不会。通过使用extern关键字声明变量名而不定义它。 事实上它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。只有当声明也是定义时,声明才可以有初始化式,因为只有定义才分配存储空间。例如:extern int a其中变量a是在别的文件中定义的。前者是"定义性声明(def原创 2021-01-05 19:59:14 · 1307 阅读 · 0 评论 -
头文件|命名空间书写规范
菜鸟编程需要知道的规范。1,头文件尽量包含在cpp文件里,而不是h文件里放在.cpp文件中是比较安全的,文件在多次递归包含后很容易出现一些定义和声明上的问题。放在cpp中可以减小头文件依赖,可以提高编译速度。所以,能放在cpp中的,就不要放在h中。只有头文件必须用到的放到头文件,头文件中可以使用前置声明来代替。或者所有cpp都用到的也可以放到头文件。哪里用到就放哪里,谁用谁包含。一般是默认放在cpp里,之后如果出现.h也用了,再把cpp中的删了。2,不要在头文件中使用using names转载 2021-01-05 19:48:53 · 978 阅读 · 0 评论 -
#pragma once与#define的区别
#pragma once是一个比较常用的C/C++预处理指令,只要在头文件的最开始加入这条预处理指令,就能够保证头文件只被编译一次。外文名#pragma once释 义一个比较常用的C/C++杂注作 用使头文件只被编译一次目录1 概述2 具体写法3 比较概述编辑#pragma once是编译器相关的,有的编译器支持,有的编译器不支持,具体情况请查看编译器API文档,不过大部分编译器都有这个预处理指令了。#ifndef,#define,#endif是C/C++语言中的宏定义,通过宏原创 2021-01-05 19:34:45 · 501 阅读 · 0 评论 -
C++ STL 四种智能指针
文章目录0.前言1.unique_ptr2.auto_ptr3.shared_ptr3.1 shared_ptr 简介3.2 通过辅助类模拟实现 shared_ptr4.weak_ptr4.1 weak_ptr 简介4.2 weak_ptr 用法4.3 weak_ptr 的作用5.如何选择智能指针参考文献0.前言C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr、unique_ptr转载 2021-01-04 22:53:07 · 502 阅读 · 0 评论 -
从多态性谈动态联编的必要性
多态性是C++最主要的特征,多态性的实现得益于C++中的动态联编技术。文章通过对动态联编的关键技术虚拟函数表进行深入的剖析,解析的动态联编的过程极其技术要领。概念:静态联编也叫早绑定动态联编运行时绑定或者晚绑定一 从多态性谈动态联编的必要性在进入主题之前先介绍一下联编的概念。联编就是将模块或者函数合并在一起生成可 执行代码的处理过程,同时对每个模块或者函数调用分配内存地址,并且对外部访问也分配正确的内存地址。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。在编译阶段就将函数原创 2021-01-02 23:07:58 · 200 阅读 · 0 评论 -
c++继承的部分规则
赋值兼容规则:父类指针既可以指向父类对象,也可以指向子类对象。当父类指针指向父类对象时,访问父类的成员;当父类指针指向子类对象时,那么只能访问子类中从父类继承下来的那部分成员,不能访问子类独有的成员,如果访问,编译阶段会报错;函数隐藏:是指当子类中有和父类同名的成员变量时,此时子类中有两个名字相同的成员变量。此时用父类指针指向子类对象,来访问父子类中名字相同的成员变量时,由于赋值兼容规则,此时绝对访问的是继承来的父类的同名成员变量。但是,如果我们在子类内部或者用子类的对象在子类外部访问此同名成员,此时编译原创 2021-01-02 22:49:08 · 260 阅读 · 0 评论 -
详解浅拷贝、深拷贝、写时拷贝
c++拷贝初级1 浅拷贝1.例如对于下面的String类,它包含一个成员变量,一个char*的指针:class String{private: char* _str;};2.对于String类的拷贝构造函数及operator=函数来说,当用一个String对象拷贝构造或赋值给另一个String对象时,就是将这个对象里的指针的值赋值给另一个对象里的指针。将一个指针值赋值给另一个指针,就会使得两个指针指向同一块空间,这就产生了浅拷贝。3.下面就是浅拷贝的代码:class Stri转载 2021-01-02 19:09:03 · 255 阅读 · 0 评论