Zilch Editor代码编写规范

Alex_Cui

2018-12-29 14:39:17

Personal

版本: 3.1 更新: March 4, 2019 编辑: Alex Cui --- # Zilch Editor代码编写规范 v3.1 ## C++代码编写样式规定 ### 备注 1. 本规定包含C代码编写规范. ### 标准 1. 所有的C代码使用C11标准(参考ISO/IEC 9899:2011). 1. 所有的C++代码使用C++17标准(参考ISO/IEC 14882:2017). 1. 在必要的时候, 仅允许在单独的源文件中独立使用以下实验性规范: 库基础v2 TS(参考ISO/IEC TS 19568:2017) 并发 TS(参考ISO/IEC TS 19571:2016) 事务性内存 TS(参考ISO/IEC TS 19841:2015) ### 文件 1. 所有的C源文件扩展名为```*.c```. 1. 所有的C头文件扩展名为```*.h```. 1. 所有的C++源文件扩展名为```*.cpp```. 1. 实现全部都在头文件内的C++头文件扩展名为```*.hpp```. 1. 其他实现有在源文件内的C++头文件扩展名为```*.h```. 1. 一个```*.h```头文件必须有一个对应的同名的源文件提供实现(如果需要的话). ### 编译 1. 确保所有的源文件都可以在GCC/G++, MSVC/MSVC++, Clang的最新的稳定版(或受到长期支持的LTS版)中编译通过. 1. 编译时必须使用编译选项将警告视为错误, 且将错误等级设为最高. ### 命名规范 1. 文件名遵循大驼峰命名法. 所有单词首字母大写, 并依次连接. 其中用以定义类的文件的文件名以类名命名. 例如文件```SampleHeader.h```, 定义了SampleClass类的头文件为```SampleClass.h```. 1. 局部变量, 自动变量, 局部常变量, 全局变量, 成员变量, 函数参数的命名遵循小写下划线命名法. 以单词为单位用下划线连接, 且所有字母为小写, 独立的连续数字作为单独的一个单词. ```cpp int global_variable; int variable_15; ``` 1. 全局常变量, 编译时常量, 宏常量, 枚举常量的命名使用大写下划线命名法. 以单词为单位用下划线连接, 且所有字母大写, 独立的连续数字作为单独的一个单词. ```cpp const int GLOBAL_CONSTANT = 10; constexpr int COMPILE_TIME_CONSTANT = 10; #define MARCO_CONSTANT 10 ``` 1. 函数的命名使用小驼峰命名法.第一个单词小写, 其他单词首字母大写, 并依次连接. ```cpp int functionName(); void getProgramInfo(); void getHTTPRequest(); ``` 1. 类, 非内置类型别名, 数组类型别名的命名使用大驼峰命名法. 所有单词首字母大写, 并依次连接. ```cpp class SampleClass; typedef SampleClass ClassSample; typedef int IntArray[10]; ``` 1. 内置类型别名, 指针类型别名, 引用类型别名的命名使用帕斯卡命名类型规范. p表示指针类型, r表示引用类型, u表示无符号类型, 后缀数字表示需显示说明的长度, 在类型名被占用的情况下使用后缀_t. ```cpp typedef int *pint, &rint; typedef unsigned int uint, *puint, &ruint; ``` ### 声明, 定义与实现 1. 所有函数(除入口函数外), 类, 枚举类的定义必须在头文件中定义并在源文件实现. 1. 仅在本源文件中使用的函数不在头文件中声明. 1. 入口函数必须写在该源文件的最上方, 且不提前声明. 1. 内联函数必须在头文件定义并实现. 1. 所有的类模版, 函数模版必须在头文件中定义并实现. 1. 所有的全局变量必须在头文件中声明为extern, 并在对应的源文件中初始化. ```cpp // A.h extern int global_var; // A.cpp int global_var; ``` 1. 编译时常量必须在头文件中声明并定义为constexpr, 不使用static修饰. ### 注释 1. 文件头注释及函数注释以```/**```开始, ```*/```结束. 1. TODO注释行首以```/// TODO:```开始. 1. 注释要求在注释开头记号后留一个空格, 文件头注释和函数注释的注释起始行和结束行不含有注释内容. ### 空格与缩进 #### TODO ### 函数 #### TODO ### 类 1. 类必须显式声明并实现构造函数和析构函数. 1. 作为非类型转换函数的只有一个非缺省参数的构造函数(复制构造函数和移动构造函数除外)必须显式地声明为explicit. 1. 抽象基类必须将析构函数定义为纯虚析构函数, 且在源文件中提供空实现. ```cpp // BaseClass.h class BaseClass { public: BaseClass(); virtual ~BaseClass() = 0; } // BaseClass.cpp BaseClass::BaseClass {} BaseClass::~BaseClass {} ``` 1. 在析构函数中必须显式地delete所有指针成员. 1. 类的声明中遵循函数在前, 变量在后.分别以public, protected, private的顺序声明, 同一个访问权限块中不能同时出现函数和变量. 1. 成员函数以构造函数, 类型转换构造函数, 析构函数, 类型转换函数, 运算符重载函数, 其他成员函数为顺序声明. ```cpp class SampleClass { public: SampleClass(); SampleClass(int obj); ~SampleClass(); operator int(); SampleClass &operator+(SampleClass &&obj); getValue(); public: int value; protected: int protected_member; private: int private_member; } ``` 1. 类内函数在使用本类成员变量必须显式的指明this. --- Copyright (c) 2018-2019 Alex Cui. Licensed in *[CC-BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)*. ![CC-BY-NC-SA](https://upload.wikimedia.org/wikipedia/commons/1/12/Cc-by-nc-sa_icon.svg "CC-BY-NC-SA")