“C 语言再学习”的版本间的差异
来自Dennis的知识库
Dennis zhuang(讨论 | 贡献) |
Dennis zhuang(讨论 | 贡献) (→第四节) |
||
(未显示1个用户的11个中间版本) | |||
第1行: | 第1行: | ||
== 从零开始的 JSON 库教程 == | == 从零开始的 JSON 库教程 == | ||
+ | |||
+ | 原文地址: https://zhuanlan.zhihu.com/p/22457315?refer=milocode | ||
=== 第一节 === | === 第一节 === | ||
第14行: | 第16行: | ||
* 提取重复代码,c 语言除了函数之外,宏是很重要的手段。 | * 提取重复代码,c 语言除了函数之外,宏是很重要的手段。 | ||
* 用 #if 0 ... #endif 去禁用代码是一个常用技巧,而且可以把 0 改为 1 去恢复。 | * 用 #if 0 ... #endif 去禁用代码是一个常用技巧,而且可以把 0 改为 1 去恢复。 | ||
+ | * JSON 数字解析流程图 | ||
+ | |||
+ | [[文件:Json-number.png]] | ||
+ | |||
+ | |||
+ | === 第三节 === | ||
+ | |||
+ | * man malloc 。 realloc 可以释放传入的指针所指向的内存,并分配新的。 | ||
+ | * 我发现 c 语言提藏简洁代码。 | ||
+ | * vector 或者其他数据结构的增长因子以小于 2 为佳,比如 1.5,为什么参考 https://www.zhihu.com/question/25079705/answer/30030883 | ||
+ | * 对于很小的『函数』,直接利用宏内联是更习惯的做法,比如 lept_init | ||
+ | * 利用 ifndef 来做默认参数配置,用户可以自定义。 | ||
+ | |||
+ | <pre> | ||
+ | #ifndef LEPT_PARSE_STACK_INIT_SIZE | ||
+ | #define LEPT_PARSE_STACK_INIT_SIZE 256 | ||
+ | #endif | ||
+ | </pre> | ||
+ | |||
+ | * 走到字符串到尾部,可以直接 for(;*p;p++),因为字符串末尾为 '\0',也就是 0。 | ||
+ | |||
+ | === 第四节 === | ||
+ | |||
+ | * Unicode 的一些知识点: | ||
+ | ** 统一字符集(Universal Coded Character Set, UCS),每个字符映射至一个整数码点(code point),码点的范围是 0 至 0x10FFFF,码点又通常记作 U+XXXX,当中 XXXX 为 16 进位数字。例如 劲 → U+52B2、峰 → U+5CF0。很明显,UCS 中的字符无法像 ASCII 般以一个字节存储。中、日、韩的三种文字占用了Unicode中0x3000到0x9FFF的部分。 | ||
+ | ** Unicode 还制定了各种储存码点的方式,这些方式称为 Unicode 转换格式(Uniform Transformation Format, UTF)。现时流行的 UTF 为 UTF-8、UTF-16 和 UTF-32。每种 UTF 会把一个码点储存为一至多个编码单元(code unit)。例如 UTF-8 的编码单元是 8 位的字节、UTF-16 为 16 位、UTF-32 为 32 位。除 UTF-32 外,UTF-8 和 UTF-16 都是可变长度编码。 | ||
+ | ** U+0000 至 U+FFFF 这组 Unicode 字符称为基本多文种平面(basic multilingual plane, BMP),还有另外 16 个平面。那么 BMP 以外的字符,JSON 会使用代理对(surrogate pair)表示 \uXXXX\uYYYY。在 BMP 中,保留了 2048 个代理码点。如果第一个码点是 U+D800 至 U+DBFF,我们便知道它的代码对的高代理项(high surrogate),之后应该伴随一个 U+DC00 至 U+DFFF 的低代理项(low surrogate)。然后,我们用下列公式把代理对 (H, L) 变换成真实的码点: | ||
+ | <pre> | ||
+ | codepoint = 0x10000 + (H − 0xD800) × 0x400 + (L − 0xDC00) | ||
+ | </pre> | ||
+ | * UTF-8 的编码单元是 8 位字节,每个码点编码成 1 至 4 个字节。它的编码方式很简单,按照码点的范围,把码点的二进位分拆成 1 至最多 4 个字节: | ||
+ | |||
+ | [[文件:utf8.png]] |
2017年1月10日 (二) 13:36的最后版本
目录 |
[编辑] 从零开始的 JSON 库教程
原文地址: https://zhuanlan.zhihu.com/p/22457315?refer=milocode
[编辑] 第一节
- cmake 可以生成 xcode 项目: cmake -G Xcode
- 通常枚举值用全大写(如 LEPT_NULL),而类型及函数则用小写(如 lept_type
- 宏的编写技巧: 反斜线代表该行未结束,会串接下一行。而如果宏里有多过一个语句(statement),就需要用 do { /*...*/ } while(0) 包裹成单个语句。
- 测试框架使用了 __LINE__ 这个编译器提供的宏,代表编译时该行的行号。如果用函数或内联函数,每次的行号便都会相同。
- 关于 inline: http://blog.csdn.net/hanchaoman/article/details/7270345
[编辑] 第二节
- 提取重复代码,c 语言除了函数之外,宏是很重要的手段。
- 用 #if 0 ... #endif 去禁用代码是一个常用技巧,而且可以把 0 改为 1 去恢复。
- JSON 数字解析流程图
[编辑] 第三节
- man malloc 。 realloc 可以释放传入的指针所指向的内存,并分配新的。
- 我发现 c 语言提藏简洁代码。
- vector 或者其他数据结构的增长因子以小于 2 为佳,比如 1.5,为什么参考 https://www.zhihu.com/question/25079705/answer/30030883
- 对于很小的『函数』,直接利用宏内联是更习惯的做法,比如 lept_init
- 利用 ifndef 来做默认参数配置,用户可以自定义。
#ifndef LEPT_PARSE_STACK_INIT_SIZE #define LEPT_PARSE_STACK_INIT_SIZE 256 #endif
- 走到字符串到尾部,可以直接 for(;*p;p++),因为字符串末尾为 '\0',也就是 0。
[编辑] 第四节
- Unicode 的一些知识点:
- 统一字符集(Universal Coded Character Set, UCS),每个字符映射至一个整数码点(code point),码点的范围是 0 至 0x10FFFF,码点又通常记作 U+XXXX,当中 XXXX 为 16 进位数字。例如 劲 → U+52B2、峰 → U+5CF0。很明显,UCS 中的字符无法像 ASCII 般以一个字节存储。中、日、韩的三种文字占用了Unicode中0x3000到0x9FFF的部分。
- Unicode 还制定了各种储存码点的方式,这些方式称为 Unicode 转换格式(Uniform Transformation Format, UTF)。现时流行的 UTF 为 UTF-8、UTF-16 和 UTF-32。每种 UTF 会把一个码点储存为一至多个编码单元(code unit)。例如 UTF-8 的编码单元是 8 位的字节、UTF-16 为 16 位、UTF-32 为 32 位。除 UTF-32 外,UTF-8 和 UTF-16 都是可变长度编码。
- U+0000 至 U+FFFF 这组 Unicode 字符称为基本多文种平面(basic multilingual plane, BMP),还有另外 16 个平面。那么 BMP 以外的字符,JSON 会使用代理对(surrogate pair)表示 \uXXXX\uYYYY。在 BMP 中,保留了 2048 个代理码点。如果第一个码点是 U+D800 至 U+DBFF,我们便知道它的代码对的高代理项(high surrogate),之后应该伴随一个 U+DC00 至 U+DFFF 的低代理项(low surrogate)。然后,我们用下列公式把代理对 (H, L) 变换成真实的码点:
codepoint = 0x10000 + (H − 0xD800) × 0x400 + (L − 0xDC00)
- UTF-8 的编码单元是 8 位字节,每个码点编码成 1 至 4 个字节。它的编码方式很简单,按照码点的范围,把码点的二进位分拆成 1 至最多 4 个字节: