- 博客(259)
- 收藏
- 关注
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter6-CMake构建初探
从本章开始,我们不再仅仅停留在CMake脚本程序中,而是开始将CMake看作一个用于构建项目的利器了。在了解CMake的具体用法之前,先要清楚地掌握CMake项目的构建流程。换句话说,就是要清楚地掌握CMake项目的生命周期——从源程序和CMake目录程序,到构建好的二进制文件,再到这些二进制文件的安装和打包分发,最终到其他项目的源程序借助CMake使用这些二进制文件提供的功能。本章会说明CMake是怎样实现这样一个生命周期的,重点介绍其构建项目过程中的6个阶段,尤其是与构建紧密相关的阶段。
2025-04-03 09:17:55
773
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter5-实践:CMake快速排序
到这里,终于将CMake中比较常用的命令都讲解完了。本章是本书中第一个实践章节。实践章节不会介绍任何的新内容,而是通过一个具体的项目来实战演练前面学习到的知识。鉴于之前我们一直把CMake当作通用脚本语言来学习,本章也不会含糊,直接实现一个经典算法:快速排序!快速排序的基本原理很简单:找到数列的一个基准值,将数列分成比该值小和比该值大的两部分子数列;变量,分别代表CMake脚本模式下命令行参数的个数及第N个参数的值(包括cmake命令行名称本身)。如果希望传递自定义参数到CMake脚本程序中,可以在调用。
2025-04-03 09:14:53
45
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter4-常用命令
CMake主要为构建服务,因此提供了专门生成宏定义的模板,可以非常方便地用于代码生成。例如,可以将定义在CMake程序中的版本号等信息以宏定义的形式生成到头文件中,并最终构建到可执行文件中。宏定义模板主要分为两种形式:一种是值为0或1的宏定义,另一种是自定义值的宏定义。后一种形式的自定义值可为空值,用于表示存在性。#cmakedefine01 <变量>#cmakedefine <变量> [<值>]#define <变量> 0/* #undef <变量> */如下所示中是一个实例。
2025-04-02 08:54:03
526
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter3-基础语法
CMake中有很多预定义的普通变量和环境变量,它们一般以“CMAKE_”开头,即属于保留标识符。预定义变量往往与系统配置、运行环境、构建行为、编译工具链、编程语言等信息相关。CMake中的预定义变量全部可以在其官方文档中找到,本书也会陆续涉及很多常用的预定义变量。在此先简单看一些预定义变量的例子。CMAKE_ARGC表示CMake脚本程序在被cmake -P命令行调用执行时,命令行传递的参数个数。表示CMake脚本程序在被命令行调用执行时,命令行传递的第一个、第二个参数。
2025-04-02 08:51:25
624
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter2-CMake简介
CMake官网给出了如下的定义:CMake是一个跨平台开源工具家族,用于构建、测试和打包软件。CMake通过简单的平台无关且编译器无关的配置文件来控制软件的编译流程,并能够生成原生的Makefile和工作空间,以便用于用户所选择的编译环境。为了满足开源项目对强大的跨平台构建工具的需求,Kitware公司创建了CMake工具套装。定义中,“跨平台”和“开源”这两个特性不必多说,要注意的是“工具家族”这个说法。
2025-04-01 09:07:56
573
原创 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter1-构建之旅
结合前两个例程能够发现,使用要求在被传递时存在多种可能性:1.传递到使用者的构建要求;2.传递到使用者的使用要求;3.同时传递到使用者的构建要求和使用要求。前面两个例程分别对应第一种情况和第三种情况。第二种情况一般在当头文件(接口)使用了某个库,而源程序(实现)中并没有使用这个库时才会用到,多见于伪构建目标。举个另类但还算实用的例子:当希望引用一个接口库就可以自动链接多个库时,实际上就是要将多个链接库的使用要求传递给这个接口库的使用要求。接口库是伪构建目标,不需要编译,也就不存在构建要求。
2025-04-01 09:06:31
813
原创 侯捷 C++ 课程学习笔记:C++内存管理机制
debug header里面有个字段是记录这内存是用来干什么的,比如在main函数正式开始前的那些叫CRT_BLOCK,main函数过程中的是NORMAL_BLOCK,则main函数结束的那一刻,如果还有标记为NORMAL_BLOCK的内存块(但此时还有标记为CRT_BLOCK的内存块),则就是内存泄漏了。VC6的allocator,内部没有做任何的内存管理,只是以::operator new和::operator delete完成allocate()和deallocate(),没有任何特殊设计。
2025-03-29 10:51:42
655
原创 侯捷 C++ 课程学习笔记:C++新标准C++11&14
30、存放在容器里面的东西,如果这个容器是以节点的形式存放的(例如list、set等,vector和deque不是以节点存放的),那么这个东西(对象的类)有没有移动构造函数和移动赋值函数并不重要,它们性能差异不大。vector和deque存在内存的扩张,会有大量元素的拷贝,因此存在在它俩里面的对象的类就有必要有移动构造函数和移动赋值函数。7、initializer_list的拷贝是浅拷贝,它的构造函数只是传了一个array的头部指针和一个array的长度。private继承不是,例如tuple的实现。
2025-03-29 10:50:51
534
原创 侯捷 C++ 课程学习笔记:STL标准库与泛型编程
59、.\mingw530_32\i686-w64-mingw32\include\c++\backward\backward_warning.h有以下内容,告诉大家哪些东西是已经过时的了,现在用的是啥。55、{10、20、20、20、30},用lower_bound找20,找到的是第二个元素的位置。用upper_bound找20,找到的是第四个元素的位置。30、list的大小在2.9版本是4(一个指针,指向一个空虚的节点),在4.9版本是8(两个指针,分别指向2.9版本里面那个空虚节点的前后指针).
2025-03-29 10:48:45
1123
原创 侯捷 C++ 课程学习笔记:C++面向对象高级编程(下)
22、当一个函数要加const(这个函数不打算改变class的data)却没有加const的时候,一个const对象调用该函数就会有问题(常量对象不能调用非常量成员函数)。23、当成员函数的const和non-const版本同时存在,const对象只会调用const版本,non-const对象只会调用non-const版本。25、 如果一个没有虚函数的类A的大小是12字节,则它有虚函数的时候,类A的大小是16字节。3、为避免同名的函数产生冲突,最好是用namespace把函数包起来。与特化相对的是泛化。
2025-03-29 10:47:40
392
原创 侯捷 C++ 课程学习笔记:C++面向对象高级编程(上)
假如不这么做,当一个用const修饰的对象去调用这个函数的时候,万一这个函数有可能会修改数据,那就矛盾了。35、如果有一个类B,它的父类是A,它有一个成员变量是类C,则创建B对象的时,构造的顺序是先A,然后C,最后才是B自己。37、当设计一个基类的时候,如果你不知道子类的名字是什么、但是你又想知道子类(比如说想调用它的某个函数)。17、含有指针成员的类要有拷贝构造和拷贝赋值,而不含有指针成员的类可以直接使用编译器提供的默认的一套。1、在设计一个类的时候,数据应该尽量是private的,几乎没有例外。
2025-03-29 10:46:17
797
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-附录D-JavaScript 工具
Emscripten 与 LLVM。构建工具、自动化系统和任务运行器。编译/转译工具及静态类型系统。JavaScript 工具。
2025-03-07 00:00:00
915
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-附录C-JavaScript 库和框架
JavaScript 库和框架。
2025-03-06 00:00:00
743
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-附录A-ES2018 和 ES2019
处理异步迭代器的 reject()对象字面量的剩余操作符和扩展操作符。ES2018 和 ES2019。使用 next()手动异步迭代。Unicode 属性转义。可选的 catch 绑定。创建并使用异步迭代器。
2025-03-04 00:00:00
774
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter28-最佳实践
这里有 6 次属性查找:3 次是为查找 window.location.href.substring(),3 次是为查找window.location.href.indexOf()。第一次仍然要用 O(n)的复杂度去访问这个属性,但后续每次访问就都是 O(1),这样就是质的提升了。另外,如果实现某个需求既可以使用数组的数值索引,又可以使用命名属性(比如 NodeList 对象),那就都应该使用数值索引。常量值或 O(1),指字面量和保存在变量中的值,表示读取常量值所需的时间不会因值的多少而变化。
2025-03-03 00:00:00
943
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter27-工作者线程
建立的连接会在页面的生命周期内持续存在,只有当页面销毁且没有连接时,浏览器才会终止共享线程。在共享线程端口(稍后讨论)上调用 close()时,只要还有一个端口连接到该线程就不会真的终止线程。如上表所示,标签页 2 和标签页 3 再次调用 new SharedWorker()会连接到已有线程。随着连接的增加和移除,浏览器会记录连接总数。共享工作者线程的生命周期具有与专用工作者线程相同的阶段的特性。不同之处在于,专用工作者线程只跟一个页面绑定,而共享工作者线程只要还有一个上下文连接就会持续存在。
2025-03-02 00:00:00
1367
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter25-客户端存储
JavaScript 中的 cookie。sessionStorage 对象。使用 cookie 的注意事项。localStorage 对象。cookie 的构成。Storage 类型。
2025-02-28 00:00:00
888
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter24-网络请求与远程资源
Response 类还有两个用于生成 Response 对象的静态方法:Response.redirect()和 Response.error()。大多数情况下,产生 Response 对象的主要方式是调用 fetch(),它返回一个最后会解决为Response 对象的期约,这个 Response 对象代表实际的 HTTP 响应。另一个静态方法 Response.error()用于产生表示网络错误的 Response 对象(网络错误会导致fetch()期约被拒绝)。创建 Response 对象。
2025-02-27 00:00:00
937
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter22-处理 XML
浏览器对 XML DOM 的支持。XMLSerializer 类型。XSLTProcessor 类型。浏览器对 XPath 的支持。浏览器对 XSLT 的支持。DOMParser 类型。
2025-02-25 00:00:00
948
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter21-错误处理与调试
所有现代桌面浏览器都会通过控制台暴露错误。这些错误可以显示在开发者工具内嵌的控制台中。在前面提到的所有浏览器中,访问开发者工具的路径是相似的。可能最简单的查看错误的方式就是在页面上单击鼠标右键,然后在上下文菜单中选择 Inspect(检查)或 Inspect Element(检查元素),然后再单击 Console(控制台)选项卡。要直接进入控制台,不同操作系统和浏览器支持不同的快捷键,如下表所示。结果就是在页面的一个小区域内显示日志信息。抛出错误与 try/catch。finally 子句。
2025-02-24 00:00:00
866
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter20-JavaScript API
这些事件被设计得尽可能具体,以便 Web 开发者能够使用较少的 HTML 和 JavaScript 创建自定义的音频/视频播放器(而不是创建新 Flash 影片)。除了有很多属性,媒体元素还有很多事件。这些事件会监控由于媒体回放或用户交互导致的不同属性的变化。下表列出了这些事件。这两个元素有很多共有属性,可以用于确定媒体的当前状态,如下表所示。File API 与 Blob API。FileReaderSync 类型。FileReader 类型。对象 URL 与 Blob。CryptoKey 与算法。
2025-02-23 00:00:00
525
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter19-表单脚本
document.execCommand()可以接收 3 个参数:要执行的命令、表示浏览器是否为命令提供用户界面的布尔值和执行命令必需的值(如果不需要则为 null)。最后一个方法是 queryCommandValue(),此方法可以返回执行命令时使用的值(即前面示例的execCommand()中的第三个参数)。虽然这些命令并不都可以通过 document.execCommand()使用,但相应的键盘快捷键都是可以用的。注意,即使命令是所有浏览器都支持的,命令生成的 HTML 通常差别也很大。
2025-02-22 00:00:00
516
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter18-动画与 Canvas 图形
通过 requestAnimationFrame 节流。使用 requestAnimationFrame。GLSL 100 升级到 GLSL 300。WebGL1 与 WebGL2。动画与 Canvas 图形。
2025-02-21 00:00:00
779
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter17-事件
事件处理程序的名字以"on"开头,因此 click 事件的处理程序叫作 onclick,而 load 事件的处理程序叫作 onload。这个对象包含了一些基本信息,比如导致事件的元素、发生的事件类型,以及可能与特定事件相关的任何其他数据。通过在按钮的 onclick 事件处理程序中将 cancelBubble 设置为 true,可以阻止事件冒泡到document.body,也就阻止了调用注册在它上面的事件处理程序。与 DOM 事件对象不同, IE 事件对象可以基于事件处理程序被指定的方式以不同方式来访问。
2025-02-20 00:00:00
980
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter16-DOM2 和 DOM3
任何支持 style 属性的 HTML 元素在 JavaScript 中都会有一个对应的 style 属性。这个 style 属性是 CSSStyleDeclaration 类型的实例,其中包含通过 HTML style 属性为元素设置的所有样式信息,但不包含通过层叠机制从文档样式和外部样式中继承来的样式。HTML style 属性中的 CSS 属性在 JavaScript style 对象中都有对应的属性。本节介绍的属性和方法并不是 DOM2 Style 规范中定义的,但与 HTML 元素的样式有关。
2025-02-19 00:00:00
680
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter15-DOM 扩展
IE9 之前的版本与其他浏览器在处理空白文本节点上的差异导致了 children 属性的出现。children 属性是一个 HTMLCollection,只包含元素的 Element 类型的子节点。如果元素的子节点类型全部是元素类型,那 children 和 childNodes 中包含的节点应该是一样的。自然地,JavaScript 与 CSS 类的交互就增多了,包括动态修改类名,以及根据给定的一个或一组类名查询元素,等等。contains()方法应该在要搜索的祖先元素上调用,参数是待确定的目标节点。
2025-02-18 00:00:00
1554
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter14-DOM
注意,在调用 observe()时,MutationObserverInit 对象中的 attribute、characterData和 childList 属性必须至少有一项为 true(无论是直接设置这几个属性,还是通过设置attributeOldValue 等属性间接导致它们的值转换为 true)。因为回调执行之前可能同时发生多个满足观察条件的事件,所以每次执行回调都会传入一个包含按顺序入队的 MutationRecord 实例的数组。所有这些都可以用来获取对应的属性值,也可以用来修改相应的值。
2025-02-17 00:00:00
973
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter13-客户端检测
注意,强烈建议在使用这些 API 之前先检测它们是否存在,因为其中多数都不是强制性的,且很多浏览器没有支持。另外,本节介绍的特性有时候不一定可靠。使用能力检测而非用户代理检测的优点在于,伪造用户代理字符串很简单,而伪造能够欺骗能力检测的浏览器特性却很难。如果你的应用程序需要使用特定的浏览器能力,那么最好集中检测所有能力,而不是等到用的时候再重复检测。这种方式不要求事先知道特定浏览器的信息,只需检测自己关心的能力是否存在即可。能力检测最有效的场景是检测能力是否存在的同时,验证其是否能够展现出预期的行为。
2025-02-16 00:00:00
744
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter12-BOM
这个对象独特的地方在于,它既是 window 的属性,也是 document 的属性。这个对象中保存的纯粹是客户端能力信息,也就是浏览器窗口外面的客户端显示器的信息,比如像素宽度和像素高度。跟使用任何 window 对象一样,可以使用这个对象操纵新打开的窗口。在这些浏览器中,可以将新打开的标签页的 opener 属性设置为 null,表示新打开的标签页可以运行在独立的进程中。这个属性只在弹出窗口的最上层 window 对象(top)有定义,是指向调用 window.open()打开它的窗口或窗格的指针。
2025-02-15 00:00:00
922
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter11-期约与异步函数
期约实例的方法是连接外部同步代码与内部异步代码之间的桥梁。这些方法可以访问异步操作返回的数据,处理期约成功和失败的结果,连续对期约求值,或者添加只有期约进入终止状态时才会执行的代码。ECMAScript 6 新增了正式的 Promise(期约)引用类型,支持优雅地定义和组织异步逻辑。前者就是一个期约接一个期约地拼接,后者则是将多个期约组合为一个期约。ES6 期约实现是很可靠的,但它也有不足之处。比如,很多第三方期约库实现中具备而 ECMAScript规范却未涉及的两个特性:期约取消和进度追踪。
2025-02-14 00:00:00
793
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter9-代理与反射
通过捕获 get、set 和 has 等操作,可以知道对象属性什么时候被访问、被查询。代理可以拦截反射 API 的操作,而这意味着完全可以创建一个代理,通过它去代理另一个代理。ECMAScript 6 新增的代理和反射为开发者提供了拦截并向基本操作嵌入额外行为的能力。代理的内部实现对外部代码是不可见的,因此要隐藏目标对象上的属性也轻而易举。使用代理可以在代码中实现一些有用的编程模式。捕获器参数和反射 API。函数与构造函数参数验证。代理捕获器与反射方法。数据绑定与可观察对象。
2025-02-12 00:00:00
634
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter6-集合引用类型
ECMAScript 6 新增的“弱映射”(WeakMap)是一种新的集合类型,为这门语言带来了增强的键/值对存储机制。WeakMap 中的“weak”(弱),描述的是 JavaScript 垃圾回收程序对待“弱映射”中键的方式。ECMAScript 6 新增的“弱集合”(WeakSet)是一种新的集合类型,为这门语言带来了集合数据结构。WeakSet 中的“weak”(弱),描述的是 JavaScript 垃圾回收程序对待“弱集合”中值的方式。“字节序”指的是计算系统维护的一种字节顺序的约定。
2025-02-09 00:00:00
732
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter5-基本引用类型
这个方法接收两个参数,第一个参数可以是一个 RegExp 对象或一个字符串(这个字符串不会转换为正则表达式),第二个参数可以是一个字符串或一个函数。两者的区别在于,indexOf()方法从字符串开头开始查找子字符串,而 lastIndexOf()方法从字符串末尾开始查找子字符串。字符串的 HTML 方法。match()方法接收一个参数,可以是一个正则表达式字符串,也可以是一个 RegExp 对象。replace()方法第二个参数是字符串的情况下,有几个特殊的字符序列,可以用来插入正则表达式操作的值。
2025-02-08 00:00:00
793
原创 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter4-变量、作用域与内存
这意味着函数外的值会被复制到函数内部的参数中,就像从一个变量复制到另一个变量一样。如果是原始值,那么就跟原始值变量的复制一样,如果是引用值,那么就跟引用值变量的复制一样。正如 ECMA-262 所规定的,JavaScript 变量是松散类型的,而且变量不过就是特定时间点一个特定值的名称而已。原始值(primitive value)就是最简单的数据,引用值(reference value)则是由多个值构成的对象。原始值和引用值的定义方式很类似,都是创建一个变量,然后给它赋一个值。
2025-02-07 00:00:00
522
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人