Zilch Editor代码编写规范

2018-12-29 14:39:17


版本: 3.1
更新: March 4, 2019
编辑: Alex Cui


Zilch Editor代码编写规范 v3.1

C++代码编写样式规定

备注

  1. 本规定包含C代码编写规范.

标准

  1. 所有的C代码使用C11标准(参考ISO/IEC 9899:2011).
  2. 所有的C++代码使用C++17标准(参考ISO/IEC 14882:2017).
  3. 在必要的时候, 仅允许在单独的源文件中独立使用以下实验性规范:
    库基础v2 TS(参考ISO/IEC TS 19568:2017)
    并发 TS(参考ISO/IEC TS 19571:2016) 事务性内存 TS(参考ISO/IEC TS 19841:2015)

文件

  1. 所有的C源文件扩展名为*.c.
  2. 所有的C头文件扩展名为*.h.
  3. 所有的C++源文件扩展名为*.cpp.
  4. 实现全部都在头文件内的C++头文件扩展名为*.hpp.
  5. 其他实现有在源文件内的C++头文件扩展名为*.h.
  6. 一个*.h头文件必须有一个对应的同名的源文件提供实现(如果需要的话).

编译

  1. 确保所有的源文件都可以在GCC/G++, MSVC/MSVC++, Clang的最新的稳定版(或受到长期支持的LTS版)中编译通过.
  2. 编译时必须使用编译选项将警告视为错误, 且将错误等级设为最高.

命名规范

  1. 文件名遵循大驼峰命名法. 所有单词首字母大写, 并依次连接. 其中用以定义类的文件的文件名以类名命名. 例如文件SampleHeader.h, 定义了SampleClass类的头文件为SampleClass.h.
  2. 局部变量, 自动变量, 局部常变量, 全局变量, 成员变量, 函数参数的命名遵循小写下划线命名法. 以单词为单位用下划线连接, 且所有字母为小写, 独立的连续数字作为单独的一个单词.
    int global_variable;
    int variable_15;
  3. 全局常变量, 编译时常量, 宏常量, 枚举常量的命名使用大写下划线命名法. 以单词为单位用下划线连接, 且所有字母大写, 独立的连续数字作为单独的一个单词.
    const int GLOBAL_CONSTANT = 10;
    constexpr int COMPILE_TIME_CONSTANT = 10;
    #define MARCO_CONSTANT 10
  4. 函数的命名使用小驼峰命名法.第一个单词小写, 其他单词首字母大写, 并依次连接.
    int functionName();
    void getProgramInfo();
    void getHTTPRequest();
  5. 类, 非内置类型别名, 数组类型别名的命名使用大驼峰命名法. 所有单词首字母大写, 并依次连接.
    class SampleClass;
    typedef SampleClass ClassSample;
    typedef int IntArray[10];
  6. 内置类型别名, 指针类型别名, 引用类型别名的命名使用帕斯卡命名类型规范. p表示指针类型, r表示引用类型, u表示无符号类型, 后缀数字表示需显示说明的长度, 在类型名被占用的情况下使用后缀_t.
    typedef int *pint, &rint;
    typedef unsigned int uint, *puint, &ruint;

声明, 定义与实现

  1. 所有函数(除入口函数外), 类, 枚举类的定义必须在头文件中定义并在源文件实现.
  2. 仅在本源文件中使用的函数不在头文件中声明.
  3. 入口函数必须写在该源文件的最上方, 且不提前声明.
  4. 内联函数必须在头文件定义并实现.
  5. 所有的类模版, 函数模版必须在头文件中定义并实现.
  6. 所有的全局变量必须在头文件中声明为extern, 并在对应的源文件中初始化.

    // A.h
    extern int global_var;
    
    // A.cpp
    int global_var;
  7. 编译时常量必须在头文件中声明并定义为constexpr, 不使用static修饰.

注释

  1. 文件头注释及函数注释以/**开始, */结束.
  2. TODO注释行首以/// TODO:开始.
  3. 注释要求在注释开头记号后留一个空格, 文件头注释和函数注释的注释起始行和结束行不含有注释内容.

空格与缩进

TODO

函数

TODO

  1. 类必须显式声明并实现构造函数和析构函数.
  2. 作为非类型转换函数的只有一个非缺省参数的构造函数(复制构造函数和移动构造函数除外)必须显式地声明为explicit.
  3. 抽象基类必须将析构函数定义为纯虚析构函数, 且在源文件中提供空实现.

    // BaseClass.h
    class BaseClass {
    public:
        BaseClass();
        virtual ~BaseClass() = 0;
    }
    
    // BaseClass.cpp
    BaseClass::BaseClass {}
    BaseClass::~BaseClass {}
  4. 在析构函数中必须显式地delete所有指针成员.
  5. 类的声明中遵循函数在前, 变量在后.分别以public, protected, private的顺序声明, 同一个访问权限块中不能同时出现函数和变量.
  6. 成员函数以构造函数, 类型转换构造函数, 析构函数, 类型转换函数, 运算符重载函数, 其他成员函数为顺序声明.
    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;
    }
  7. 类内函数在使用本类成员变量必须显式的指明this.

Copyright (c) 2018-2019 Alex Cui. Licensed in CC-BY-NC-SA 4.0. CC-BY-NC-SA