![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++基础
Captain--Jack
这个作者很懒,什么都没留下…
展开
-
--start-group和--end-group
ld链接器,正常情况,链接的时候库文件只会按它们出现在命令行的顺序搜索一遍,如果包里有未定义的引用标号,而且该包还被放在命令行的后面,这样链接器就无法解决该标号的引用问题。通过给包分组,这些包可以被循环搜索直到所有的引用都可以解决为止。使用该选项将降低性能。只有在无法避免多个包之间互相引用的情况下才使用。...转载 2020-10-19 14:29:31 · 1791 阅读 · 0 评论 -
sscanf 解析字符串
之前一直以为C++引入正则表达式之前,不能实现类似功能,最近发现sscanf就可以实现一些简单的字符串解析功能,记录下。int scanf( const char *format [,argument]… ); char buf[100]; //1、常用用法 sscanf("123456abcdeABCDE", "%s", buf); printf("1 、buf = %s\n", buf); //2、限制读取字符长度 sscanf("123456abcdeABCDE", "%5s", buf原创 2020-09-04 16:17:42 · 1679 阅读 · 0 评论 -
sizeof()、strlen()区别
1、sizeofsizeof是运算符,其值在编译时已计算好,参数可以是数组、指针、类型、对象、函数等。功能是获得保证能容纳实现所建立的最大对象的字节大小。由于在编译时计算,故不能用来返回动态分配的内存空间大小。2、strlenstrlen是函数,运行时计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。功能是返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该换书实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符’\0’,返回原创 2020-08-20 16:27:54 · 198 阅读 · 0 评论 -
sizeof用法详解
一、sizeof是什么sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。二、sizeof的使用方法1、用于数据类型 sizeof使用形式:sizeof(type) 数据类型必须用括号括住。如sizeof(int)。2、用于变量sizeof使用形式:sizeof(var_name)或sizeof var_name变量名可转载 2020-08-20 15:56:45 · 70861 阅读 · 3 评论 -
静态库调用其它静态库
在我们封装底层库的时候,有时会想能不能把底层的库直接打包进我们的库里,之前也一直有这样的疑问,最近终于把这个问题搞清楚了,如下:编译静态库时只有编译过程,没有链接过程,静态库引用其它库并不会在编译的时候把引用的库函数编译到生成的lib中,只是简单的将编译后的中间文件打包,在编译最终的可执行项目(.exe和.dll)的时候,需要引用所有的库,进行符号消解。如果你需要封装,使用动态库。...原创 2019-12-24 12:19:22 · 4354 阅读 · 0 评论 -
linux下 GCC编译链接静态库&动态库
静态库有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 要讲到的environ变量)。本文将介绍怎么创建这样一个库。这些文件的目录结构是:$ tree . |-- main.c `-- stack |-- is_empty...转载 2019-12-24 10:54:55 · 711 阅读 · 1 评论 -
#pragma pack 详解
#pragma pack(push,1)与#pragma pack(1)的区别这是给编译器用的参数设置(注意,在编译阶段),有关结构体字节对齐方式设置,#pragma pack是指定数据在内存中的对齐方式。#pragma pack (n) //作用:C编译器将按照n个字节对齐。#pragma pack ()//作用:取消自定义字节...原创 2019-12-03 11:36:09 · 2152 阅读 · 0 评论 -
memmove和memcpy函数的区别及实现
一、memmove()和memcpy()函数和strcpy()函数的区别;(1)使用的类型不同,strcpy()函数只对字符串进行操作;memmove()和memcpy()函数对所有类型都适用,为内存拷贝;(2)strcpy()以’\0’为拷贝的结束条件;而memmove()和memcpy()函数则是以第三个参数num进行控制拷贝;二、函数说明:1.memcpy函数的功能是从源sr...转载 2019-11-25 11:01:13 · 347 阅读 · 0 评论 -
VS版本、GCC版本与C++版本的对应关系
做嵌入式开发经常遇到一些编译器和C++版本不匹配的问题,现整理如下:目前C语言的标准有:C89(ANSI C)、C90、C95、C99(ISO C)、C11(C1x)目前C++语言的标准有:C++98、C++03(对98小幅修改)、C++11(全面进化)、C++14、C++17C语言标准的介绍,请参考:C语言标准简介C89(ANSI C)、C99(ISO C)、C11(C1x)各...原创 2019-09-10 20:02:33 · 40394 阅读 · 0 评论 -
C/C++ 宏定义的常见使用
在我们平时的开发工程中,会经常使用到宏,它功能强大,用的好会带来意想不到的妙用。今天来整理下一些常见的用法,方便回顾。***************************************************************************************************************************#:将其后面的宏参数进行字符...原创 2019-04-20 15:10:10 · 2671 阅读 · 0 评论 -
C++引用详解
引用的概念引用:就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名; 如下:定义引用ra,它是变量a的引用,即别名。 int a; int &ra=a; (1)&在此不是求地址运算符,而是起标识作用。 (2)类型标识符是指目标变量的类型。 (3)声明引用时...转载 2019-04-19 09:51:58 · 314 阅读 · 0 评论 -
从4行代码看右值引用
从4行代码看右值引用概述 右值引用的概念有些读者可能会感到陌生,其实他和C++98/03中的左值引用有些类似,例如,c++98/03中的左值引用是这样的:int i = 0;int& j = i; 这里的int&是对左值进行绑定(但是int&却不能绑定右值),相应的,对右值进行绑定的引用就是右值引用,他的语法是这样的A&&,通过双引号...转载 2019-04-19 09:07:28 · 235 阅读 · 0 评论 -
泛化之美--C++11可变模版参数的妙用
1概述C++11的新特性--可变模版参数(variadictemplates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。然而由于可变模版参数比较抽象,使用起来需要一定的技巧,所以它也是C++11中最难理解和掌握的特性之一。虽然掌握可变模版...转载 2019-04-17 15:33:33 · 307 阅读 · 0 评论 -
C/C++ Union
共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。union变量所占用的内存长度等于最长的成员的内存长度。另外,同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数。联合里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存。此外...原创 2019-04-12 17:17:10 · 289 阅读 · 0 评论 -
char* char[] char** char*[] char[][]详解
指针和数组是C的比较难搞懂的知识点, 需要结合内存来学习, 非常感谢各位兄弟为我指点迷津.下面总结一下 : 首先说明一下C程序在运行时, 不同的内容或变量分别存储在什么地方?分了几块区域分别是, code, constants, global, heap, stack; (内存地址从低到高)其中constants存储常量(常量值不允许修改), global存储在所有转载 2016-11-09 10:44:12 · 17721 阅读 · 3 评论 -
静态存储区、栈区、堆区的区别
内存分配有三种:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。栈区:在执行函数时,函数(包括main函数)内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量原创 2016-11-09 14:28:38 · 15540 阅读 · 1 评论 -
C++静态库与动态库
这次分享的宗旨是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书《程序员的自我修养——链接、装载与库》。什么是库库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库转载 2016-10-28 18:00:54 · 409 阅读 · 0 评论 -
C++11 多线程同步
多线程能提高程序的效率,但同时也带来了相应的问题----数据竞争。当多个线程同时操作同一个变量时,就会出现数据竞争。出现数据竞争,一般会用临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)这四种方法来完成线程同步。1、临界区对于临界资源,多线程必须互斥地对它进行访问。每个线程访问临界资源的那段代码就称为临界转载 2016-11-09 21:28:05 · 8441 阅读 · 0 评论 -
C++11 线程
c++11 中创建线程非常简单:[cpp] view plain copy#include #include using namespace std; void thread_func() { //... } void thread_func2(int i) {转载 2016-11-09 20:46:33 · 619 阅读 · 0 评论 -
标准c++中string类函数介绍
标准c++中string类函数介绍之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。好了,进转载 2016-11-11 16:22:24 · 465 阅读 · 0 评论 -
C++11 std::chrono库详解
chrono是一个time library, 源于boost,现在已经是C++标准, 今天我们一起来看看它的用法。 要使用chrono库,需要#include,其所有实现均在std::chrono namespace下。注意标准库里面的每个命名空间代表了一个独立的概念。所以下文中的概念均以命名空间的名字表示! chrono是一个模版库,使用简单,功能强大,只需要理解三个概念:durati转载 2016-11-21 13:58:00 · 5415 阅读 · 0 评论 -
Linux系统中“动态库”和“静态库”那点事儿
今天忙着编译库文件,中间遇到不少问题,看到这篇文章不错,就转载过来了,后面我会整理下今天的问题,从网上下载了一个开源库,如何进行编译,如何加载到我们的工程中。今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻。在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情。 在Linux操作系统中,普遍使用ELF格式作为可执行...原创 2016-10-28 17:41:08 · 5093 阅读 · 8 评论 -
C++11中的std::call_once
在多线程编程中,有时某个任务只需要执行一次,此时可以用C++11中的std::call_once函数配合std::once_flag来实现。如果多个线程需要同时调用某个函数,std::call_once可以保证多个线程对该函数只调用一次。也可用在解决线程安全的单例模式。C++11中的std::call_once函数位于<mutex>头文件中。template<class ...原创 2019-03-12 20:27:08 · 541 阅读 · 0 评论 -
C++11容器中的emplace相关函数的使用
在C++开发过程中,我们经常会用STL的各种容器,比如vector,map,set等,这些容器极大的方便了我们的开发。在使用这些容器的过程中,我们会大量用到的操作就是插入操作,比如vector的push_back,map的insert,set的insert。这些插入操作会涉及到两次构造,首先是对象的初始化构造,接着在插入的时候会复制一次,会触发拷贝构造。但是很多时候我们并不需要两次构造带来效率的浪...原创 2019-03-12 20:41:32 · 2771 阅读 · 0 评论 -
C/C++ 位域
内存是以字节为单位进行编址的,编程语言的基本类型中,最小类型的长度一般也就是1个字节。然而,在解决某些问题时,必须要有二进制层面的表达手段(如CAN数据的解析等),又或者某些情形下根本用不着1个字节,作为强大到令人窒息的C/C++,难道没有解决方法?其提供的完美解决方法就是位域(位段)结构,本文将从定义、说明、内存布局和使用这四个方面对它进行详细的介绍。1. 位域定义首先,让我们看一下位域...原创 2019-04-12 15:31:31 · 952 阅读 · 0 评论 -
C++ list容器基础使用
***********************************************************************************************前言各个容器有很多的相似性,大同小异。首先对它们有个总体把握,看看他们的分类:标准STL序列容器:vector、string、deque和list。标准STL关联容器:set转载 2016-10-25 18:57:33 · 466 阅读 · 0 评论