C/C++
文章平均质量分 69
主要分享C/C++开发相关的知识
WongKyunban
这个作者很懒,什么都没留下…
展开
-
在类Unix平台实现TCP服务端
我们没有指定hints.ai_family = AF_INET或 AF_INET6,因为getaddrinfo可以动态决定它的具体类型,也就是我们可以同时兼容IPv4 和IPv6.上一步只是用本地地址信息创建了socket,还要将这个socket与本地地址绑定起来,才能真正关联起来。由bind函数来完成。调用listen函数让socket可以监听外界对它的访问。我们这里设置了最多有10个等待处理的进来的访问,换句话说,原创 2024-04-07 00:42:41 · 451 阅读 · 0 评论 -
在类Unix平台实现TCP客户端
我们这个TCP客户端将从命令行接收两个参数,一个是IP地址或域名,另一个是端口,并尝试连接在这个IP地址的TCP服务端。原创 2024-03-17 18:55:39 · 1088 阅读 · 0 评论 -
C++ lock_guard的使用
它的构造函数接受一个互斥量my_mutex初始化了一个对象,因为是在test()函数中调用的,那么构造出来的对象会被放到栈内存空间。在构造时,它顺便调用了mutex的lock函数,对函数体进行了加锁,当test()函数执行完时,栈里的东西都会被销毁,包括创建出来的lock_guard对象,此时lock_guard对象的析构函数就会被调用,在它的析构函数里,就可以调用mutex的unlock函数进行解锁。注意:用new运算符产生的对象,是没有这一特点的,因为new出来的对象,需要你主动去delete。原创 2024-02-18 20:23:21 · 418 阅读 · 0 评论 -
C++单例模式的实现
单例模式就是在整个程序运行期都只有一个实例。在代码实现方面,我们要限制new出多于一个对象这种情况的发生。而不是仅仅依靠无保障的约定。目前大多数的编程语言的做法都是私有化构造函数,对外提供一个获取实例的接口。这样做的目的使实例的创建不能在类外部完成,这样我们只需要在内部保障实例只创建一次即可。定义单例基本上来说是很简单的,就是先私有化构造函数,单例内部new出这个实例,并对外提供获取实例的接口。在这里我想特别分享一下,为什么要弄一个内部类的作用。目的只有一个就是当程序退出时主动delete掉实例。原创 2024-02-17 19:04:20 · 536 阅读 · 0 评论 -
C++中的互斥量
互斥量就如同一把锁,在同一时间,多个线程都可以调用lock成员函数尝试给这把锁头加锁,但是只有一个线程可以成功给这把锁加锁,其他没有加锁成功的线程的执行流程就会卡在lock语句行这里不断地尝试去加锁,一直到加锁成功,执行流程才会继续走下去。sum变量是我们想要保护的对象,因为多个线程对sum进行加1时,如果在同一时刻,多个线程同时修改sum变量,那么最终得到的累加结果就有可能是错的。上面的例子中使用一把锁还是比较简单,当多把锁一起使用时,就可能会因为思考不周导致死锁出现。原创 2024-02-17 14:43:07 · 210 阅读 · 0 评论 -
C++ lamda表达式和重载圆括号来创建子线程
【代码】C++ lamda表达式和重载圆括号来创建子线程。原创 2024-02-16 15:23:30 · 242 阅读 · 0 评论 -
C++多线程编程
在编程的实践中,一般来说,主线程必须等待子线程结束才结束,所以上面的程序,如果不调用join等待子线程执行完毕,主线程就会先结束,主线程先结束了,还没有执行完的子线程就会被操作系统强制终止。一个程序的子线程,并不是越多越好,因为每个线程都需要有一个独立的堆栈空间(这个耗费内存),线程间的切换需要保存许多中间状态等(即上下文切换,若线程太多,上下文切换就会很频繁,上下文切换是必须的,但是这种切换如果是没有意义的额外工作,那么只会浪费本属于程序运行的时间)主线程执行到下面这行就阻塞在那,直到子线程执行完毕。原创 2024-02-15 23:49:29 · 742 阅读 · 0 评论 -
用C语言列出Linux或Unix上的网络适配器
sys/socket.h 定义主要socket的操作和结构体,如sockaddr_in、AF_INET(IPv4地址族)、AF_INET6(IPv6地址族)等。netdb.h 这里包含许多对网络操作的定义 ,如addrinfo结构体,这里面有AI_NUMERICHOST,这是说返回数字主机地址作为名字等等。ifaddrs.h 定义ifaddrs结构体和函数 getifaddrs, freeifaddrs。stdio.h 提供了通用文件操作的支持和窄字符输入输出的能力,如printf等。原创 2024-02-10 14:05:04 · 1803 阅读 · 0 评论 -
在Linux中用C语言实现Socket通信
stdio.h : 这个文件头文件是标准的输入输出,StandardInputOutput。这个头文件主要涉及文件相关的输入输出操作。典型的方法printf() , scanf(),getc(), putc()。怎么理解这里文件呢?在Linux,有一个基本的原则,键盘、显示等这些操作都会作为文件来对待。事实上,键盘输入是默认的stdin文件流,显示输出是默认的stdout文件流。StandardL。原创 2024-01-28 17:48:12 · 1955 阅读 · 0 评论 -
C++ Lambda表达式
return c;y(100);原创 2023-02-26 13:59:21 · 744 阅读 · 1 评论 -
带你去了解什么是makefile文件
GNU make命令是用来控制从源文件生成可执行文件或非可执行文件的方式。那么make命令又是通过makefile文件来控制了。所以了解makefile文件就显得很有必要了。目标:它一般是一个由程序产生的文件的名字,比如说目标文件的名字或可执行文件的名字。它也可以是一些动作的名字,比如“clean”先决条件是用来了创建目标文件的文件,一个目标文件通过依赖几个文件。命令是make执行的动作,可能包含多个命令。它们写在同一行或者各自一行。在每个命令前,我们要按一下tab键。原创 2023-01-24 12:34:22 · 1723 阅读 · 0 评论 -
带你了解GNU Make
GNU Make是一个控制编译过程的工具。它控制程序的源文件如何生成可执行文件或非源文件,其实就是指定一种方式自动化我们的构建过程。我们先来了解一下,一个程序是怎么被编译出来的。在得到一个可执行文件之前,要先编译出目标文件,再把目标文件链接起来。(注意:编译过程中,会先做预处理,把一些宏展开,include等包含进来等,得到*.i或*.ii,接着编译得到汇编程序*.s,再汇编得到目标文件*.o,最后把目标文件链接起来得到可执行文件)。原创 2023-01-23 17:39:47 · 1835 阅读 · 0 评论 -
GDB的常用命令
GDB是一个调试程序,可以用来调试C/C++程序。这个C/C++要产生符号表才能使用GDB调用。GDB常用命令。原创 2023-01-23 02:30:59 · 2037 阅读 · 0 评论 -
g++的命令选集
这一次,主要想分享一下个人认为比较有意思的g++命令。也就是说不会涵盖所有的命令。-显示所有可能的警告信息。原创 2023-01-22 01:58:15 · 2536 阅读 · 0 评论 -
如何在Linux上搭建C++开发环境
工欲善其事,必先利其器!我们要在Linux上开发C++程序,就要先搭建好它的开发环境。原创 2023-01-16 01:12:57 · 9669 阅读 · 2 评论 -
C++模板
使用模板时,我们只需要将具体的数据类型作为参数传给模板,这样编译器在编译时会像宏替换一样将模板上的占位符替换成指定的数据类型,与宏展开不同的是,在模板展开前,编译器会先做类型检查。举个例子来说明模板:比如说很多数据类型都需要max()求最大值的方法,那么我们可以写一个max()的方法,然后接受一个数据类型的参数,从而为不同数据类型提供求最大值的方法,而不是为不同的数据类型都实现同样的方法。即使模板的源码只包含方法或类,但是编译后的代码可能会包括多份同样方法或类的的代码。的一些实例,现在我们来看一下。...原创 2022-08-31 00:17:52 · 1187 阅读 · 0 评论 -
C++ Lambda表达式
什么是Lambda表达式呢?λ演算(λ-calculus)是一个形式化的数学逻辑系统,它基于函数的抽象和应用,使用变量绑定和替换来表示计算。从C++11开始可以使用Lambda表达式创建匿名函数对象(闭包),它可以作为一个参数传递给另一个函数。原创 2022-08-22 01:15:51 · 1105 阅读 · 0 评论 -
C++虚基类、虚函数、虚析构函数、纯虚函数
举个例子来说明一下什么是虚基类吧。return 0;}BaseDerived ABaseDerived B从上面打印出来的结果可以看出Base在内存中有两个副本。但实际上只需要一个Base副本就可以了。BaseDerived ADerived B此时Base在内存只有一份了。...原创 2022-08-16 00:27:09 · 2158 阅读 · 1 评论 -
C++指针的小知识
指针为什么在使用时,需要强制类型转换。原创 2022-08-14 15:18:22 · 688 阅读 · 0 评论 -
C++构造函数
C++构造函数分两种:普通构造函数和复制构造函数。其中复制构造函数的参数为自身类型的常引用,即const 类名 &修饰。为什么要传个常引用呢?因为是引用,所以对引用的操作会影响到原来的对象。为了防止复制构造函数里对引用的修改,所以加上const去修饰,const修饰的对象是不能被修改的,包括它的任何成员。...原创 2022-08-14 13:54:01 · 2753 阅读 · 0 评论 -
C++全局变量与局部变量初始化的问题及存储类修饰符
一般来说,C++ 有三个地方可以声明变量:在函数或一个代码块内部声明的变量,称为局部变量。在函数参数的定义中声明的变量,称为形式参数。在所有函数外部声明的变量,称为全局变量。从上面的定义来看C++全局变量与局部变量就很好区分了。局部变量只能被函数内部或者代码块内部的语句使用,而全局变量的值在程序的整个生命周期内都是有效的。全局变量可以被任何函数访问,在整个程序中都是可用的。在程序中,局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。1.局部变量和全局变量的初始化原创 2020-12-27 23:51:59 · 2068 阅读 · 0 评论 -
C++的应用领域
我们在学习一门新的编程语言时,应该了解它一般在什么领域使用,这样会比较好。那么当你学习完之后,就可以将其应用到相应的领域。我记得大学时,学习的C/C++一般都没有怎么介绍它们是应用在什么领域。虽然理论上,任何一门编程语言都可以完成应用的开发。但是由于语言的特性和性能等差异,造成编程语言使用的领域侧重程度不同。一般来说,C++应用在以下这些领域:科学计算C++拥有先进的数值计算库、泛型编程等优势。网络软件C++拥有许多优秀的网络通信的库,其中最具有代表性的是跨平台的、重量级的ACE库,在许多重要的企原创 2020-12-25 10:55:41 · 3496 阅读 · 1 评论 -
在Linux上快速编写C++
在Linux上使用Vim编写C++源代码,使用g++编译是很不错的体验。当然我相信更多人喜欢用IDE(集成开发环境)来开发。我们展示一下吧:1.使用vim编写源码:#include <iostream>using namespace std;int main(){ cout << "Hello,world!" << endl; return 0;}2.编译:~/c++$ g++ example01.cpp -o exampl原创 2020-12-25 10:24:35 · 1999 阅读 · 2 评论 -
C++ 基本数据类型
C++有七种内置的数据类型:boolcharintfloatdoublewchar_t(宽字符型)void#include <iostream>#include <limits>using namespace std;int main(){ cout << "bool:\t\t\t" << sizeof(bool) << "\t字节\t" << "范围:" << numeric_li原创 2020-12-25 10:10:58 · 2922 阅读 · 1 评论 -
C++11 Lambda函数
C++11 Lambda函数格式如下:[捕捉列表] (参数) mutable -> 返回值类型 {函数体}捕捉列表[]是lambda的引出符,捕捉列表能够捕捉上下文中的变量,来供lambda函数使用:[var] 表示以值传递的方式捕捉变量var[=] 表示以值传递的方式捕捉所有父作用域变量[&var] 表示以引用传递的方式捕捉变量var[&] 表示以引用传...原创 2020-03-13 11:10:02 · 2766 阅读 · 0 评论 -
编译C++程序
单文件编译C++程序Test.cpp:#include <iostream>using namespace std;int main(){ cout << "Hello, world!" << endl; return 0;}使用gcc编译;$ gcc Test.cpp -lstdc++ -o main使用g++编译:$ ...原创 2019-09-30 09:57:03 · 1958 阅读 · 0 评论