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