在前一篇,我们提供了一个方向性的指南,但是学什么,怎么学却没有详细展开。本篇将在前文的基础上,着重介绍下怎样学习C的类型系统。 写在前面 在进入类型系统之前,我们应该先达成一项共识——尽可能使用C的现代语法。众所周知,出于兼容性的考虑,C中很多语法都是合法的。但是随着新版本的推出,有些语法可能是不推荐或者是需要避免使用的。所以本篇也尽可能采用推荐的语法形式(基于C11或以上版本),这也是现代C标题的含义。 采用现代语法有两点好处。其一,现代语法可以编译出更快更健壮的代码。编译器也是随着语言的发展而发展的,现代语法可以在一定程度上帮助编译器做更好的优化。其二,现代语法通常更简洁,更直观,也更...

  5MPhs0XJsUuo   2023年11月02日   71   0   0 C++

C是一门有着四十年历史的语言,先后经历过四次版本大升级(诞生、98、11、17(20),14算小升级)。每次升级都是很多问题和解决方案的取舍。了解这些历史,能更好地帮助我们理清语言的发展脉络。所以接下来我将借它的发展历程,谈一谈我对它的理解,最后给出我认为比较合理的学习路线指南。 C0——诞生 C诞生的目的是为了解决两个主要问题——性能和抽象。性能指的是拥有像C一样的底层访问能力和执行效率,抽象则意在语言层面提供对问题的描述能力和思考方法。这是C的立命之本,也是C经久不衰的原因。对于这两个目标,BjarneStroustrup想到的解决方法是充分利用现有的C的技术和工具,然后提供类来解决抽象问...

  5MPhs0XJsUuo   2023年11月02日   75   0   0 C++

前言 CMake是一个构建工具,通过它可以很容易创建跨平台的项目。通常使用它构建项目要分两步,通过源代码生成工程文件,通过工程文件构建目标产物(可能是动态库,静态库,也可能是可执行程序)。使用CMake的一个主要优势是在多平台或者多人协作的项目中,开发人员可以根据自己的喜好来使选择IDE,不用受其他人工程配置的影响,它有点像跨平台的IDE,通过它配置好相关设置之后,可以在多个平台无缝衔接,提高开发效率。 最简单的CMake工程 项目搭建 一个用CMake来管理的项目,其项目根目录通常会包含一个CMakeLists.txt的文件,当然子目录可能也有,这种情况我们稍后再说。我们先从最简单的项目开始...

  5MPhs0XJsUuo   2023年11月02日   127   0   0 C++

C是一门有着四十年历史的语言,先后经历过四次版本大升级(诞生、98、11、17(20),14算小升级)。每次升级都是很多问题和解决方案的取舍。了解这些历史,能更好地帮助我们理清语言的发展脉络。所以接下来我将借它的发展历程,谈一谈我对它的理解,最后给出我认为比较合理的学习路线指南。 C0——诞生 C诞生的目的是为了解决两个主要问题——性能和抽象。性能指的是拥有像C一样的底层访问能力和执行效率,抽象则意在语言层面提供对问题的描述能力和思考方法。这是C的立命之本,也是C经久不衰的原因。对于这两个目标,BjarneStroustrup想到的解决方法是充分利用现有的C的技术和工具,然后提供类来解决抽象问...

  5MPhs0XJsUuo   2023年11月02日   111   0   0 C++

