c/c++开发
文章平均质量分 84
杨铮的技术博客
这个作者很懒,什么都没留下…
展开
-
CMake Android 交叉编译
众所周知,AS现在可以利用Grandle调用cmake,实现c++代码在Android平台上的交叉编译。但是大多是情况下,项目代码不是从零开发,而是在现有代码的基础上移植到Android平台上。这种情况下,最有效的构建形式是直接使用cmake进行交叉编译,而不是再借助Grandle甚至AS。在参考了网上众多资料和尝试后。以下,以一个最精简的示例,说明Android平台的交叉编译方法:准备代...原创 2020-03-18 22:54:39 · 1328 阅读 · 2 评论 -
Conan使用初体验
1 Conan是什么?Conan是一个基于python的c++包管理工具,起到pip之于python,maven之于java,npm之于js的作用Conan支持多种c++构建工具,Autoconfig、cmake、boost、qmake都可以Conan支持中心化和分布式2种包管理部署,即可以搭建私服2 三方库部署示例以官方文档的项目作为实际体验示例:项目的git路径:htt...原创 2019-12-07 00:42:31 · 3090 阅读 · 0 评论 -
ONVIF专题--Onvif标准解读(2)--Core Spec::Device Discovery(3)
前文ONVIF专题--Onvif标准解读(2)--Core Spec::Device Discovery(1)ONVIF专题--Onvif标准解读(2)--Core Spec::Device Discovery(2)1 gsoap产生代码文件分析经过 Onvif标准解读(2)--Core Spec::Device Discovery(2) 步骤产生了代码文件如下: stds...原创 2019-11-09 00:14:46 · 463 阅读 · 0 评论 -
ONVIF专题--Onvif标准解读(2)--Core Spec::Device Discovery(2)
相关文章:ONVIF专题--Onvif标准解读(2)--Core Spec::Device Discovery(1)ONVIF专题--Onvif标准解读(2)--Core Spec::Device Discovery(3)gSoap实现ONVIF的设备发现1 依赖ONVIF相关的WSDL文件,对于设备发现,只需要用到remoteDiscovery.wsdl[http://www.onv...原创 2019-11-02 22:57:11 · 558 阅读 · 1 评论 -
c++代码规范(个人)
c++开发规范1 命名规范1-1 类型命名[Standards] 遵照 帕斯卡(pascal) 命名法(1) class/* 抽象类,'A'打头,如:ASharedPtr, * 注:由于class放在命名空间中,所以类名称中不需要再追加项目名和模块名前缀 * 如:class AAlgorithm; */class AXxxYyy;/** 接口类,'I'打头,如:IShar...原创 2019-10-11 21:20:34 · 362 阅读 · 0 评论 -
linux网络程序设计——6 I/O多路复用poll模型
6.3 I/O多路复用poll模型poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。6.3.1 函数原...原创 2018-07-15 23:28:51 · 413 阅读 · 0 评论 -
linux网络程序设计——5 I/O多路复用select模型
6.2 I/O多路复用select模型6.2.1函数原型该函数准许进程指示内核监听多个文件描述符中产生事件的fd,并在有一个或多个事件发生或经历一段指定的时间后才唤醒。函数原型如下:/* According to POSIX.1-2001, POSIX.1-2008 */ #include <sys/select.h> #include <sys/time.h> ...原创 2018-07-15 23:19:57 · 638 阅读 · 0 评论 -
linux网络程序设计——4 socket非阻塞模式
多路复用机制,是的可以同时监听多个套接字连接。IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。 (2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。 (3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到...原创 2018-07-15 23:16:03 · 1578 阅读 · 0 评论 -
linux网络程序设计——3 socket属性设置
5 linux socket网络编程之socket属性5.1函数用法#include <sys/types.h> #include <sys/socket.h>int getsockopt(int sockfd, int level, intoptname, void *optval, socklen_t *optlen);//函数用于获得某个套接字的属性i...原创 2018-07-15 23:10:27 · 2888 阅读 · 0 评论 -
cmake用法总结
Git使用clone带子模块项目 git clone project.git project2 cd project2 git submodule init git submodule update cd .. 引入cmake是跨平台的编译工具先看一个简单案例 rule-1 #主编译规则,目标是...原创 2021-09-25 22:18:03 · 1210 阅读 · 0 评论 -
ACE框架系列——JAWS[1代]代码分析
JAWS服务程序启动流程1.利用ACE_Service_Config加载配置文件,并利用ACE反射机制构造HTTP_Server对象并初始化init() (ACE反射机制,开专题解析)2.根据配置文件中的创建HTTP_Handler_Factory,ACE_Handler工厂类if (this->strategy_ != (JAWS::JAWS_POOL | JAWS::JAW...原创 2019-09-08 21:18:40 · 994 阅读 · 0 评论 -
AC——c++数据序列化方案
1 背景AC(Auto Converter)是一款轻量级的基于c++开发的数据序列化开发框架。框架基于纯c++开发,开箱即用,无三方依赖库。由于c/c++语言没有类似java\python等到高级语言获取对象的metadata的功能, 在数据序列化时需要针对具体的数据对象开发序列化代码,开发起来比较复杂且容易出错。AC框架借鉴java中Object的思想,定义超类AutoConverter...原创 2019-10-07 19:37:13 · 1168 阅读 · 0 评论 -
Qt5事件模型分析
qt窗口应用程序案例 code-1 #include<iostream> #include<QApplication> #include<QtWidgets/QWidget> usingnamespacestd; classMyClass:publicQWid...原创 2019-09-08 23:20:38 · 366 阅读 · 0 评论 -
浅谈c++字符串——4 字符串,整数,浮点数之间的转换(VC++ Unicode下)
4 字符串,整数,浮点数之间的转换(VC++Unicode下)4.1 CString 类和string类及char*间转化CString是MFC类,而string为C++标准库字符串4.1.1 CString -> string CStringcstr = _T("test"); USES_CONVERSION; stringstr(W2A(cst...原创 2019-09-08 22:51:09 · 1081 阅读 · 0 评论 -
浅谈c++字符串——3 MFC字符串
3MFC字符串3.1MFC下的常用字符串数据类型表示的含义L:Long长 P:Point 指针 C:Const 常量 W:Wchar_t宽字符 T:TCHARSTR:String字符串在看看MFC下各种数据类型的定义: typedef char *LPSTR;typedef const char *LPCSTR; typedef wcha...原创 2019-09-08 22:49:38 · 371 阅读 · 0 评论 -
浅谈c++字符串——1 C++标准库字符串
1 C++标准库字符串1.1 c++字符串流sstream(常用于格式转换)C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性、类型安全和可扩展性。在本文中,我将展示怎样使用这些库来实现安全和自动的类型转换。在过去留下来的程序代码和纯粹的C程序中,传统的<stdio.h>形式的转换伴随了我们很长的一段时...原创 2019-09-08 22:47:48 · 331 阅读 · 0 评论 -
浅谈c++字符串——2 c标准库中字符串
2 C标准库字符串2.1 <stdlib.h>定义的宽字节字符wchar_t在标准C中,字符串有两种char*和wchar_t*,一个是多字节字符串,另一个是宽字节字符串。前者是C的关键字,编译器会直接为其分配空间,而wchar_t在便准库中定义,不包含头文件的话,编译器会报错。但是可以修改项目属性中的SDL选项来更改安全属性,可以避免编译错误。建议不使用,安全性控制由程序员...原创 2019-09-08 22:45:50 · 589 阅读 · 0 评论 -
结合框架、库、SDK讨论API
框架、库、SDK的区别框架(Framework)通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品。框架是针对开发人员的规范或软件产品,一般为开发更上层应用提供基础功能,可开发框架一般有适用的特定领域,比如作为网络程序开发基础中间件的ACE框架,作为桌面应用程序开发框架的Qt、MFC。框架面向的使用者一般是...原创 2019-09-08 22:28:48 · 793 阅读 · 0 评论 -
ACE框架系列——linux下编译方法
编译步骤:1. 从 http://www.cs.wustl.edu/~schmidt/ACE.html 的 Obtainin ACE 链接处下载ACE源码,我下载的是ACE-6.4.0.tar.gz2. 假设下载的目录为~/source/ace3. 解压ACE源码 tar zxvf ACE-6.4.0.tar.gz,解压后发现ace源码解压到~/source/ace/ACE_wrapp...原创 2019-09-08 21:24:08 · 933 阅读 · 0 评论 -
linux网络程序设计——2 网络模型
2 C/S模型-TCP大部分进程间通信使用客户端-服务器模型。进程间通信指的是两个进程之间相互通信,其中,客户端进程连接服务器进程,通常是发出数据请求。一个很好的比喻是一个人给另一个人打电话,打出电话的人就好比客户端,接电话的人就好比服务器。有两点需要注意,第一,客户端需要知道服务器是否存在,如果服务器存在,服务器的地址是多少;但是在客户端连接服务器之前,服务器并不需要知道客户端的地址(甚至客户端...原创 2018-07-15 23:04:33 · 361 阅读 · 0 评论 -
linux网络程序设计——1 socket的概念
在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket。 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。socket本身有“插座”的意思,因此用来描述网络连接的一对一关系。 TCP/IP协议最早在BSD UNIX上实现,为T...原创 2018-07-15 22:58:51 · 819 阅读 · 0 评论 -
c++tricks——#include使用技巧
定义一个头文件,test_var.h#defineVAR(type, name) \ typename;VAR(int,i0)VAR(int,i1)VAR(char*,pstr)在源文件,test_var.cpp中定义//code-1structtest_stru{#inlcude”test_var.h”}于是test_stru结构体中就有了inti0;int i1;char* pstr;三个成...原创 2018-07-07 00:14:43 · 292 阅读 · 0 评论 -
muduo库源码分析1——ChargenServer服务器启动流程
ChargenServer服务器启动流程在使用TCPServer时,用户需要注册connectionCallback_,messageCallback_,writeCompleteCallback_三个事件句柄,每当TCPServer中新构造一个新Acceptor对象。其构造函数会先初始化Channel成员对象acceptChannel_(loop, acceptSocket_.fd()),然后调...原创 2018-06-03 23:42:48 · 520 阅读 · 0 评论 -
c++ tricks——类的默认类型转换
转换构造函数转换构造函数的作用是将某种类型的数据转换为类的对象,当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数。例子:class A { public: int a; A(int a) :a(a) {} A reta() { return a; } }; int main()...原创 2018-05-16 15:27:37 · 452 阅读 · 0 评论 -
c++tricks——命名空间
using directive和using declaration// using directiveint fun1(int i) { using namespace std; int vector = 7; // a poorly named variable, but it is legal. // vector a; // error. std::vector is hi...原创 2018-05-07 20:32:39 · 154 阅读 · 0 评论 -
c++tricks——c++11 constexpr关键字
c++11有一些这样的改善,这种改善保证写出的代码比以往任何时候的执行效率都要好。这种改善之一就是生成常量表达式,允许程序利用编译时的计算能力。假如你熟悉模板元编程,你将发现constexpr使这一切变得更加简单。假如你不知道模板元编程,也没什么。constexpr使我们很容易利用上编译时编程的优势。常量表达式主要是允许一些计算发生在编译时,即发生在代码编译而不是运行的时候。这是很大的优化:假如有...转载 2018-05-07 18:52:17 · 191 阅读 · 3 评论 -
c++tricks——POD与结构体声明
请看下面这个结构体定义:struct MyStruct { int i; wstring str; vector<wstring> strs; };上面的结构休定义有问题吗?理论上说没有,但在某些情况下就可能有问题了。如下用法:MyStruct *pMy = new MyStruct(); memset(pMy, 0, sizeof(MyStruct)); pMy->...转载 2018-05-07 18:04:46 · 365 阅读 · 0 评论 -
c++tricks——前置申明
有一定C++开发经验的朋友可能会遇到这样的场景:两个类A与B是强耦合关系,类A要引用B的对象,类B也要引用类A的对象。好的,不难,我的第一直觉让我写出这样的代码:// A.h#include "B.h"class A{ B b;public: A(void); virtual ~A(void);}; //A.cpp#include "A.h" A::A(void){}A::~A(...转载 2018-05-07 16:03:53 · 112 阅读 · 0 评论 -
c++tricks——errno多线程安全
errno的由来 在C编程中,errno是个不可缺少的变量,特别是在网络编程中。如果你没有用过errno,那只能说明你的程序不够健壮。当然,如果你是WIN32平台的GetLastError(),效果也是一样的。 为什么会使用errno呢?个人认为,这是系统库设计中的一个无奈之举,他更多的是个技巧,而不是架构上的需要。我们观察下函数结构,可以发现,函数的参数返回值只有一个,这个返回值一般可以携带错误...转载 2018-05-07 15:55:02 · 425 阅读 · 0 评论 -
c++tricks——c++枚举类
现在有这样一种要求,构造的对象都基于既定的模板,不允许任意构造。比如新建一个人姓氏的类,但是姓氏是固定的,不允许随便构造新的姓氏,于是可以定义枚举类。将除了<font color=red><b>Family_Name(const char * name)</b></font>以外的构造函数(拷贝,赋值)设为public。然后定义若干&...原创 2018-05-07 15:52:07 · 160 阅读 · 0 评论 -
c++tricks——关于linux动态链接库的分析
作者YangZheng联系263693992@qq.com在linux系统中动态链接库文件用.so后缀标记,一般命名规则为libxxx.so。1 链接产生动态库.so与编译源码产生的二进制文件.o的关系现在有工程,源文件包括:main1.cppmyAPI.cppmyAPI.h其中myAPI.cpp,myAPI.h定义了两个函数ADD(), MINUS();main1.cpp中则调用ADD(), M...原创 2018-04-28 00:51:29 · 257 阅读 · 0 评论 -
c++tricks——关于virtual关键字的实验
在派生类中改变virtual函数访问权限定义两个类A,B,其中B公有派生于A。A中定义一个private成员虚函数func,B中覆写此函数,但是将其访问权限设置为publicclass A{private: virtual void func(){ printf("A\n"); }};class B: public A{public: void func(){ ...原创 2018-05-07 15:47:48 · 160 阅读 · 0 评论 -
muduo库源码分析2——QueryServer服务器启动流程
muduo网络库中,基于google::protobuf数据标准的网络服务器实例,放在example/protobuf/codec中。QueryServer服务器的功能:1) 接收客户端Tcp连接及收发数据2) 从Tcp数据报中解析出protobuf::message数据报3) 解析message并分发不同请求 根据muduo设计模式,以上每一个功能均可以看做网络服务中的一层。如处...原创 2018-06-03 23:59:16 · 428 阅读 · 0 评论 -
muduo库源码分析3——muduo事件循环分析
muduo事件循环分析 muduo网络库网络I/O模型为非阻塞reactor模式。使用linux的epoll或poll系统调用,轮寻多个socket,然后利用事先注册的事件句柄处理发生事件的套接字。muduo中一个thread与一个EventLoop绑定,即“one-loop-per-thread”模式,线程的主循环核心代码:while(1){ 1) poller_->pol...原创 2018-06-04 00:01:46 · 428 阅读 · 0 评论 -
c++tricks——do{...}while(0)技巧
在一些开源的库项目中,经常看到作者在定义包含大量语句的宏时,使用do{...}while(0)封装。如#define macro(cond) \do{ \ if(cond) \ dosomething(); \}while(0); 这样做的目的是什么?首先看一个例子,定义一个宏,其中包括与上例相同的条件语句,但不使用封装#define macro1(cond) \if(cond) \ ...原创 2018-07-06 23:15:51 · 675 阅读 · 0 评论 -
linux网络程序设计——7 I/O多路复用epoll模型
6.4 I/O多路复用epoll模型epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。6.4.1函数原型epoll操作过程需要三个接口 #i...原创 2018-07-17 22:49:21 · 473 阅读 · 0 评论 -
高性能网络库分析1——libevent
libevent事件循环分析libevent库事件循环封装在event_base_loop()函数中,函数的主循环流程:while(1){ if(base中有事件或loop需要阻塞){ timeout_next(base, &tv_p); // 从timer heap中取根节点的超时时间,作为IO复用的阻塞等待时间tv_p(tv_p指向tv) } else // 无需阻塞...原创 2018-07-05 00:19:11 · 1183 阅读 · 0 评论 -
STL源码剖析——全局构造函数和析构函数
stl_construct.h文件提供构造和析构对象最基本的全局函数最基本的placement new构造对象函数,使用在现有的地址空间上进行拷贝构造的操作template <class T1, class T2> inline void construct(T1* p, const T2& value) { new (p) T1(value); //placement ne...原创 2018-06-19 23:52:21 · 438 阅读 · 0 评论 -
STL源码剖析——内存配置和释放
Sgi stl的内存配置分为一级__malloc_alloc_template和二级__defaut_alloc_template,一级配置器直接封装malloc()和free()函数,当申请内存超过128k时调用。而当配置的内存小于128k时,出于内存碎片化问题的考虑,使用二级配置器,从内存池中配置空间。二者关系如原书P55 图2-2a。Sgi stl中不开放直接使用二级配置器。其中__mall...原创 2018-06-21 23:24:58 · 311 阅读 · 0 评论 -
STL源码剖析——SGI STL编译器组态
阅读候杰的《STL源码剖析》时,了解到SGI 版本的STL实现中。为了尽可能实现代码跨平台跨编译器的移植能力,使用环境组态文件<stl_config.h>定义的一些常量,并以条件编译取舍部分代码编译。以下是查阅网上一些相关资料后,对<stl_config.h>中的预定义组态配置项的解释:__STL_STATIC_TEMPLATE_MEMBER_BUG如果编译器无法处理sta...原创 2018-06-12 23:49:54 · 854 阅读 · 1 评论