
C/C++
文章平均质量分 58
Thalvin
嵌入式软件工程师
展开
-
TCP如何建立长连接
如果不主动关闭socket,操作系统是不会将其关闭的,这样socket所在的进程如果没有挂掉,则socket所占用的资源将一直无法回收。在长连接通信过程中,双方的所有通信都建立在1条长连接上(1次TCP连接),因此连接需要持续保持双方连接才可使得双方持续通信。由于TCP建立连接需要进行三次握手,每次建立连接都需要进行资源消耗,对于频繁请求资源的客户端而言,长连接可减少大量开销。需要注意的是,在判断连接是否断开时,可以判断recv函数是否成功,而非send函数。先启动服务端,等待客户端进行连接。原创 2024-08-08 17:06:48 · 2563 阅读 · 0 评论 -
使用GDB Sever调试程序提示Warning: Cannot insert breakpoint X. Cannot access memory at address 0xXXXXXX
问题原创 2021-11-18 00:09:12 · 4401 阅读 · 0 评论 -
Source Insight提示行尾不一致
xx\xx\filename has line endings that are not consistent.Do you want to normalize it ?原创 2021-05-27 09:50:05 · 6097 阅读 · 0 评论 -
C语言不定参数函数
文章目录C语言不定参数不定参数不定参数实现原理示例代码C语言不定参数众所周知,C语言不支持函数重载,支持函数重载的是C++。究其原因,C语言在编译函数之后,将"_函数名"存放到函数库,而C++在编译函数之后,将"_函数名_参数类型_参数类型"存放到函数库但是,在查询fcntl函数时,却发现其函数原型有多个int fcntl(int fd, int cmd);int fcntl(int fd, int cmd, long arg);int fcntl(int fd, int cmd, struct原创 2021-01-07 15:02:06 · 2463 阅读 · 0 评论 -
OpenCV拍摄图像(C++)
OpenCV拍摄图像(C++):定时拍摄和按键拍摄使用摄像头进行图像拍摄是常见的需求,一般分为两种拍照方式:定时拍照和按键拍照如果你还没有完成Linux环境下使用OpenCV调用摄像头,请参考本人另一篇博客OpenCV读取摄像头定时拍摄...原创 2020-12-16 00:03:53 · 3261 阅读 · 1 评论 -
对象数据成员的初始值
对象数据成员的初始值对象的构造函数的作用是初始化类的成员变量,但是如果我们不显式定义构造函数,编译器就会给我们定义一个默认构造函数;这个默认构造函数中其实是什么都没有做的,如果这样,我们生成该类的对象之后,它的数据成员值为多少呢?具体程序如下:#include <iostream>using namespace std;class Base{public: int val;};Base b;int main(){ Base c; Base *ba转载 2020-09-27 23:57:56 · 1390 阅读 · 0 评论 -
函数的返回值存放在哪里
函数的返回值存放在哪里调用函数时,函数的返回值存放的位置具体在哪里呢?按照概念来说,函数的返回值应该放在被调用函数运行结束之后,主调函数可以有效访问的地方,也就是说,函数返回值应当存放在主调函数开辟的栈空间但是,计算机硬件的飞速发展使得CPU的通用寄存器字长在不断增长,个数也不断增多,因此在很多情况下,函数的返回值直接被存放在了CPU的通用寄存器中,而并非一定需要计算机的内存空间具体类型的返回值的存放位置如下所示:char(8bit):寄存器a1short(16bit):寄存器axint(32原创 2020-09-23 23:40:58 · 7152 阅读 · 0 评论 -
数据类型转换操作符:const_cast、static_cast、dynamic_cast以及reinterpret_cast
文章目录数据类型转换const_cast的用法使用const_cast需要注意的问题:static_constdynamic_castreinterpret_cast数据类型转换在c++编程中,我们经常需要使用到类型转换,但可能不熟悉c++内置的四种类型转换操作符它们分别是:const_cast、static_cast、dynamic_cast以及reinterpret_cast,它们的语法形式是统一的,type_cast_operator(expression)const_cast主要用于解除转载 2020-09-20 20:42:05 · 1102 阅读 · 0 评论 -
C++宽字符类型wchar_t
C++宽字符类型wchar_t传统的字符数据类型为char,占用一个字节,存放的数据内容为ASCII编码,最多可以存放255种字符,基本的英文以及常用字符都可以涵盖随着计算机在国际范围内普及,大量使用其它语言的计算机用户也纷纷出现,传统的ASCII编码已经无法满足人们的使用,因此一种新的字符存放类型wchar_t应运而生wchar_t为宽字符类型或双字符类型,它占用两个字节,因此能够存放更多的字符wchar_t的使用实例如下所示:#include <iostream>using na原创 2020-09-20 15:49:39 · 12645 阅读 · 1 评论 -
explicit的用法
explicit的用法explicit关键字的作用是:禁止隐式调用类的单参数构造函数,主要禁用以下两种操作:禁止隐式调用拷贝构造函数禁止类对象之间的隐式转换类对象之间的隐式转换是指利用一个已经存在的其它类型的对象来创建本类的新对象,且不显式的调用类的构造函数类对象之间的隐式转换也很常见,例如:A a = 6;就是一个隐转换,它利用6创建一个A类的对象且没有显式调用A的构造函数A(66)隐式调用具体实例如下:#include <iostream>using namesp转载 2020-09-19 00:40:16 · 1470 阅读 · 0 评论 -
C++拷贝构造函数
C++拷贝构造函数拷贝(复制)构造函数是类构造函数的一种,该构造函数只有一个参数,那就是此类的引用例如:类A创建了一个对象a1,并给它赋予特定的属性,之后程序需要创建一个和a1一样的对象,那么就可以使用A a2(a1);来创建相同属性的对象如果程序员不设计类的拷贝构造函数,则编译器就会自动生成默认的拷贝构造函数,一般情况下,默认拷贝构造函数从源对象逐字节复制到目的对象拷贝构造函数被调用的情况使用一个对象初始化另一个对象具体使用实例如下:#include <iostream>原创 2020-09-17 23:54:30 · 287 阅读 · 0 评论 -
C语言函数调用过程(汇编分析)
C语言函数调用过程(汇编分析)函数调用主要的三个方面是函数名、参数列表和返回值,想要深入了解函数的调用机制,就需要深入底层,分析源文件的汇编码来分析函数调用的流程函数调用的步骤如下:函数参数传入函数栈帧开辟函数返回值函数栈帧回退所谓栈帧,就剩为一个函数调用单独分配的栈空间图片来源:简书金戈大王函数参数的传入和函数的返回值很好理解,它们函数输入和输出,但是函数栈帧的开辟和回退的具体作用又是怎样的呢?函数的本意是可以重复使用的代码块,在CPU执行程序时,是逐行执行的;如果遇到函数调用,原创 2020-09-13 23:08:36 · 1903 阅读 · 0 评论 -
volatile的用法
volatile的用法volatile是“易变的”、“不稳定”的意思。volatile是C++的一个关键字,它用来解决变量读取的一些问题在单任务中,函数体内部,如果在两次读取变量之间没有修改变量值,则编译器会编译出的可执行文件进行优化因为访问寄存器的速度大于RAM的读取速度,所以编译器会减少读取RAM的优化;假如两次访问变量之间没有修改该值,则只会在第一次访问变量时访问RAM(从RAM中读取到的值存放到寄存器),以后会直接访问寄存器但是在多任务中,虽然在两次读取变量时数据未被修改,但是程序中的其它任原创 2020-09-10 23:38:49 · 957 阅读 · 0 评论 -
不同类型的class的长度
不同类型的class的长度在计算机中,一个数据类型是有固定的长度的,例如:int、float和double等基本类型的变量,但是一个类在计算机中占据多少内存空间呢?使用sizeof运算符可以获取一个数据的长度,我们可以使用该运算符可以计算出class的长度以及其不同状态下所占据的空间大小不同类的定义以及其长度获取代码如下:#include <iostream>using namespace std;class test{ int data; double d;};原创 2020-09-08 23:42:32 · 604 阅读 · 0 评论 -
mutable的用法
mutable的用法mutable的意思是"可变的",和const的意思正好相反,其作用也是解除常函数无法修改成员变量的限制,因此mutable关键字的使用频率并不高使用mutable需要注意的问题:mutable只能作用于类的非静态和非常量数据成员mutable关键字提示编译其该变量可以被类的const函数修改mutable关键字的使用实例如下:#include <iostream>using namespace std;class student{public:原创 2020-09-07 22:18:08 · 1125 阅读 · 0 评论 -
const的用法
const的用法const是C++语言引入的一个关键字,是“不变的”、“常量”的意思。用const定义的变量,实际上是定义了一个“只读变量”,const组合变量的用法比较容易理解,但是如果配合指针、引用和函数等,就不容易理解,接下来由四个方面介绍const的用法1. const的位置const的位置比较灵活,一般来说,除了修饰一个类的成员函数外,const不会出现在一条语句的最后const使用实例:#include <iostream>using namespace std;in原创 2020-09-06 17:03:46 · 2179 阅读 · 0 评论 -
const变量定义后能被修改吗?可以
文章目录文字常量和常变量文字常量常变量修改const变量的值文字常量和常变量常量可以直观的理解为“值不可改变的量”。在C++中,常量分为文字常量和常变量文字常量文字常量又称为“符号常量”,经编译之后写在代码区,是不可寻址的。而常变量同其它变量一样被分配空间,是可以寻址的文字常量包括数值常量、字符常量和符号常量,其特点就是编译后写在代码区,不可寻址,不可更改程序中有些特殊的标识符或表达式由于满足文字常量的两个条件:不可寻址、不可改变,也可以将它们视为文字常量。它们分别是:静态数组名、枚举常量、全局原创 2020-09-06 14:50:05 · 3461 阅读 · 0 评论 -
C/C++获取字符数组元素个数
sizeof是C/C++中的一个操作符,用于返回传入的数据的长度(字节数)对于一般的元素类型来说,我们通常使用sizeof获取其长度,也习惯使用其获取数据的长度,但是如果对字符数组或者指针进行sizeof操作,往往无法得到我们预期的结果需要获取字符数组长度时,推荐使用strlen函数原创 2020-08-26 23:48:35 · 9465 阅读 · 0 评论 -
函数调用不添加括号代表什么?
函数调用不添加括号代表什么?原创 2020-08-20 23:38:41 · 4773 阅读 · 0 评论 -
#define中定义函数可以使用另一个#define定义的变量吗?
我们都知道#define可以在程序预编译期间对代码进行替换,前两天遇到了一个问题,问预定义的函数中是否可以使用预定义的变量,问题描述可能略微复杂,详细内容如下:#include <stdio.h>#define N 3#define M N*2#define Add(n) N+nint main(){ printf("The add val is: %d\n",Add(5)); printf("The m val is: %d\n", M); return原创 2020-08-01 19:24:11 · 2413 阅读 · 2 评论 -
面试题----如何判断一个字符串是否为合法的IP地址(C++)
如何判断一个字符串是否为合法的IP地址。要求:1. 不能使用正则表达式和自带的库函数。2. 列出全部测试用例,并给出原因。原创 2020-07-25 11:06:46 · 2425 阅读 · 0 评论 -
string如何转为char*(string::data()和string::c_str)
string类对象转为char*string类是c++引入的,引入之后,大大方便了对字符串进行各种操作,但c语言的大多数函数不支持string类型的参数,因此string引入了这个函数用于将string类型的对象转换为char*例如:#include <iostream>#include <string>using namespace std;int main(){ string str; str = "1.txt"; FILE *file = fopen(原创 2020-07-21 23:12:31 · 734 阅读 · 0 评论 -
结构体知识进阶
文章目录结构体知识进阶位域存放函数指针动态结构体的使用结构体知识进阶总所周知,结构体是C语言中重要的数据类型,可以存放多种不同类型的数据结构体的一般用于存放类型不同但是又相互关联的数据,例如:一个人的身份信息包括姓名、性别、年龄和身份证号,这些数据需要由不同的数据类型存放,但是又都表示一个人的信息,这时一般会使用到结构体对该数据进行存储,但是结构体所能够支持的不止如此接下来,我将介绍几种开发中常用的结构体的高级操作位域我们都知道,C语言中不包含bool类型,需要表示true或false时一般使用原创 2020-06-29 23:09:16 · 489 阅读 · 0 评论 -
C++创建类的对象的两种方法
创建类现有一个学生类Student,它的定义如下:class Student{ private: char *name; int age; float score;};常见的C++创建类的对象的两种方法如下:第一种:Student stu;stu.name = “xiaoming”;stu.age = 20;stu.score = 9...原创 2019-12-24 10:59:19 · 9845 阅读 · 0 评论 -
单链表的创建与输出(C++)----用于实现学生管理系统
单链表又叫线性链表或单向链表。它是线性表的来链接储存表示。使用单链表储存结构时,其数据元素只存在逻辑联系而不存在物理联系,能够很好的解决数据溢出问题。单链表中的每个数据都储存在链表节点中,每个节点结构体中有两个储存域:数据域和指针域。其中,数据域中储存链表节点的数据元素,指针域储存了指向该链表节点的下一个节点的指针。链表结构体如下所示:typedef struct node{ int da...原创 2018-07-14 18:57:34 · 16645 阅读 · 2 评论 -
C语言编译执行过程
一、C语言的编译执行过程我们在C语言编辑的文件是以.c为文件拓展名的,称为源文件;C语言编译器的功能就是将源文件,经过编译、链接之后可以形成可执行文件那么具体的步骤是什么呢?C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-->可执行文件二、编译执行过程详解第一步:在编辑器中编辑源文件第...原创 2019-09-27 15:56:59 · 3728 阅读 · 0 评论