在[上一章](https://www.yuque.com/docs/share/adb5b1e4-f3c6-46fd-ba4b-4dabce9b4f2a?《现代C学习指南-类型系统》)我们探讨了C的类型系统,并提出了从低到高,又从高到低的学习思路,本文就是一篇从高到低的学习指南,希望能提供一种新的视角。 什么是标准库 编程语言一般分为两个部分,一部分是语法部分,如上一章的类型系统,另一部分则是用这套语法完成的预定义的工具集,如本文的主题——标准库。标准库是一堆我们写代码时直接可以用的代码,就像是我们提前写好的一样,不仅如此,标准库还是跨平台的,还是经过工业级测试的,所以标准库有着靠谱,安全...

  5MPhs0XJsUuo   2023年11月02日   58   0   0 C++

类作为C中重要的概念之一,有着众多的特性,也是最迷人的部分! 类是一个加工厂,开发者使用C提供的各种材料组装这个工厂,使得它可以生产出符合自己要求的数据,通过对工厂的改造,可以精细控制对象从出生到死亡的各种行为,真正达到我的代码我做主的境界。 类 我们经常说的面向对象三大特征:封装,继承和多态,其实说的是一种抽象维度。最简单的就是具体类,它将数据打包在一起,提供操作数据的函数,使得开发者不再需要通过传参的形式传递数据。它实现了事物的抽象,也就是所谓的封装。第二层是在一堆数据中提取出共性的部分作为基类,然后将特性作为子类,充分利用继承的优点,实现代码复用。它不仅追求数据抽象,也追求行为上的相...

  5MPhs0XJsUuo   2023年11月02日   121   0   0 C++

前言 前不久,在我的一个项目中,需要展示一个横向滚动的标签页,它支持鼠标横向拖动和点击切换。在实现的过程中,我发现这个小功能需要同时用到前端的三辆马车,但是实现难度不高,而且最终效果还不错,是个难得的初学者项目,于是萌生了写这篇文章的想法,希望对初学者有所帮助。同时为了避免初学者学习框架,我打算用纯原生的方式实现它。 我们最终的效果应该类似于下面: 需求分析 需求分析就是细化我们需要完成的功能,某个功能的完成需要哪些技术的参与。对于初学者,需求分析至关重要,它可以帮助我们理清思路,找到解决问题的突破口,所以应该引起足够的重视。以本篇目标为例,标签页的需求分析就可以像下面这样: 我们的展示主体...

  5MPhs0XJsUuo   2023年11月01日   60   0   0 Html/Css

前言 在项目初创阶段,经常会遇到各种文件操作,拷贝头文件,库,批量重命名等。文件结构一复杂,这就将是个无聊的工作。 查找文件 find可以在目录结构中搜索文件,这是它在man里面的作用描述。那么怎么搜索呢?有多种方式,按文件时间,大小,按文件名,路径名,按文件类型,权限,按用户。而这些方式又可以通过与或非的逻辑相互组合,完成更苛刻的查找工作,简直是文件查找的福音。通常介绍一种命令都会以命令形式开始,find的格式如下 find[-H][-L][-P][-Ddebugopts][-Olevel][starting-point...][expression] [-H][-L][-P][-Ddeb...

  5MPhs0XJsUuo   2023年11月01日   49   0   0 Linux

ViewModel做为架构组件的三元老之一,是实现MVVM的有力武器。 ViewModel的设计目标 ViewModel的基本功能就是管理UI的数据。其实,从职责上来说,这又是对Activity和Fragment的一次功能拆分。以前存储在它们内部的数据,需要它们自己处理创建,更新,存储,恢复的所有过程,同时它们还要处理UI的数据绑定,更新,动画等操作。职责的多元化就容易出现不好定位和调试的问题。另外,Activity和Fragment作为UI的承载者,很多时候需要共享数据和复用功能。而UI的差异让复用的粒度划分很难把控,容易写出扩展性差的代码。基于这些痛点,ViewModel被设计出来了。...

  5MPhs0XJsUuo   2023年11月01日   77   0   0 Android开发

Kotlin的协程自推出以来,受到了越来越多Android开发者的追捧。另一方面由于它庞大的API,也将相当一部分开发者拒之门外。本篇试图从协程的几个重要概念入手,在复杂API中还原出它本来的面目,以全新的角度带读者走进Kotlin协程世界。 什么是协程 在很多有关协程的文章中,描述协程通常会用这样的一句描述——协程比线程更加轻量,是可取消的。这句话没有错,这两个都是协程的优点,但是并不是特点,它并没有解释协程是什么。那么什么是协程的特点呢,我觉得可以先用线程做个类比,解释一个概念最好的办法就是类比。我不打算使用科学严谨的描述,我想给线程一个我自己的定义——线程是一个可供CPU调度的执行单...

  5MPhs0XJsUuo   2023年11月01日   86   0   0 Android开发

上一篇文章,我介绍了Kotlin协程的创建,使用,协作等内容。本篇将引入更多的使用场景,继续带你走进协程世界。 使用协程处理异步数据流 常用编程语言都会内置对同一类型不同对象的数据集表示,我们通常称之为容器类。不同的容器类适用于不同的使用场景。Kotlin的Flow就是在异步计算的需求下引入的,用于表示异步的数据流。 Flow “问渠哪得清如许,为有源头活水来”,异步数据流的基本就是以某种方式获得异步数据。Kotlin提供了多种种方式,比较常用的就是Kotlin协程包的asFlow扩展和flow构造器。前者是对普通数据集的Flow化封装,没有更多可言,我们着重来看后者。flow构造器的主要...

  5MPhs0XJsUuo   2023年11月01日   51   0   0 Android开发

上一篇文章从理论上对Kotlin协程进行了部分说明,本文将在上一篇的基础上,从实战出发,继续协程之旅。 从源头说起 在Kotlin中,要想使用协程,首先需要使用协程创建器创建,但还有个前提——协程作用域(CoroutineScope)。在早期的Kotlin实现中,协程创建器是一等函数,也就是说我们随时随地可以通过协程创建器创建协程。但在协程正式发布以后,协程创建器需要在协程作用域对象上才能创建了,Kotlin添加了协程作用域来实现结构化并发。什么是结构化并发呢,通俗地说就是正确实施多个协程监控、管理的能力。在实际业务中,我们可能需要创建多个协程对象来完成不同的工作。为了对这些不相关的协程管...

  5MPhs0XJsUuo   2023年11月01日   82   0   0 Android开发

什么是JNI开发 JNI的全称是JavaNativeInterface,顾名思义,这是一种解决Java和C/C相互调用的编程方式。它其实只解决两个方面的问题,怎么找到和怎么访问。弄清楚这两个话题,我们就学会了JNI开发。需要注意的是,JNI开发只涉及到一小部分C/C开发知识,遇到问题的时候我们首先要判断是C/C的问题还是JNI的问题,这可以节省很多搜索和定位的时间。 用JVM的眼光看函数调用 我们知道Java程序是不能单独运行的,它需要运行在JVM上的,而JVM却又需要跑在物理机上,所以它的任务很重,既要处理Java代码,又要处理各种操作系统,硬件等问题。可以说了解了JVM,就了解了Java的...

  5MPhs0XJsUuo   2023年11月01日   78   0   0 Android开发

在Android开发中,有时候出于安全,性能,代码共用的考虑,需要使用C/C编写的库。虽然在现代化工具链的支持下,这个工作的难度已经大大降低,但是毕竟万事开头难,初学者往往还是会遇到很多不可预测的问题。本篇就是基于此背景下写的一份简陋指南,希望能对刚开始编写C/C库的读者有所帮助。同时为了尽可能减少认知断层,本篇将试着从一个最简单的功能开始,逐步添加工具链,直到实现最终功能,真正做到知其然且之所以然。 目标 本篇的目标很简单,就是能在Android应用中调用到C/C的函数——接收两个整型值,返回两者相加后的值,暂定这个函数为plus。 从C源文件开始 为了从我们最熟悉的地方开始,我们先不用复杂...

  5MPhs0XJsUuo   2023年11月01日   159   0   0 Android开发
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~