C / C++
文章平均质量分 67
zhengqijun_
You can do it! No can no BB!
展开
-
【C++模版之旅】神奇的Traits
介绍traits的文章很多,但感觉大部分文章的说明都很晦涩难懂,把一个并不很复杂的C++模板的应用描述的过于复杂。忍不住想把自己的理解跟大家分享一下,或许我也只是掌握了一点traits的皮毛而已,但也希望这些皮毛能略微抓住你的眼球,带给你一些启发。首先,介绍traits前,回味一下C++的模板及应用,如果你脑海里浮现出的只是为实现一些函数或类的重用的简单模板应用,那我要告诉你,你out了。最近...转载 2018-10-22 14:06:13 · 1370 阅读 · 0 评论 -
Android Binder设计与实现 - 设计篇
摘要Binder是Android系统进程间通信(IPC)方式之一。Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder具有无可比拟的优势。深入了解Binder并将之与传统IPC做对比有助于我们深入领会进程间通信的实现和性能优化。本文将对Binder的设计细节做一个全面的阐述,首先通过介绍Binder通信模型和Binde...转载 2018-03-12 09:58:27 · 257 阅读 · 0 评论 -
C++两个链表的公共结点
题目:(剑指offer编程题)输入两个单向链表,找出它们的第一个公共结点。公共结点是地址相同的两个结点,也就是同一个结点,由于是单向链表,所有从公共结点之后两链表重合。思路:方法1:最容易想到的办法是用两个循环,遍历第一个链表,对每一个元素遍历第二个链表,找相同的结点。这种算法时间复杂度为O(mn)(假设链表长度分别为m和n),不适用这种方法。方法2:如果两个链表有公共结点,那么从转载 2017-10-12 23:18:27 · 807 阅读 · 0 评论 -
静态链表和动态链表的区别
静态链表和动态链表的区别:静态链表和动态链表是线性表链式存储结构的两种不同的表示方式。1、静态链表是用类似于数组方法实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配地址空间大小。所以静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针。2、动态链表是用内存申请函数(malloc/new)动态申请内存的,所以在链表的长度上没有限制。动态链表原创 2017-10-10 15:09:35 · 50922 阅读 · 16 评论 -
objdump命令的使用[转载]
objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。选项--archive-headers -a 显示档案库的成员信息,类似ls -l将lib*.a的信息列出。 -b bfdname --target=bfdname 指定目标码格式。这不是必须的,objdump能自动识别许多格式,比如: objdump -b oasys -m va转载 2017-10-10 14:26:52 · 1855 阅读 · 0 评论 -
C语言宏中"#"和"##"的用法
C语言宏中"#"和"##"的用法 在查看linux内核源码的过程中,遇到了许多宏,这里面有许多都涉及到"#"和"##",因此,在网上搜索了一些资料,整理如下:一、一般用法 我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.。用法:#include #include #include using namespace std; #define STR(s)转载 2017-10-10 10:27:07 · 1320 阅读 · 0 评论 -
结构体和共用体的使用及注意事项
一、结构体1.结构体的作用在网络协议、通信控制、嵌入式系统的C/C++编程中,我们经常要传送的不是简单的字节流,而是多种数据组合起来的一个整体,其表现形式就是一个结构体。2.结构体的定义结构体:是指定义相应的数据结构及相应的变量。结构体如下所示,其中,struct是结构体关键字,一定不能省略。node是结构体名,可以省略,成为无名结构体。结构体成员可以使基本类型或者原创 2016-07-25 11:07:15 · 20735 阅读 · 3 评论 -
C++对C的升级
可能大家对C语言不会陌生,用C语言写起代码来也是得心应手。但是在做项目的时候,C语言的复用性、扩展性、维护性就比较差!如果我们在原来的基础上添加新的功能,可能就需要修改大量的代码,相信这种方式你是不会采取的!C语言是面向过程的语言,这里需要有一种面向对象的语言。于是C++语言就诞生了!一、C++语言的特性1、C++完全兼容C的特性。2、C++在C语言的基础上进行了升级。3、C++复原创 2017-06-21 10:44:17 · 691 阅读 · 0 评论 -
dlopen()函数详解[转载]
Linux提供了一套API来动态装载库。下面列出了这些API:- dlopen,打开一个库,并为使用该库做些准备。- dlsym,在打开的库中查找符号的值。- dlclose,关闭库。- dlerror,返回一个描述最后一次调用dlopen、dlsym,或dlclose的错误信息的字符串。1、头文件#include 2、函数原型void *dlopen(const转载 2017-05-19 16:42:14 · 23724 阅读 · 3 评论 -
printf 函数实现的深入剖析[转载]
研究printf的实现,首先来看看printf函数的函数体 int printf(const char *fmt, ...) { int i; char buf[256]; va_list arg = (va_list)((char*)(&fmt) + 4); i = vsprintf(buf, fmt, arg); write(buf,转载 2017-05-17 23:43:08 · 9046 阅读 · 1 评论 -
从printf谈可变参数函数的实现[转载]
从printf谈可变参数函数的实现摘要:一直以来都觉得printf似乎是c语言库中功能最强大的函数之一,不仅因为它能格式化输出,更在于它的参数个数没有限制,要几个就给几个,来者不拒。printf这种对参数个数和参数类型的强大适应性,让人产生了对它进行探索的浓厚兴趣。关键字:printf, 可变参数 1. 使用情形 int a =10;double b =转载 2017-05-17 23:00:35 · 641 阅读 · 0 评论 -
C语言概述
1.C语言之父是谁?丹尼斯里奇Dennis Ritchie 2.C语言的特点有哪些?为什么嵌入式开发会选择选择C语言作为开发语言?C语言特点包括移植性好,能够直接访问硬件,运行效率高。 选择C语言作为开发语言的原因:嵌入式是对操作系统的移植,而操作系统的开发中无论是上层应用层还是底层驱动都需要用到C语言。C语言是面对结构语言,相对于那些面对对象语言,更适合解决嵌入式开原创 2016-07-02 16:04:50 · 1224 阅读 · 0 评论 -
i++与++i的运算规则
1. 我们都知道自增运算符和自减运算符,如:i++ 和 ++i,i-- 和 i--。可能你会觉得这很简单,不就是 i+1、i-1吗?但是你真的深入的了解过吗?这里我要提到非常重要的一点,关于 i++ 与++i 的区别。i++是先使用 i 的值,再进行 i+1。而++i 是先进行 i+1,再使用 i 的值。这是它们的本质区别! 2. 关于这里运算符优先级。首先自增、自减的优先级高,先进...原创 2016-07-15 19:38:30 · 8627 阅读 · 3 评论 -
"C语言之美" -- 变量名
C语言是一种优美的语言。如果你不能体会到这种语言的魅力,那么你将无法真正爱上这门语言。C语言是一种面向过程的语言,这也就决定它的优点和不可避免的缺点。在嵌入式领域中,是把C语言作为开发语言。这是为什么呢?我个人认为是选中C语言移植性好,能够直接访问硬件,运行效率高的3大特点。这是其它语言所不能及的地方!一个合格的C语言程序,不仅要自己看的懂程序,还要让别人也能看懂你写的程序。下面我们通过标原创 2016-08-11 15:53:14 · 959 阅读 · 0 评论 -
C++ string类的实现
学了C++的重载机制之后,忍不住去探究一下C++中string类的内部实现过程。于是仿照这string类的功能,写了一个自己的string类练练手。可能还有些东西并未完善,后面再不断去完善。参考代码如下所示:Main.cpp /*****************************************************Copyright (C): 2017-201...原创 2017-02-14 20:58:00 · 7778 阅读 · 10 评论 -
[Data Structure & Algorithm] 八大排序算法
阅读目录1. 直接插入排序(Straight Insertion Sort)2. 希尔排序(Shells Sort)3. 直接选择排序(Straight Selection Sort)4. 堆排序(Heap Sort)5. 冒泡排序(Bubble Sort)6. 快速排序(Quick Sort)7. 归并排序(Merge Sort)8. 桶排序(Bucket Sort)/基数排序(Radix So...转载 2018-05-16 14:19:15 · 478 阅读 · 0 评论 -
[Data Structure & Algorithm] 七大查找算法
阅读目录1. 顺序查找2. 二分查找3. 插值查找4. 斐波那契查找5. 树表查找6. 分块查找7. 哈希查找 查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。本文简单概括性的介绍了常见的七种查找算法,说是七种,其实二分查找、插值查找以及斐波那契查找都可以归为一类——插值查找。插值查找和斐波那契查找是在二分查找的基础上的优化查找算法。...转载 2018-05-16 14:23:07 · 361 阅读 · 0 评论 -
Google C++单元测试框架---Gtest框架简介(译文)[转载]
一、设置一个新的测试项目 在用google test写测试项目之前,需要先编译gtest到library库并将测试与其链接。我们为一些流行的构建系统提供了构建文件: msvc/ for Visual Studio, xcode/ for Mac Xcode, make/ for GNU make, codegear/ for Borland C++ Builder.如果你的构建系统不在这个名单上...转载 2018-07-03 10:35:48 · 281 阅读 · 0 评论 -
从4行代码看右值引用 [转载]
从4行代码看右值引用概述 右值引用的概念有些读者可能会感到陌生,其实他和C++98/03中的左值引用有些类似,例如,c++98/03中的左值引用是这样的:int i = 0;int& j = i; 这里的int&是对左值进行绑定(但是int&却不能绑定右值),相应的,对右值进行绑定的引用就是右值引用,他的语法是这样的A&&,通过双引号...转载 2018-10-18 09:29:37 · 939 阅读 · 0 评论 -
c++ array模板类使用
目录1、array模板类的定义(1)array模板类的声明(2)容器属性(3)array模板类的说明(4)array模板类头文件2、array模板类的使用(1)Iterators(2)Capacity(3)Element access(4)Modifiers(5)Compare(6)Other本章是对c++ array模板类的知识归纳,讲述了c+...原创 2018-08-10 17:47:13 · 67460 阅读 · 1 评论 -
高并发下线程安全的单例模式 [转载]
在所有的设计模式中,单例模式是我们在项目开发中最为常见的设计模式之一,而单例模式有很多种实现方式,你是否都了解呢?高并发下如何保证单例模式的线程安全性呢?如何保证序列化后的单例对象在反序列化后任然是单例的呢?这些问题在看了本文之后都会一一的告诉你答案,赶快来阅读吧!什么是单例模式?在文章开始之前我们还是有必要介绍一下什么是单例模式。单例模式是为确保一个类只有一个实例,并为整个系统提供一个全...转载 2018-08-10 13:46:37 · 480 阅读 · 0 评论 -
关于C++模板函数声明与定义的问题
关于C++模板函数声明与定义的问题关于C++模板函数声明与定义的问题模板函数出现的问题模板函数问题解决模板函数出现的问题今天在写代码的时候,发现了一个关于模板函数的问题。如下所示, demo.h代码#ifndef DEMO_H#define DEMO_Hclass Demo {public: Demo(); virtual ~D...原创 2018-07-22 21:59:37 · 29081 阅读 · 4 评论 -
老生常谈,正确使用memset [转载]
老生常谈,正确使用memset老生常谈,正确使用memset1、memset是以字节为单位,初始化内存块。2、当结构体类型中包含指针时,在使用memset初始化时需要小心。3、当结构体或类的本身或其基类中存在虚函数时,也需要谨慎使用memset。前段项目中发现一个问题,程序总是在某个dynamic_cast进行动态转换时出异常,查了半天才发现问题原来是出在me...转载 2018-07-18 20:02:06 · 1317 阅读 · 0 评论 -
玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架 [转载]
一、前言上一篇我们分析了gtest的一些内部实现,总的来说整体的流程并不复杂。本篇我们就尝试编写一个精简版本的C++单元测试框架:nancytest ,通过编写这个简单的测试框架,将有助于我们理解gtest。二、整体设计使用最精简的设计,我们就用两个类,够简单吧:1. TestCase类包含单个测试案例的信息。 2. UnitTest类负责所有测试案例的执行,管理。三、TestCase类TestC...转载 2018-07-03 12:10:58 · 287 阅读 · 0 评论 -
玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest [转载]
一、前言“深入解析”对我来说的确有些难度,所以我尽量将我学习到和观察到的gtest内部实现介绍给大家。本文算是抛砖引玉吧,只能是对gtest的整体结构的一些介绍,想要了解更多细节最好的办法还是看gtest源码,如果你看过gtest源码,你会发现里面的注释非常的详细!好了,下面就开始了解gtest吧。二、从TEST宏开始前面的文章已经介绍过TEST宏的用法了,通过TEST宏,我们可以非法简单、方便的...转载 2018-07-03 12:09:23 · 268 阅读 · 0 评论 -
玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数 [转载]
一、前言使用gtest编写的测试案例通常本身就是一个可执行文件,因此运行起来非常方便。同时,gtest也为我们提供了一系列的运行参数(环境变量、命令行参数或代码里指定),使得我们可以对案例的执行进行一些有效的控制。二、基本介绍前面提到,对于运行参数,gtest提供了三种设置的途径:1. 系统环境变量2. 命令行参数3. 代码中指定FLAG因为提供了三种途径,就会有优先级的问题, 有一个原则是,最后...转载 2018-07-03 12:08:01 · 677 阅读 · 0 评论 -
玩转Google开源C++单元测试框架Google Test系列(gtest)之五 - 死亡测试 [转载]
一、前言“死亡测试”名字比较恐怖,这里的“死亡”指的的是程序的崩溃。通常在测试过程中,我们需要考虑各种各样的输入,有的输入可能直接导致程序崩溃,这时我们就需要检查程序是否按照预期的方式挂掉,这也就是所谓的“死亡测试”。gtest的死亡测试能做到在一个安全的环境下执行崩溃的测试案例,同时又对崩溃结果进行验证。二、使用的宏Fatal assertion Nonfatal assert...转载 2018-07-03 12:06:45 · 257 阅读 · 0 评论 -
玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化 [转载]
一、前言在设计测试案例时,经常需要考虑给被测函数传入不同的值的情况。我们之前的做法通常是写一个通用方法,然后编写在测试案例调用它。即使使用了通用方法,这样的工作也是有很多重复性的,程序员都懒,都希望能够少写代码,多复用代码。Google的程序员也一样,他们考虑到了这个问题,并且提供了一个灵活的参数化测试的方案。二、旧的方案为了对比,我还是把旧的方案提一下。首先我先把被测函数IsPrime帖过来(在...转载 2018-07-03 12:05:29 · 290 阅读 · 0 评论 -
玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制 [转载]
一、前言gtest提供了多种事件机制,非常方便我们在案例之前或之后做一些操作。总结一下gtest的事件一共有3种:1. 全局的,所有案例执行前后。2. TestSuite级别的,在某一批案例中第一个案例前,最后一个案例执行后。3. TestCase级别的,每个TestCase前后。二、全局事件要实现全局事件,必须写一个类,继承testing::Environment类,实现里面的SetUp和Tea...转载 2018-07-03 12:04:08 · 404 阅读 · 0 评论 -
玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - 断言 [转载]
一、前言这篇文章主要总结gtest中的所有断言相关的宏。 gtest中,断言的宏可以理解为分为两类,一类是ASSERT系列,一类是EXPECT系列。一个直观的解释就是:1. ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。 2. EXPECT_* 系列的断言,当检查点失败时,继续往下执行。二、示例// int型比较,预期值:3,实际值:Add(1, 2)EXP...转载 2018-07-03 12:02:54 · 224 阅读 · 0 评论 -
玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest [转载]
1.The first sample: sample1 你把github上的项目导来之后,github地址:https://github.com/google/googletest,在目录:..(你的目录)\googletest-master\googletest\samples是你的samples文件夹。 在VS中创建项目:GtestSamples 把对应的代码加入到这里边:sample1.h、...转载 2018-07-03 10:40:31 · 225 阅读 · 0 评论 -
C++中引用与指针的区别
学过C的朋友应该都知道指针,刚开始学习指针的时候,都会觉得指针很难,学完了指针才发现指针就是保存的地址。指针十分不安全,使用的不恰当,就会使程序出错!C++里面提出了“引用”代替指针,提高程序的安全性。下面来讲讲什么是引用。一、引用的定义引用是给另外一个变量起别名,所以引用不会分配内存空间。引用的声明方法:类型标识符 &引用名=目标变量名;(如int &ptr = num;)二原创 2017-02-11 10:35:59 · 25224 阅读 · 5 评论 -
解析c++构造函数与析构函数
目录目录构造函数的定义构造函数的特点构造函数默认构造函数转换构造函数拷贝构造函数析构函数的定义析构函数的特点析构函数构造函数的定义定义:构造函数是一种特殊的成员函数,对对象进行初始化的函数。构造函数的特点构造函数名字必须与类名相同。构造函数不具有任何类型,没有返回值。在建立类的对象的时候,系统会自动调用构造函数。如果用户没有定义构造函数,系统会默认生成一个构造函数。构造函原创 2017-02-28 17:29:42 · 2007 阅读 · 0 评论 -
【C++编程】 - 类与对象
目录目录类与对象类的声明成员函数成员访问限定符对象的定义对象的存储模型class与struct的区别类与对象在C++中,类是对象的抽象,而对象是类的具体实例。简单说对象的类型就是类。 因为类是抽象的,所以不占用内存空间。而对象是具体的,系统会给对象分配存储空间。类的声明C++对类的声明的一般形式:class 类名{public: //公有的属性和成员函数;privat原创 2017-02-28 12:25:47 · 447 阅读 · 0 评论 -
C语言预处理
C语言中编译预处理的三种形式的命令:宏定义,文件包含,条件编译命令。1、宏定义主要是:#define,#undef如下:#define PI 3.1415926 /*不带参数的宏定义*/#define Max(a,b) a>b?a:b /*带参数的宏定义*/说明:宏定义在C语言与C++语言中是相通的。原创 2016-09-30 21:59:27 · 780 阅读 · 0 评论 -
嵌入式系统编程C语言之软件架构
模块划分 模块划分的“划”是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求。C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了相对论),C语言模块化程序设计需理解如下概念: (1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明; (2转载 2016-10-14 22:04:38 · 549 阅读 · 0 评论 -
单链表实现冒泡排序算法
下面实现主要采用交换指针的方法,其中附加有单链表及其相关的实现[cpp] view plain copy#include struct Node; typedef struct Node *PtrToNode; typedef PtrToNode List; typedef PtrToNode Positio原创 2016-10-15 19:54:29 · 9632 阅读 · 3 评论 -
#include <head.h>与#include "head.h"的区别
1. #include 尖括号表明这个文件是一个工程或标准的头文件,在预处理查找过程中会首先检查系统预定义的目录,如果没有找到就报错。2. #include "head.h"双引号" "表明这是一个用户自定义的头文件,查找文件的时候会先在当前文件目录中查找,如果没有找到再去系统预定义的目录中查找,如果没有找到再报错。原创 2016-09-26 20:45:14 · 6079 阅读 · 0 评论 -
实现strcmp函数功能--比较字符串
原型:extern int strcmp(const char s1,const char s2);用法:#include 功能:比较字符串s1和s2。一般形式:strcmp(字符串1,字符串2)说明:当s1 当s1 = s2时,返回值=0当s1 > s2时,返回值>0/*********************************File name :原创 2016-10-11 21:42:12 · 14008 阅读 · 2 评论 -
关于函数的定义和使用
1.函数三要素:函数名、函数形参、函数返回值。函数名:函数名是指针常量,保存函数的地址。满足标识符的命名规则,最好标识符要有意义,增加可读性。(动宾结构)函数形参:在定义函数时,括号中的变量名叫做形参。在调用的时候,括号中的参数叫做实参。形参和实参的功能是作数据传送,发生函数调用时,实参的值会传递给形参。函数返回值:函数通过return返回的值。2.函数的调用过程a.通原创 2016-07-21 14:40:29 · 605 阅读 · 0 评论