查看C 语言再学习的源代码
←
C 语言再学习
跳转到:
导航
、
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
== 从零开始的 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 数字解析流程图 [[文件: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 个字节: [[文件:utf-8.png]]
返回到
C 语言再学习
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面