![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++ 相关知识
文章平均质量分 82
路痴的旅行
一生有你
展开
-
C++中typeid的用法
typeid是C++的关键字之一,等同于sizeof这类的操作符。typeid操作符的返回结果是名为type_info的标准库类型的对象的引用。如果表达式的类型是类类型且至少包含有一个虚函数,则typeid操作符返回表达式的动态类型,需要在运行时计算;否则,typeid操作符返回表达式的静态类型,在编译时就可以计算。测试1#define OUTPUT(f) cout << #f &...转载 2018-04-12 23:22:59 · 1805 阅读 · 0 评论 -
C++ 双冒号的用法
1、作用域符号 前面一般是该类名称,后面是该类的成员名称。 C++为避免不同的类有相同的成员而采用作用域的方式进行区分,eg:A,B表示两个类,在A,B中都有成员member,那么:A::member表示A中的成员member,B::member表示B中的成员member。2、全局作用域符号 当全局变量在局部函数中与其中某个变量重名时,可以用::来区分,否则局部变量会屏蔽全局变量...转载 2018-04-17 22:58:01 · 825 阅读 · 0 评论 -
const char * 、char const *、 char * const 三者的区别
C/C++ 中关于以下三种定义:const char *ptr;char const *ptr;char * const ptr;现整理三者之间的区别与联系。一、const char *ptr;定义一个指向字符常量的指针,这里,ptr是一个指向 char* 类型的常量,所以不能用ptr来修改所指向的内容,换句话说,*ptr的值为const,不能修改。但是ptr的声明并不意味着它指向的值实际上就是一...转载 2018-03-28 23:19:40 · 7723 阅读 · 0 评论 -
C++中的mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些...转载 2018-03-28 23:07:11 · 147 阅读 · 0 评论 -
结构体定义 typedef struct 用法详解和用法小结
typedef可以声明新的类型名来代替已有的类型名,但却不能增加新的类型。 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 在编程中使用typedef目的一般有两个,一个是给变量提供一个易记且意义明确的新名字(类型有新别名,方便变量的定义),另一个是简化一些比较复杂的类型声明。typ...转载 2018-04-03 14:08:04 · 141761 阅读 · 18 评论 -
C++必须使用【初始化列表】初始化数据成员的三种情况
类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员;2.进入构造函数后在构造函数中执行一般赋值与计算。使用初始化列表有两个原因:原因1.必须这样做:《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表: 情况一、需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显示调用父类的构造函数对父类数据成员进行初始化); 情况二、需要初始...转载 2018-03-27 23:02:46 · 8012 阅读 · 0 评论 -
C++的四种转型小结
1 概念分析 static_caststatic_cast应该是适用范围最广的,适用于很多隐式转换,基类指针与子类指针的相互转换,或者添加const属性,去掉const属性应该用const_cast double a = 10.23;int b = static_cast<int>(a);Base *ptr = new Child();Child ptr2 ...转载 2018-03-24 15:36:54 · 540 阅读 · 0 评论 -
C++ new关键字深入理解
“new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:[cpp] view plain...转载 2018-03-05 20:34:47 · 409 阅读 · 0 评论 -
定制自己的new和delete:operator new 和 operator delete
new和delete不同用法基本用法int * aptr = new int(10);delete aptr, aptr = nullptr;上面的代码是我们最基本也是最常见的使用new和delete的方式,当编译器运行int * aptr = new int(10); 这行代码时,其实是分为两个步骤来执行,第一步,调用operator new(size_t size) 分配内存;第二步在分配的内...转载 2018-03-04 17:08:10 · 242 阅读 · 0 评论 -
编译uclibc
uclibcuclibc是一个C库,一般用于嵌入式.uclibc的作用和glibc一样.不完全兼容从这里下的uClibc-0.9.33.2.tar.bz21/解压tar xvf uClibc-0.9.33.2.tar.bz22/配置进入目录后make menuconfig之后出来一个配置框Target Architecture (i386) ---> 进入之后,选中armT...转载 2018-02-28 09:12:37 · 2193 阅读 · 0 评论 -
C语言将字符串转换成对应的数字(十进制、十六进制)
问题1:讲一个十进制数字的字符串表示转换成对应的整数。举例:将“1234”转换成整数1234./*将字符串s转换成相应的整数*/ int atoi(char s[]) { int i = 0; int n = 0; for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i) { ...转载 2018-02-28 09:07:19 · 18977 阅读 · 1 评论 -
Linux系统 GCC搜索头文件和库文件的执行顺序
1、 gcc/g++ 查找头文件和库文件默认搜索路径echo 'main(){}'|gcc -E -v -2、头文件 gcc 在编译时寻找所需要的头文件 : ※搜寻会从-I开始 ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH转载 2018-01-19 19:10:32 · 973 阅读 · 0 评论 -
C++空类编译器自动生成的6个成员函数
一、问题 在C++中,编译器会为空类提供哪些默认成员函数?分别有什么样的功能呢? 二、详解1、空类,声明时编译器不会生成任何成员函数 对于空类,编译器不会生成任何的成员函数,只会生成1个字节的占位符。 有时可能会以为编译器会为空类生成默认构造函数等,事实上是不会的,编译器只会在需要的时候生成6个成员函数:默认构造函数、默认拷贝构造函数、默认析构函数、默认赋值...转载 2018-01-24 19:25:53 · 1142 阅读 · 0 评论 -
纯c语言通用链表
纯c语言通用链表概述c语言标准库不存在链表, 所以为了数据的简单操作自己写了一份链表代码############ general_list.h ###############ifndef __GENERAL_LIST_H__#define __GENERAL_LIST_H__原创 2017-05-08 17:04:46 · 1621 阅读 · 1 评论 -
指针函数与函数指针的区别
在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。今天我们从头把它搞清楚 首先它们之间的定义: 1、指针函数是指带指针的函数,即本质是一个函数,函数返回类型是某一类型的指针。类型标识符 *函数名(参数表)int *f(x,y); ...转载 2018-04-18 21:03:31 · 135 阅读 · 0 评论 -
函数指针
1 函数指针函数指针指向的是函数而非对象,和其他指针一样,函数指针指向某种特定类型,函数的类型由它的返回类型和形参类型共同决定,与函数名无关。bool LengthCompare(const string &,const string &) 该函数的类型是bool(const string& ,const string&)。想要声明一个指向改...转载 2018-04-19 20:06:51 · 158 阅读 · 0 评论 -
谈乱序执行和内存屏障
10多年前的程序员对处理器乱序执行和内存屏障应该是很熟悉的,但随着计算机技术突飞猛进的发展,我们离底层原理越来越远,这并不是一件坏事,但在有些情况下了解一些底层原理有助于我们更好的工作,比如现代高级语言多提供了多线程并发技术,如果不深入下来,那么有些由多线程造成问题就很难排查和理解.今天准备来聊聊乱序执行技术和内存屏障.为了能让大多数人理解,这里省略了很多不影响理解的旁枝末节,但由于我个人水平有限...转载 2018-06-04 23:50:11 · 1080 阅读 · 0 评论 -
C++中的inline用法
1 引入inline关键字的原因在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数,栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。 下面我们来看一个...转载 2018-08-12 14:55:46 · 29117 阅读 · 5 评论 -
linux下获取微秒级精度的时间
使用C语言在linux环境下获得微秒级时间1. 数据结构 int gettimeofday(struct timeval*tv, struct timezone *tz); 其参数tv是保存获取时间结果的结构体,参数tz用于保存时区结果: struct timezone{int tz_minuteswest;/*格林威治时间往西方的时差*/int t...转载 2018-07-31 20:30:54 · 2620 阅读 · 0 评论 -
c++ md5加密函数
1. 环境系统: centos 7依赖库yum install openssl-devel (1) 代码#md5.cpp#include <string>#include <openssl/md5.h>#include <stdio.h>#include <string.h>#define MD5_SECR...原创 2018-07-22 22:38:53 · 3833 阅读 · 0 评论 -
C C++编程产生指定范围内的随机数
C/C++编程产生指定范围内的随机数,直接上个小程序: #include <stdlib.h>#include <time.h>#include <stdio.h>#include <string>#include <string.h>/* * 获取随机数 * return : 随机数 */int...原创 2018-07-22 15:46:08 · 3654 阅读 · 0 评论 -
C++删除string最后一个字符的几种方法
C++删除string最后一个字符的几种方法#include<iostream>#include<string>using namespace std;int main() { string str; str = "123456"; cout << str << endl; //方法一:使用substr() str = str....转载 2018-07-15 23:55:13 · 17427 阅读 · 1 评论 -
c读取按行读取文件
c中没有getline()这个函数,该函数只存在于c++中。有些人说用gets,但是这个函数是不安全的,gets不知道字符串的大小,容易造成溢出的问题。解决方案,使用fgets函数其关键在于在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。因此,通过设置适当大小的缓冲区,即可实现读取一行的功能。 #include "stdio.h" int main...转载 2018-07-28 17:59:17 · 9069 阅读 · 0 评论 -
C++中的STL中map用法详解
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们...转载 2018-07-23 11:51:31 · 199 阅读 · 0 评论 -
C++11 左值、右值、引用详解
左值、右值在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址;表达式b+c、函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找转载 2018-01-14 17:40:47 · 157 阅读 · 0 评论 -
C++对象模型之内存布局(3)
经过两天的摸索,今天终于搞清楚C++对象模型.前两篇C++对象模型之内存布局(2)C++对象模型之内存布局(1)已经讲解了单继承,多重继承和多继承的对象模型.今天讲解菱形继承,虽然过程艰难,但是收获丰富.简单虚拟继承对象首先编写如下的测试程序:上述程序的输出如下:简单解释下:当存在虚基类时,先是子类的成员,然后才是虚基类的成员.以下是C对象的对象模型:通过在gdb下,输入指令:也可以输出C对象的对...转载 2018-01-14 16:25:04 · 134 阅读 · 0 评论 -
C++对象模型之内存布局(1)
如果想学习在linux或者在linux平台下开发,学习C/或C++是非常好的选择.俗话说,术业有专攻,学一门技术,就尽量学得深,也可以作为行走江湖,混口饭吃的一项本领.对于C,当初我是看了C与指针这门书,这本书讲解了很多我没有了解过的知识点,特别是指针讲解的很到位.最后还设计了C运行时内存模型.对于C++的学习,我看了C++ Primer之后,进阶的书为深入理解C++对象模型,这本书讲解了C++类...转载 2018-01-13 09:54:38 · 207 阅读 · 0 评论 -
若不想使用编译器自动生成的函数,应该明确拒绝
方法是:可以将对应的函数在类中进行声明,这样编译器就不会自动去生成。可行具体方案如下:(1).将这个函数在该类中声明为private,并不进行定义。(但当本类成员函数或者友元函数进行调用时,编译期不会出错,连接时才开始出错)代码示例: class HomeForSale{ public: ... private: ... HomeForSal...原创 2017-09-16 00:09:03 · 571 阅读 · 0 评论 -
localtime 和 localtime_r的区别
上程序:[c-sharp] view plain copy#include #include #include #include using namespace std; int main(int argc, char *argv[]) { time_t tNow =t转载 2017-09-06 22:02:29 · 2127 阅读 · 0 评论 -
C语言之可重入函数 和不可重入函数
可重入函数 在 实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果这个函数不幸被设计成为不可重入的函数的话,那么不同任务调用这个函数时可能修改其他任 务调用这个函数的数据,从而导致不可预料的后果。那么什么是可重入函数呢?所谓可重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会 出错。不可重入函数在实时系统设计中被视为不安全函数。 满足...转载 2017-09-06 21:51:32 · 8021 阅读 · 1 评论 -
宏定义日志输出
为了方便日志的书写,进行日志输出宏定义 #include <stdio.h>#include <memory.h>#include <time.h>// 调试日志信息#define LOG_INFO(format, ...) ...原创 2017-09-05 20:24:23 · 2375 阅读 · 0 评论 -
文件操作函数(3)
文件操作: 重命名, 删除, 拷贝文件重命名函数 rename(1) 功能: rename函数功能是给一个文件重命名, 用该函数可以实现文件移动功能,把一个文件的完整路径改一下就实现了这个文件的移动.(2) 函数原型: int rename(char *oldname, char *newname)(3) 头文件: #include (4转载 2016-10-23 21:35:25 · 277 阅读 · 0 评论 -
fork+exec 与system,popen区别
1、fork + execfork用来创建一个子进程。一个程序一调用fork函数,系统就为一个新的进程准备了前述三个段,首先,系统让新的进程与旧的进程使用同一个代码段,因为它们的程序还是相同的,对于数据段和堆栈段,系统则复制一份给新的进程,这样,父进程的所有数据都可以留给子进程,但是,子进程一旦开始运行,虽然它继承了父进程的一切数据,但实际上数据却已经分开,相互之间不再有影响了,也就是说,转载 2016-12-15 20:03:25 · 1568 阅读 · 0 评论 -
Linux进程同步之记录锁
记录锁相当于线程同步中读写锁的一种扩展类型,可以用来对有亲缘或无亲缘关系的进程进行文件读与写的同步,通过fcntl函数来执行上锁操作。尽管读写锁也可以通过在共享内存区来进行进程的同步,但是fcntl记录上锁往往更容易使用,且效率更高。记录锁的功能:当一个进程正在读或修改文件的某个部分是,它可以阻止其他进程修改同一文件区。对于这个功能阐述我认为有三点要解释的:记录锁不仅仅可以用来同步转载 2016-12-15 19:29:50 · 409 阅读 · 0 评论 -
IO - 同步,异步,阻塞,非阻塞
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不转载 2016-12-15 19:26:22 · 147 阅读 · 0 评论 -
c++多态注意事项
1 概念在面向对象语言中,接口的多种不同的实现方式即为多态。多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。 2 c++多态注意事项 2.1 在构造函数和析构函数期间不要调用虚函数 2.1.1 多态在构造函数里不起作用(1) 如果在构造函数里调用虚函数,调用的是本类的版本所...原创 2016-11-16 15:40:32 · 526 阅读 · 0 评论 -
fork()两次不同返回值的实现
fork()两次不同返回值的实现【NOTE1】首先必须有一点要清楚,函数的返回值是储存在寄存器eax中的。其次,当fork返回时,新进程会返回0是因为在初始化任务结构时,将eax设置为0;在fork中,把子进程加入到可运行的队列中,由进程调度程序在适当的时机调度运行。也就是从此时开始,当前进程分裂为两个并发的进程。无论哪个进程被调度运转载 2016-11-16 21:32:05 · 339 阅读 · 0 评论 -
c通过脚本实现操作
c通过脚本实现一些操作体会当我们需要处理一些相对于c/c++比较麻烦的文件操作,可以通过调用shell脚本来实现相关c函数(1) 函数原型: FILE * popen ( const char * command , const char * type )int pclose ( FILE * stream );(2) 需要头文件:原创 2016-10-24 19:50:09 · 641 阅读 · 0 评论 -
文件操作函数(1)
文件操作函数(1)判断目录或者文件权限函数access函数原型: int access(const char *filename, int mode)所属头文件:#include , #include 返回值: 返回0 表示成功,返回 -1表示错误。 filename:目录路径或者文件路径mode: 这个函数检查文件属性: (0111,八进制对应RW原创 2016-10-23 16:41:58 · 366 阅读 · 0 评论 -
文件操作函数(2)
文件操作函数(2) 打开文件函数fopen(1) 函数原型:FILE * fopen(const char * path,const char * mode)(2) 返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。(3) path: 操作文件路径(4) mode: 打开模式转载 2016-10-23 19:53:02 · 1629 阅读 · 0 评论