knowledge:3d_print:2023052301
差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 后一修订版 | 前一修订版 | ||
| knowledge:3d_print:2023052301 [2023/05/23 05:35] – 创建 弘毅 | knowledge:3d_print:2023052301 [2025/10/11 02:55] (当前版本) – 外部编辑 127.0.0.1 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | ====== | + | ====== 编码标准 ====== |
| + | 当你在写与 Marlin 相关的代码时,请遵循以下规范。提交的代码若不接近当前的代码风格,那么会被要求更改。你的代码审核人员应该指出哪里需要被更改。 | ||
| + | |||
| + | ====== 编码风格 ====== | ||
| + | |||
| + | ===== 缩进 ===== | ||
| + | |||
| + | 缩进对于可读性与可维护性起着至关重要的作用,并且能让一些普通文本编辑器(TextMate,Sublime 等)正确地按照代码层级折叠代码。 | ||
| + | |||
| + | * 使用两个空格作为缩进,注意不要使用 ''< | ||
| + | * 使用所有的块元素包括 ''# | ||
| + | void myFunction() { | ||
| + | if (myCondition == 0) { | ||
| + | #ifdef PETER_PARKER | ||
| + | slingWeb(100); | ||
| + | #else | ||
| + | findPhoneBooth(); | ||
| + | #endif | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== 括号风格 ===== | ||
| + | |||
| + | Marlin 使用的括号风格有以下目的: | ||
| + | |||
| + | * 在开始行的末尾显示已折叠的代码块:'' | ||
| + | * 保证代码的连续性以及形成统一的代码风格 | ||
| + | * 使在屏幕上显示代码的行数最大化 | ||
| + | |||
| + | 倘若垂直的缩进空格让代码的可读性更强,那么增加一个空行比使用不同的括号风格更好: | ||
| + | |||
| + | * 来源于古老的“一个真正的括号风格” | ||
| + | * 在行末写一个左括号:'' | ||
| + | * 同样地,对于声明语句:'' | ||
| + | * 同缩进的右括号保持垂直 | ||
| + | |||
| + | “一个真正的括号风格”例子:< | ||
| + | void my_function(void) { | ||
| + | if (...) { | ||
| + | ... | ||
| + | } | ||
| + | else { | ||
| + | ... | ||
| + | } | ||
| + | | ||
| + | switch (val) { | ||
| + | case 1: SERIAL_CHAR(' | ||
| + | case 2: SERIAL_CHAR(' | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== 空格 ===== | ||
| + | |||
| + | * 在控制关键字后加一个空格:'' | ||
| + | * 像 '' | ||
| + | * 函数名与其参数之间不用加空格:'' | ||
| + | * '' | ||
| + | * 类型转换函数后不用加空格:'' | ||
| + | * 大多数二元及三元操作符要加空格:'' | ||
| + | |||
| + | ===== 行末的空格 ===== | ||
| + | |||
| + | 别在行末留空格。有些编辑器会在新行中自动增加缩进,从而你会活得拥有多余空格的行。 | ||
| + | Git 会提示你那拥有多余空格的行,然后让你选择是否要去掉那些空格。但是一旦它帮你去掉了,之后的改动会很烦。 | ||
| + | |||
| + | ===== 注释 ===== | ||
| + | |||
| + | 注释是一个良好的习惯,但是别太沉醉于注释。永远不要在注释当中解释当前代码是如何运行的:写出一眼就能看出来工作机制的代码比这种注释要好得多,而且给很烂的代码写注释是一种浪费生命的行为。 | ||
| + | |||
| + | 一般情况下,注释所代表的是你的代码是干嘛的,而不是你的代码是如何工作的。在函数体中的注释应尽量的少。如果一个函数非常的复杂,你应该考虑分段地把注释写在函数中每个基本单元内。将细节代码写在函数头中,用于阐述它是干嘛以及为什么它要这么干。 | ||
| + | |||
| + | * 函数、类以等使用“D 型氧气”风格注释在 '' | ||
| + | /** | ||
| + | * 这是 Marlin 中的一种比较好的多行注释。 | ||
| + | * 请坚持使用它。 | ||
| + | * | ||
| + | * 这种属于类“D 型氧气”风格,一旦关键字被添加, | ||
| + | * 我们便能够自动生成代码文档并且提供更多 | ||
| + | * 完整的开发指南. | ||
| + | */ | ||
| + | </ | ||
| + | |||
| + | * 当注释在 3 行以下时,使用 C++ 的 '' | ||
| + | // 一行或两行时 | ||
| + | // 应该使用这样的注释。 | ||
| + | </ | ||
| + | |||
| + | ====== 命名以及符号 ====== | ||
| + | |||
| + | ===== 文件名 ===== | ||
| + | |||
| + | Marlin 源代码的文件名最好使用 '' | ||
| + | |||
| + | * C++ 源文件使用 '' | ||
| + | * C 源文件使用 '' | ||
| + | * 头文件使用 '' | ||
| + | |||
| + | ===== 目录 ===== | ||
| + | |||
| + | * 目录名使用小写 | ||
| + | * 在 Marlin 1.0.x 与 1.1.x 版本中使用 '' | ||
| + | * 在 Marlin 1.2.x 及以上版本中使用 '' | ||
| + | |||
| + | ===== 大写 ===== | ||
| + | |||
| + | 对于 Marlin 当中的变量、数据成员、函数以及方法使用 '' | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * 由 ''# | ||
| + | * '' | ||
| + | |||
| + | ===== 库 ===== | ||
| + | |||
| + | 尽量使用 avr-libc 或者 Arduino 中的已捆绑的库。Marlin 中所需要编译的库应该在 package 中被引用,从而保证版本的兼容性。 | ||
| + | |||
| + | ====== 语言特性 ====== | ||
| + | |||
| + | Marlin 由 C/C++ 编写,并且由 '' | ||
| + | |||
| + | 在更新的版本中,Marlin 不再兼容先前版本(pre-2017)的工具链。能与 Marlin 1.1.x 兼容的最旧版本的 Arduino IDE 为 1.6.8。 | ||
| + | |||
| + | * 不要使用以下的 C++ 扩展功能: | ||
| + | * Exceptions (throw / catch) | ||
| + | * Virtual function / classes | ||
| + | * Standard Template Library (STL) | ||
| + | * 请使用更加现代的 C++11: | ||
| + | * '' | ||
| + | * 用于检查 '' | ||
| + | |||
| + | ===== 原生数据类型 ===== | ||
| + | |||
| + | * 为了可移植性,建议使用 '' | ||
| + | * AVR 视 '' | ||
| + | |||
| + | ===== 内存使用 ===== | ||
| + | |||
| + | * 使用像 '' | ||
| + | * 使用未限制的递归会导致内存爆炸,因此避免使用。 | ||
| + | * 在许多主板中内存很宝贵,所以尽量别用全局以及静态变量。 | ||
| + | * 使用 '' | ||
| + | |||
| + | ===== 减少重复 ===== | ||
| + | |||
| + | 在使用宏、轻量函数等应该避免重复,例如:< | ||
| + | #if ENABLED(FEATURE_ONE) | ||
| + | const char blue = ' | ||
| + | #else | ||
| + | const char blue = ' | ||
| + | #endif | ||
| + | </ | ||
| + | 不如:< | ||
| + | const char blue = | ||
| + | #if ENABLED(FEATURE_ONE) | ||
| + | ' | ||
| + | #else | ||
| + | ' | ||
| + | #endif | ||
| + | ; | ||
| + | </ | ||
| + | 更不如:< | ||
| + | const char blue = TERN(FEATURE_ONE, | ||
| + | </ | ||
| + | |||
| + | ===== 避占用更多资源地代码 ===== | ||
| + | |||
| + | * '' | ||
| + | * 提前计算数值,减少在程序运行中运算。 | ||
| + | * 能用乘法的别用除法。 | ||
| + | * 大多数冗余的代码并不会优化程序,所以用更少的代码。 | ||
| + | |||
| + | ===== #include 的最佳使用 ===== | ||
| + | |||
| + | * 引用当前程序中的声明的头文件,这会使程序的依赖性更加直观。 | ||
| + | * 不要引用不被使用的 '' | ||
| + | * 头文件被引用的顺序: | ||
| + | * 当配置需要被使用时,引用 '' | ||
| + | * 在最外层 ''# | ||
| + | * 按照依赖顺序引用依赖。 | ||
| + | * 最后引用系统以及库的头文件,例如 '' | ||
| + | |||
| + | ====== 由 Marlin 定义的转换 ====== | ||
| + | |||
| + | ===== 预处理命令 ===== | ||
| + | |||
| + | * 用 ''# | ||
| + | * 对于注释掉的未使用的、过时的代码,不要使用 ''# | ||
| + | * 使用 ''# | ||
| + | * 同理,使用 '' | ||
| + | * 考虑到更佳的可阅读及可移植性,使用 ''# | ||
| + | * 在超过 15 行代码的 ''# | ||
| + | |||
| + | ===== 宏 ===== | ||
| + | |||
| + | 在 '' | ||
| + | |||
| + | ==== 配置测试 ==== | ||
| + | |||
| + | |||
| + | ==== 三元宏 ==== | ||
| + | |||
| + | |||
| + | ==== 检查定义的引脚 ==== | ||
| + | |||
| + | |||
| + | ==== 快速 I/O ==== | ||
| + | |||
| + | |||
| + | ==== 便捷循环 ==== | ||
| + | |||
| + | |||
| + | ==== 重复 ==== | ||
| + | |||
| + | |||
| + | ==== 映射 ==== | ||
| + | |||
| + | |||
| + | ==== 字符测试 ==== | ||
| + | |||
| + | |||
| + | ==== 列表与数组 ==== | ||
| + | |||
| + | |||
| + | ==== 时间比较 ==== | ||
| + | |||
| + | |||
| + | ==== 通讯 ==== | ||
| + | |||
| + | |||
| + | ==== 数学 ==== | ||
| + | |||
| + | |||
| + | ==== 其他 ==== | ||
| + | |||
| + | |||
| + | ===== 添加新功能 ===== | ||
| + | |||
| + | |||
| + | ==== 一些例子 ==== | ||
knowledge/3d_print/2023052301.1684820105.txt · 最后更改: 2025/10/11 02:55 (外部编辑)
