![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 73
Hardy-Lee
一名c++程序猿!主要做android ndk方向研发,专注于底层技术,对于新技术充满学习兴趣!!!
展开
-
gcc编译参数-fPIC的一些问题
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。gcc -shared -fPIC -o 1.so 1.c这里有一个-fPIC参数PIC就是position independent codePIC使.so文件的代码段变为真正意义上的共享如果不加-fPIC,则加载.转载 2021-11-20 17:45:09 · 1194 阅读 · 0 评论 -
Git中submodule的使用
背景面对比较复杂的项目,我们有可能会将代码根据功能拆解成不同的子模块。主项目对子模块有依赖关系,却又并不关心子模块的内部开发流程细节。这种情况下,通常不会把所有源码都放在同一个 Git 仓库中。有一种比较简单的方式,是在当前工作目录下,将子模块文件夹加入到.gitignore文件内容中,这样主项目就能够无视子项目的存在。这样做有一个弊端就是,使用主项目的人需要有一个先验知识:需要在当前目录下放置一份某版本的子模块代码。还有另外一种方式可供借鉴,可以使用 Git 的submodule功...转载 2021-11-02 17:38:43 · 2838 阅读 · 0 评论 -
undefined reference to symbol ‘dlclose@@GLIBC_2.2.5‘
编译可执行程序,链接glfw时报错信息undefined reference to symbol 'dlclose@@GLIBC_2.2.5',网上一番搜索,最终在stackoverflow上找到一条有用的解决办法点击跳转,截图如下提问:回复:原创 2021-10-19 10:42:03 · 3534 阅读 · 0 评论 -
socket实现大型文件传输
转自【http://blog.csdn.net/jin123wang/article/details/7081814/】最近需要做网络传输的项目,需要实现较大文件的传输。在网上收集了不少资料,但是各有各的做法,尤其是关于文件自动接收这一块不太清楚。 经过图书馆查阅后还是找到了一种解决办法,虽然做的不太专业,但是思路比较精简、清晰,也希望能给大家尤其是刚学习socket套接字的人一些启示。转载 2015-05-25 10:29:02 · 1959 阅读 · 0 评论 -
malloc,free的简单实现
首先简单说一下标准库中malloc实现原理: 标准库内部通过一个双向链表,管理在堆中动态分配的内存。 malloc函数分配内存时会附加若干(通常是12个)字节,存放控制信息。 该信息一旦被意外损坏,可能在后续操作中引发异常。mmap/munmap 底层不维护任何东西,只是返回一个首地址,所分配内存位于堆中。brk/sbrk 底层维护一个原创 2014-10-12 12:33:15 · 1894 阅读 · 2 评论 -
C/C++时间函数的使用
一、获取日历时间time_t是定义在time.h中的一个类型,表示一个日历时间,也就是从1970年1月1日0时0分0秒到此时的秒数,原型是: typedef long time_t; /* time value */可以看出time_t其实是一个长整型,由于长整型能表示的数值有限,因此它能表示的最迟时间是2038年1月18日19时14分07秒。函数time可以获取当前转载 2014-09-03 22:54:25 · 683 阅读 · 0 评论 -
C++中虚函数工作原理和(虚)继承类的内存占用大小计算
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531一、虚函数的工作原理 虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数。典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式。vptr 指向一转载 2014-09-14 12:12:28 · 656 阅读 · 0 评论 -
Linux makefile 教程 非常详细,且易懂
最近在学习Linux下的C编程,买了一本叫《Linux环境下的C编程指南》读到makefile就越看越迷糊,可能是我的理解能不行。 于是google到了以下这篇文章。通俗易懂。然后把它贴出来,方便学习。 后记,看完发现这篇文章和《Linux环境下的C编程指南》的makefile一章所讲述的惊人的相似,只是这篇文章从一个实例切入,在有些地方比转载 2014-08-27 11:09:04 · 585 阅读 · 0 评论 -
仿函数
仿函数,又叫做函数对象,是一个重载了"()"运算符的struct,是STL(标准模板库)六大组件(容器、配置器、迭代器、算法、配接器、仿函数)之一;仿函数虽然小,但却极大的拓展了算法的功能,几乎所有的算法都有仿函数版本。例如,查找算法find_if就是对find算法的扩展,标准的查找是两个元素向等就找到了,但是什么是相等在不同情况下却需要不同的定义,如地址相等,地址和邮编都相等,虽然这些相等的定义转载 2014-08-12 21:19:56 · 600 阅读 · 0 评论 -
C语言之算法初步(汉诺塔--递归算法)
个人觉得汉诺塔这个递归算法比电子老鼠的难了一些,不过一旦理解了也还是可以的,其实网上也有很多代码,可以直接参考。记得大一开始时就做过汉诺塔的习题,但是那时代码写得很长很长,也是不理解递归的结果。现在想起来汉诺塔的算法就3个步骤:第一,把a上的n-1个盘通过c移动到b。第二,把a上的最下面的盘移到c。第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了。所以算法看起来就简单多了。不过,思转载 2014-08-22 19:21:49 · 909 阅读 · 0 评论 -
C++中的随机函数
一、random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过。 可改用C++下的rand函数来实现。 1、C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。 随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机转载 2014-08-10 17:56:17 · 1028 阅读 · 0 评论 -
关于“using namespace std”
对于一个存在着标准输入输出的C++控制台程序,一般会在#include 的下一行发现一句话,using namespace std。这句话其实就表示了所有的标准库函数都在标准命名空间std中进行了定义。其作用就在于避免发生重命名的问题。 1. 关于namespace C++引入了命名空间namespace主要解决了多个程序员在编写同一个项目中可能出现的函数等重名的现象。解决方法转载 2014-08-09 22:01:41 · 594 阅读 · 0 评论 -
vector和list区别
stl提供了三个最基本的容器:vector,list,deque。vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。这些都大大影响了vector的效率。l转载 2014-08-09 22:21:49 · 577 阅读 · 0 评论 -
ShellExecuteEx打开、关闭exe
//声明结构体SHELLEXECUTEINFO ShExecInfo;//打开void OpenExe() { ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS ; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = N原创 2015-05-15 17:07:48 · 9120 阅读 · 0 评论 -
遇见C++ Lambda
转自【http://www.cnblogs.com/allenlooplee/archive/2012/07/03/2574119.html】生成随机数字 假设我们有一个vector容器,想用100以内的随机数初始化它,其中一个办法是通过generate函数生成,如代码1所示。generate函数接受三个参数,前两个参数指定容器的起止位置,后一个参数指定生成逻辑,这个逻辑转载 2015-05-19 15:37:53 · 678 阅读 · 0 评论 -
C++中的explicit关键字
在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的。了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的,而且在编写自己的代码时也可以尝试使用。既然C++语言提供这种特性转载 2015-05-19 14:52:37 · 493 阅读 · 0 评论 -
原码, 反码, 补码 详解
作者:张子秋原文:http://www.cnblogs.com/zhangziqiu/本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助!一. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真...转载 2019-08-29 10:49:43 · 290 阅读 · 1 评论 -
用三段 140 字符以内的代码生成一张 1024×1024 的图片
【原方】用三段 140 字符以内的代码生成一张 1024×1024 的图片【知乎】有没有一段代码,让你觉得人类的智慧也可以璀璨无比Kyle McCormick 在 StackExchange 上发起了一个叫做 Tweetable Mathematical Art 的比赛,参赛者需要用三条推这么长的代码来生成一张图片。具体地说,参赛者需要用 C++ 语言编写 RD 、 GR 、转载 2016-09-28 11:35:12 · 1003 阅读 · 0 评论 -
stl容器list部分实现
#include #include #include using namespace std;// 双向线性链表容器模板templateclass List {public: // 构造、析构、拷贝构造、拷贝赋值 List (void) : m_head (NULL), m_tail (NULL) {} ~List (void) { clear (); } List (原创 2016-09-27 21:53:35 · 462 阅读 · 0 评论 -
UDP打洞原理
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.许多P2P软件比如SKYPE,QQ,电驴之类需要不同内网的两台机子进行通信,而路由器的NAT机制决定了内网访问外网容易,而外网访问内网困难,那如何才能做到这一点呢?有办法------打洞!具体实现方法需要一台服务器,现在假设两台内网PC,A和B想用端口40000通信,网关分转载 2016-09-08 23:01:10 · 1670 阅读 · 0 评论 -
JNI分线程在Android上绘图刷新过快容易崩溃的处理
用JNI调用Android控件在Android上绘图,过程如下:在Java代码先分线程,然后在Java线程中调用C代码,在C中再分线程绘图,每次开始绘图前先保证前一个线程结束。用全局变量BOOL g_bCancelThread;标记是否取消当前执行线程。pthread_tg_Draw_Tid;记录当前线程ID。 以下代码: int kill_rc = pt原创 2016-03-08 13:51:14 · 1333 阅读 · 0 评论 -
C++应用程序的编译过程
目前正在学习《C++ Templates》一书。在有了一个初步的概念以后,我觉得有必要了解一下模板的编译过程。而要了解模板的编译过程就必须从普通的C++应用程序开始。下面是我对C++应用程序的编译过程的理解。敬请指教!一:一般的C++应用程序的编译过程。 一般说来,C++应用程序的编译过程分为三个阶段。模板也是一样的。在cpp文件中展开include文件。将每个cpp文件转载 2015-11-07 16:49:48 · 582 阅读 · 0 评论 -
LIB和DLL的区别与使用
共有两种库:一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。共有两种链接方式:动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅转载 2015-11-07 16:46:19 · 510 阅读 · 0 评论 -
堆和栈的区别(转过无数次的文章)
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两转载 2015-11-07 16:40:47 · 441 阅读 · 0 评论 -
"undefined reference to" 问题解决方法
最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:(.text+0x13): undefined reference to `func' 关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。1. 链接时缺失了相关目标文件(转载 2015-10-20 14:08:02 · 1002 阅读 · 0 评论 -
在C和C++里const的用法异同总结
C中const的用法总结起来主要分为以下两种: 1, 在定义变量时使用(由于const常量在定义后不能被修改,所以在定义时一定要进行初始化操作):a) 最简单的用法,说明变量为一个常变量(在以下例子里,int 和const的先后顺序可以改变的,这无所谓): const int a=100; int const b=100;b)转载 2014-08-20 14:23:16 · 756 阅读 · 0 评论 -
C/C++中static关键字作用总结
1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。举例来说明。同时编译两个源文件,一个是a.c,另一个是main.c。//a.cchar a = 'A'; // global variablevoid msg(){转载 2014-08-20 11:42:49 · 604 阅读 · 0 评论 -
C++ Virtual详解
Virtual是C++ OO机制中很重要的一个关键字。只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如下面例子中的函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函转载 2014-03-26 22:40:18 · 680 阅读 · 0 评论 -
C++拷贝构造函数详解
一. 什么是拷贝构造函数首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a = 100;int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。#include using namespace std;class CExample {private:转载 2014-03-26 23:39:35 · 577 阅读 · 0 评论 -
C++类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:class CExample {public: int a; float b; //构造函数初始化列表 CExample(): a(0),b(8.8) {} //构造函数内部赋值 CExample() {转载 2014-03-26 20:44:07 · 775 阅读 · 0 评论 -
C++中vector容器 assign()用法
assign函数:函数原型:void assign(const_iterator first,const_iterator last);void assign(size_type n,const T& x = T());功能:将区间[first,last)的元素赋值到当前的vector容器中,或者赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内原创 2014-03-25 22:12:42 · 60234 阅读 · 1 评论 -
C++STL中vector容器 begin()与end()函数、front()与back()的用法
向量容器(vector)是一种顺序容器,是一块连续分配的内存,支持随机访问,从数据安排的角度看,和数组极其相似,数组跟vector的区别在于:数组是静态分配空间,一旦分配了空间的大小,就不可以再改变了,例如,int a[6];而vector是动态分配内存,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量,vector容器的容量增长是按照容器现在容量的一倍进行增长。 begin函原创 2014-03-25 21:59:51 · 2206 阅读 · 0 评论 -
C字符串处理函数
void *memccpy (void *dest, const void *src, int c, size_t n);从src所指向的对象复制n个字符到dest所指向的对象中。如果复制过程中遇到了字符c则停止复制,返回指针指向dest中字符c的下一个位置;否则返回NULL。void *memcpy (void *dest, const void *src, size_t n);转载 2014-03-24 23:38:46 · 938 阅读 · 0 评论 -
c++中c_str()用法
语法: const char *c_str();c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针 比如:最好不要这样:转载 2014-03-25 22:37:59 · 984 阅读 · 0 评论 -
C++map的基本操作和使用
C++map的基本操作和使用 1、map简介map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。2、map的功能自动建立Key - value的对应。key 和 value可以是任意你需要的类型。 根据key值快速查找记录,查找的复杂度基本是L转载 2014-03-25 21:52:29 · 1237 阅读 · 0 评论 -
C++ iterator用法
迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型。(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter;这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。(2) 使用迭代器读取vector中的每一个元素:vector<int&...转载 2014-03-25 21:18:56 · 69357 阅读 · 1 评论 -
C++单例模式
#include //单例代码实现#include using namespace std;class Singleton{private: static Singleton * instance; string name; Singleton(string name) { cout<<"My name is:"<<name<<endl; } virtual原创 2014-03-29 10:42:48 · 693 阅读 · 0 评论 -
C++ 关键字——friend
友元是指:采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分(注意友元函数不是类的一部分),但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全转载 2014-03-27 20:30:30 · 603 阅读 · 0 评论 -
C++的异常处理
一、什么是异常处理 一句话:异常处理就是处理程序中的错误。二、为什么需要异常处理,以及异常处理的基本思想 C++之父Bjarne Stroustrup在《The C++ Programming Language》中讲到:一个库的作者可以检测出发生了运行时错误,但一般不知道怎样去处理它们(因为和用户具体的应用有关);另一方面,库的用户知道怎样处理这些错转载 2014-06-06 17:19:48 · 530 阅读 · 0 评论 -
Qt简介以及如何配置Qt使用VS2010进行开发
Qt是神马东西?Qt – 一个跨平台应用程序和UI开发框架它包括跨平台类库、集成开发工具和跨平台 IDE。使用 Qt 您只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。转载 2014-06-08 16:07:19 · 1062 阅读 · 0 评论