Loading [MathJax]/jax/output/CommonHTML/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2023学习日志

2023学习日志

原创
作者头像
TomoriNao
发布于 2023-07-10 13:52:29
发布于 2023-07-10 13:52:29
2560
举报
文章被收录于专栏:每月技术成长每月技术成长

makefile

使用变量

变量基础

makefile中的变量在声明时需要设置初始值,使用时需要在变量名前加"" ,可以通过使用括号()或大括号{}包围变量名

示例:

代码语言:text
AI代码解释
复制
test = c
pro.o: pro.$(test)
    cc -c pro.$(test)

变量展开

不同于编程语言中变量的概念,Makefile中的变量更类似于c/c++中的概念,本质上是将变量的值替换到使用变量的地方

变量的嵌套

  • Makefile支持将变量的值赋给变量

但为了防止变量的递归定义,可以使用":="操作符,使用":="操作符的变量, 将其他变量赋值给该变量时只能使用前面已经声明的变量。而"="操作符支持在使用变量进行赋值时,可以使用在该赋值语句之后声明的变量

  • 也可在使用变量时进行嵌套操作

示例:

代码语言:text
AI代码解释
复制
# 将变量赋值给变量 使用=操作符
# 可以使用在该语句之前或之后定义的变量
test_1 = $(test_3)
test_3 = $(test_4)
test_4 = c
# 将变量赋值给变量 使用:=操作符
# 仅能使用在该语句之前声明的变量
test_1 = c
test_3 := $(test_1) 
# 使用嵌套变量
aaa = c
test = $($(aaa))

追加变量值

可以使用"+="操作符为变量追加值

如果变量未被定义,则"+="自动转变为"=",若变量已被定义,则会继承前次操作的赋值符

示例:

代码语言:text
AI代码解释
复制
# 变量未被定义,自动转换为"="
test += a
# 变量test未声明过,因此 等价于 test = a

# 前次操作使用"="赋值,继承"="
test = k
test += $(a)
a = cc
# 变量test已声明过,因此,等价于 test = $(test) $(a) 可以使用之后声明的变量

# 前次操作使用":="赋值,继承":="
a = k
b = c
test := $(a)
test += $(b)
# 变量test已声明过,因此等价于 test := $(test) $(b) 只能使用之前声明的变量 

override指令

可以重新设置make命令行设置的变量值,在define指令前,同样可以使用override指令

语法如下:

代码语言:text
AI代码解释
复制
override <variable>; = <value>;
override <variable>; := <value>;
override <variable>; += <value>;

多行变量

可以通过define关键字设置变量,此时可以有换行,与命令包类似,值得注意的是,define中的命令要以[tab]开头,才能被识别为命令

示例:

代码语言:text
AI代码解释
复制
# 其中命令未以[tab]开头,所以不会被识别命令
define two-lines
echo foo
echo $(bar)
endef

环境变量

make运行时可以获取到系统环境变量,也可以在make命令行中指定变量的值,或在Makefile中定义该变量,覆盖系统环境变量的值。

当make嵌套调用时,上层定义的变量会以环境变量的形式传递到下层make中。

默认情况下,只有命令行中的变量会被传递,但Makefile中以export关键字声明的变量可以传递给下层make)

目标变量

可以为某个目标设置局部变量,称为目标变量

目标变量可以和全局变量重名,作用范围为当前规则及其连带规则中,不会影响规则链之外全局变量的值

语法如下:

代码语言:text
AI代码解释
复制
<target ...> : <variable-assignment>;
<target ...> : override <variable-assignment>;

模式变量

为匹配某一模式目标定义目标变量

语法如下:

代码语言:text
AI代码解释
复制
<pattern ...>; : <variable-assignment>;
<pattern ...>; : override <variable-assignment>;

示例:

代码语言:text
AI代码解释
复制
%.o : CFLAGS = -0

rust

迭代器

惰性的迭代器

rust中的迭代器惰性的,即在调用迭代器之前,不会有任何作用。

for循环与迭代器

for循环的底层隐式地使用了迭代器

迭代器的作用

任何语言中迭代器的作用都是类似的:

  • 实现数据与抽象的分离
  • 提供统一、可靠的遍历数据序列(sequence)的方式
  • 无法对迭代器进行插入删除操作,限制使用者对数据的操作权限

Iterator trait 与 next方法

所有的迭代器都实现了定义于标准库Iterator trait

定义如下:

代码语言:scss
AI代码解释
复制
pub trait Iterator {
    tyoe Item;
    fn next(&mut self) -> Option<Self::Item>
    //忽略了各种方法的默认实现
}

