
编码规范本文档介绍 ReactOS 新增代码需遵循的通用编码规范仅适用于 C 和 C 源代码文件。本规范由 ReactOS 团队在 2013 年 10 月会议上正式敲定。除非存在特殊原因例如代码近期会彻底重写现有历史代码应尽量按照本规范统一格式。详情参见现有代码格式调整说明。与其他项目如 Wine同步的代码禁止修改格式。可通过以下文件查看同步文件清单第三方文件说明、Wine 同步文件说明。文件结构所有 ReactOS 源代码文件必须添加如下文件头注释c运行/* * PROJECT: ReactOS Kernel * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) * PURPOSE: Does cool things like Memory Management * COPYRIGHT: Copyright 2017 Arno Nymous abcmailaddress.com * Copyright 2017 Mike Blablabla mikeblabla.com */请使用 SPDX 许可证标识便于授权检测工具解析代码文件。若你对文件做出重大贡献、能够全权负责该文件整体或部分代码可将姓名添加至COPYRIGHT版权区域。单个文件版权署名人数不得超过 3 人。 旧版文件头中的FILE字段需全部移除。ReactOS 代码库使用 Doxygen 生成文档函数头部需遵循标准注释格式详见接口文档规范。缩进与行宽代码单行字符数最大限制为 100 个。代码行末尾禁止添加空格或制表符。统一使用4 个空格缩进禁止使用制表符Tab。switch语句中case标签与对应代码均需缩进。正确示例c运行switch (Condition) { case 1: DoSomething(); break; case 2: { DoMany(); ManyMore(); OtherThings(); break; } }错误示例c运行switch(Condition) { case 1: DoSomething(); break; case 2: DoMany(); ManyMore(); OtherThings(); break; }函数调用若一行无法容纳参数按如下方式对齐c运行FunctionCall(arg1, arg2, arg3);函数声明需遵循以下格式严格保持示例中的字段顺序c运行static // 作用域标识 CODE_SEG(PAGE) // 代码段设置 // 其他属性 BOOLEAN // 返回值类型 FASTCALL // 调用约定 IsOdd( _In_ UINT32 Number);空格使用规范一元运算符两侧不加空格。正确i;错误i ;二元运算符、三目运算符两侧必须添加空格。正确a b c;错误abc;逗号、分号前方禁止添加空格。正确示例c运行for (int i 0; i 5; i) DoSomething(); func1(a, b);错误示例c运行for (int i 0; i 5 ; i) DoSomething(); func1(a , b) ;流程控制关键字与括号之间添加空格。正确c运行if (Condition) DoSomething();错误c运行if(Condition) DoSomething();函数名与括号、括号与内部参数之间禁止添加空格。正确c运行func(a, b);错误c运行func (a, b); func( a, b );代码换行每条语句独占一行。正确示例c运行x; y; if (Condition) DoSomething();错误示例c运行x; y; if (Condition) DoSomething();大括号规则左大括号{和右大括号}必须单独成行。单行逻辑的控制语句可省略大括号不作强制要求若单行语句附带注释则必须添加大括号。正确示例c运行if (Condition) DoSomething(); if (Condition) { DoSomething(); } if (Condition) { // 此处添加注释 DoSomething(); } if (A_Very || (Very Long || Condition) On_Many Lines) { DoSomething(); } if (Condition) DoSomething(); else DoSomethingElse(); if (Condition) { DoSomething(); } else { DoSomethingElse(); YetAnother(); }错误示例c运行if (Condition) { DoSomething(); } if (Condition) // 此处添加注释 DoSomething(); if (A_Very || (Very Long || Condition) On_Many Lines) DoSomething(); if (Condition) DoSomething(); else { DoSomethingElse(); YetAnother(); }流程控制结构条件判断禁止使用逆序判断写法。正确if (i 1)错误if (1 i)避免多层嵌套的分支结构优先使用线性代码风格而非树形嵌套风格。为简化代码如统一资源释放逻辑可合理使用goto语句。正确示例c运行if (!func1()) return; i func2(); if (i 0) return; j func3(); if (j 1) return; ...错误示例c运行if (func1()) { i func2(); if (func2()) { j func3(); if (func3()) { ... } } }命名规则变量、函数名首字母大写。开发 Win32 相关代码可使用匈牙利命名法不作强制要求即便不使用匈牙利命名法名称首字母也必须大写禁止使用小驼峰命名法名称中也不得使用下划线作为分隔符。正确示例c运行PLIST_ENTRY FirstEntry; VOID NTAPI IopDeleteIoCompletion(PVOID ObjectBody); PWSTR pwszTest;错误示例c运行PLIST_ENTRY first_entry; VOID NTAPI iop_delete_io_completion(PVOID objectBody); PWSTR pwsztest;函数、变量名称尽量完整避免随意缩写语义需清晰易懂。布尔类型变量命名建议搭配is、did等动词前缀提升可读性。正确c运行BOOLEAN IsValid; BOOLEAN DidSendData;错误c运行BOOLEAN Valid; BOOLEAN SentData;注释规范单行内容不要拆分为多行注释避免冗余空行。正确示例c运行// 这是单行注释 /* 标准 C 风格注释 */ // 这是多行注释 // 多行注释无强制格式要求错误示例c运行// // 多余空行浪费代码行数 //空指针、布尔值与数值 0空指针统一使用NULL仅在特殊环境下如 C11可使用nullptr禁止直接使用数字 0 表示空指针。Win32/NT 体系布尔值使用TRUE和FALSE若使用标准 C/Cbool类型变量则使用true和false。判定或终止 ANSI/OEM 字符串时使用ANSI_NULL判定或终止 Unicode 宽字符串时使用UNICODE_NULL。现有代码格式调整说明禁止在同一次提交中既修改代码逻辑又统一代码格式两类变更需拆分不同提交记录。若某次提交仅为格式调整提交说明开头必须标注[FORMATTING]。其他规范若非调用接口必需禁止使用LARGE_INTEGER/ULARGE_INTEGER统一改用INT64/UINT64。头文件防护统一使用#pragma once不再使用宏守卫写法。除非接口、导出符号有强制要求否则函数无需显式指定调用约定。自动代码格式化工具待补充编辑者Zefklop暂未制定规则的内容文档讨论阶段曾提出部分补充建议但未达成团队共识因此暂不作强制规范 待补充编辑者Hbelusca相关参考内核编码规范GNU 缩进工具