next方法Iterator trait实现者必须实现的唯一方法,next方法一次返回迭代器中的一项,封装在Some中,而迭代器结束时,将返回None

消费适配器与迭代适配器

消费适配器

消费适配器即在Iterator trait 定义中调用了迭代器next方法的方法,如标准库实现的sum方法

迭代适配器

  • 迭代适配器Iterator trait定义中能够对迭代器进行类型转换,返回另一个类型的迭代器的方法,如map方法
  • 大部分迭代器适配器都能够接受闭包作为参数,且该闭包能够捕获周围环境

迭代器与性能

与使用封装好了的容器而非底层数组的原因类似,迭代器能够提供更高层级的抽象,且性能与底层实现几乎一致:零开销零成本抽象

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
初识Redis · C++客户端string
在前文,我们已经学习了Redis的定制化客户端怎么来的,以及如何配置好Redis定制化客户端,并且简单学习了一下RESP,其实也就是了解了一下为什么Redis可以定制化客户端而已,那么,我们现在有了Redis定制化客户端的条件,我们自然就可以使用大佬们封装好的Redis的API了。
_lazy
2025/04/19
660
初识Redis · C++客户端string
初识Redis · C++客户端list和hash
在上一篇文章我们介绍了string的基本使用,并且发现几乎唯一的难点就是使用迭代器方面,并且我们从上篇的迭代器简单引出了五种迭代器,分别是输入迭代器,输出迭代器,前向迭代器,双向迭代器,随机迭代器,那么这几种迭代器是我们在C++学习的时候没有具体学习的,当然,在这里我们也是简单了解了一下。
_lazy
2025/04/22
1180
初识Redis · C++客户端list和hash
听GPT 讲Rust源代码--library/core/src(1)
题图来自 The first unofficial game jam for Rust lang![1]
fliter
2023/11/14
3580
听GPT 讲Rust源代码--library/core/src(1)
学了C++不会STL,简直少了左膀右臂
容器(Container): 是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器; 迭代器(Iterator): 提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定了operator*()以及其他类似于指针的操作符地方法的类对象; 算法(Algorithm): 是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用; 仿函数(Functor) 适配器(Adaptor) 分配器(allocator) 仿函数、适配器、与分配器用的比较少,甚至没用过!在这里不做说明,有兴趣可以自己学习一下,那个东西C++软件工程可能用的比较多。
风骨散人Chiam
2020/10/28
8750
【笔记】C++标准库: 体系结构与内核分析(下)
这篇是侯捷关于C++标准模板库的课程《C++标准库: 体系结构与内核分析》的笔记, 上一篇在此, 课程内容大家自己找吧. 这个课程质量很高, 除了介绍STL的基础操作外, 更进一步介绍了STL的工作原理并展示了部分源代码. 尽管这门课所介绍的都是较老版本的STL内容, 但是毕竟底层思想多年来也没有太大改变, 对今天仍有很大意义.
ZifengHuang
2021/12/18
8540
【笔记】C++标准库: 体系结构与内核分析(下)
【c++】反向迭代器的探究实现
为了实现一个反向迭代器,需要创建一个新的迭代器类,该类的增加(operator++)和减少(operator--)操作符与标准迭代器的行为相反。也就是说,对于一个反向迭代器,operator++将会移动到前一个元素(_prev),而operator--将会移动到下一个元素(_next)。这意味着它将沿着相反的方向遍历列表。以下是如何定义一个ListIterator的反向版本的示例:
用户11029103
2024/05/04
1910
10.1 C++ STL 模板适配与迭代器
STL(Standard Template Library)标准模板库提供了模板适配器和迭代器等重要概念,为开发者提供了高效、灵活和方便的编程工具。模板适配器是指一组模板类或函数,它们提供一种适配机制,使得现有的模板能够适应新的需求。而迭代器则是STL中的令一种重要的概念,它是一个抽象化的数据访问机制,通过迭代器可以遍历STL容器中的元素。适配器与迭代器两者的紧密配合,使得开发者能够高效地处理容器中的元素,提高了代码的复用性和可维护性。
王 瑞
2023/08/17
2470
protobuf在嵌入式linux下的移植及c语言调用
关于什么是protobuf,网上搜搜一大堆,很多人用的都还是json,以为json是多种语言传输数据是万能的,看完了protobuf的实现,就明白了简单高效才是王道。
杨永贞
2020/08/05
7.1K0
全网最牛Linux内核Makefile系统文件详解(纯文字代码)
第一部分、概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows 的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,ma
嵌入式Linux内核
2022/09/22
3.4K0
全网最牛Linux内核Makefile系统文件详解(纯文字代码)
C++认识容器的迭代器
假设有个map容器,用于存储大学班级中各个家乡省份对应的学生数,key为省份中文全拼,value为学生数。现需要删除人数为0的记录,删除代码如下:
恋喵大鲤鱼
2018/08/03
1.3K0
STL小结
STL就是Standard Template Library,标准模板库。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list, vector,set,map等,STL也是算法和其它一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。是C++标准库的一个重要组成部分,它由Stepanov and Lee等人最先开发,它是与C++几乎同时开始开发的;一开始STL选择了Ada作为实现语言,但Ada有点不争气,最后他们选择了C++,C++中已经有了模板。STL又被添加进了C++库。1996年,惠普公司又免费公开了STL,为STL的推广做了很大的贡献。STL提供了类型安全、高效而易用特性的STL无疑是最值得C++程序员骄傲的部分。每一个C++程序员都应该好好学习STL。大体上包括container(容器)、algorithm(算法)和iterator(迭代器),容器和算法通过迭代器可以进行无缝连接。
Twcat_tree
2022/11/30
9490
STL小结
C++ stl_stl函数
长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出”可重复运用的东西”的方法,从函数(functions),类别(classes),函数库(function libraries),类别库(class libraries)、各种组件,从模块化设计,到面向对象(object oriented ),为的就是复用性的提升。
全栈程序员站长
2022/09/27
2.5K0
rust迭代器
迭代器模式允许你对一个序列的项进行某些处理。迭代器(iterator)负责遍历序列中的每一项和决定序列何时结束的逻辑。当使用迭代器时,我们无需重新实现这些逻辑。
zy010101
2023/05/26
5260
读完某C++神作,我只记下了100句话
假设p是指针,当delete p;时,后面一定要p=NULL将p指向空 cin cout cerr 都是iostream类型的对象。cout<<"hello world"<<endl; 其中cout是左操作数对象,<<是操作符,作用是将右操作数写到左操作数对象,"hello world"是右操作数,前面半句话的意思是将hello world写入cout对象。同理,<<endl是将endl写入cout,endl表示刷新缓冲区并换行。 std::cout ::是作用域操作符,表示std名空间下的cout,用来
震八方紫面昆仑侠
2020/12/02
1.5K0
疯子的算法总结(二) STL Ⅰ 算法 ( algorithm )
写在前面: 为了能够使后续的代码具有高效简洁的特点,在这里讲一下STL,就不用自己写堆,写队列,但是做为ACMer不用学的很全面,我认为够用就好,我只写我用的比较多的。
风骨散人Chiam
2020/10/28
5070
List类的超详细解析!(超2w+字)
list中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已达到可扩展的能力。以下为list中一些常见的重要接口。
利刃大大
2023/04/12
8570
c++ list, vector, map, set 区别与用法比较
List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]。 Vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。List对于随机访问速度慢得多,因为可能要遍历整个链表才能做到,但是对于插入就快的多了,不需要拷贝和移动数据,只需要改变指针的指向就可以了。另外对于新添加的元素,Vector有一套算法,而List可以任意加入。 Map,Set属于标准
hbbliyong
2018/03/06
10.3K0
c++ list, vector, map, set 区别与用法比较
技术栈系列基础篇2-Makefile
Makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,文件之间有哪些依赖等。Makefile有自己的书写格式、关键字、函数。像C 语言有自己的格式、关键字和函数一样。而且在Makefile中可以使用系统shell所提供的任何命令来完成想要的工作。Makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率
AndreKzWu
2022/09/19
6290
两万字总结《C++ Primer》要点
类型说明符,随后紧跟着一个或者多个变量名组成的列表,其中变量名以逗号分隔,最后以分号结束。
博文视点Broadview
2021/04/09
1.9K0
两万字总结《C++ Primer》要点
c++ 容器类_下面属于容器类的是
STL(Standard Template Library)的六大组件:容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。其交互关系:容器通过空间配置器取得数据存储空间,空间配置器通过迭代器存取容器的内容,仿函数可以协助空间配置器完成不同的策略变化,配接器可以修饰或套接仿函数。
全栈程序员站长
2022/09/30
1.2K0
c++ 容器类_下面属于容器类的是
相关推荐
初识Redis · C++客户端string
更多 >
LV.3
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档