代码规范 - Geminiv/CgvWiki GitHub Wiki

代码规范

该文档定义了项目代码规范

1. 命名规范

  • 总体风格采用帕斯卡命名法 Pascal Case / 大驼峰命名法 Camel Case。
  • 可以使用简称,但简称一定要被熟识且没有歧义,简称包括 2 种:
    • 专有简称,例 NURBS (NonUniform Rational B-Spline),命名根据专业简称习惯
    • 缩略简称,例 control,缩略为 ctl,遵守命名规则为 Ctl 或 局部变量 ctl,原则上类命名、函数命名不使用缩略。

1.1 变量命名规范

变量类型 规范 示例
成员变量 m_变量名 m_PointCount
形参变量(仅使用参数,一般加const修饰) p_变量名 p_PointCount
实参变量(修改参数,一般使用引用) r_变量名 r_PointCount
返回变量 r_变量名 r_PointCount
临时变量(局部变量) 小写开头,后面大写开头 pointCount

1.2 可用公认缩写

原单词 缩写单词 使用要求
Previous Prv 不得单独使用,后应接具体的内容,例如 PrvPoint,后接单词不能再缩写
Next Nxt 不得单独使用,后应接具体的内容,例如 NxtPoint,后接单词不能再缩写

2. 注释规范

该项目采用doxygen这一帮助文档生成工具,因此代码注释需符合其可识别的格式。

​通常代码可以附上一个注释块来对代码进行解释,一个注释块由一行或者多行组成。通常一个注释块包括一个简要说明(brief)和一个详细说明(detailed),这两种说明方式都是可选的。而方法和函数也可能使用第三种说明方式(in body),并包含方法和函数内所有注释块间的联系。

建议简要说明使用一个短小的单行方式,而详细说明要提供足够的长度以包含更多的细节描述。“in body”可看作详细说明,或者一系列说明的集合。

2.1 注释风格

2.1.1 详细说明样例

  1. 可使用JavaDoc风格,包含两个“*”开头的C注释风格,实例如下:

    /**
     * ...text...
     */
    
  2. 也可使用Qt风格,即在C注释风格基础上添加一个“!”字符,实例如下:

    /*!
     * ...text...
     */
    

    中间的“*”号是可选的,下面的例子也是有效的:

    /*!
     ...text...
     */
    
  3. 第三种替代方式为使用至少两行的C++注释块,在每行开始处处一个“/”或者“!”,例子如下:

    ///
    /// ...text...
    ///
    
    //!
    //! ...text...
    //!
    

    此情况,请使用一条空行作为文档块的结尾。

  4. 注释块亦可采用以下此种注释块样式:

    /********************************************//**
     *  ... text
     ***********************************************/
    

    (注意前两条斜杠为结束普通注释块,而后两条为特殊注释块)

    /////////////////////////////////////////////////
    /// ... text ...
    /////////////////////////////////////////////////
    
    /************************************************
     *  ... text
     ***********************************************/
    

2.1.2 简要说明样例

  1. 在一个注释块之前使用\brief 命令。这个命令能在一个段落的末尾处终止它,并在一条空白行之后紧跟详细说明。例子如下:

    /*! \brief Brief description.
     *         Brief description continued.
     *
     *  Detailed description starts here.
     */
    
  2. 如果在配置文件中将 JAVADOC_AUTOBRIEF设置为YES,可使用JavaDoc注释块,并直接开始一段简要说明,在出现第一个“.”处结束(此处只支持半角句点),后跟一个空格或反斜杠,亦或空白行,之后便可开始详细说明。例子如下:

    /** Brief description which ends at this dot. Details follow
     *  here.
     */
    

    此选项标记对于多行的C++注释块亦有效:

    /// Brief description which ends at this dot. Details follow
    /// here.
    

    同样,若希望Qt文档块自动将第一条句子作为简要说明,需将QT_AUTOBRIEF设置为YES。

  3. 对于不超过一行的C++注释块可使用以下方式:

    /// Brief description.
    /** Detailed description. */
    

    或者

    //! Brief description.
    //! Detailed description 
    //! starts here.
    

2.2 后置注释

当为一个结构体,枚举或类添加注释时,有时也需要为他们的成员添加注释,且希望将注释放置于代码的后面,此时在注释块中加入“<” 标记即可。示例如下:

int var; /*!< Detailed description after the member */
int var; //!< Detailed description after the member
         //!< 

2.3 结构化命令

结构化命令由一个反斜杠“/”或"@"开始,紧跟一个命令字和若干参数。结构化命令用于对文件本身,及其包含的类、函数、类型转换、枚举、结构体、宏等等结构进行注释。以下仅对常用的结构提供详细的样例与说明,其余结构结合特殊命令字表,参照样例添加注释。

2.3.1 文件注释

/**
 * @file myfile.h
 * @author name
 * @version 1.0
 * @date 2020-09-27
 * @brief this brief
 * @details this's details
 */

说明:

  • 文件注释为doxygen进行文本识别的必须条目,不可省略,文件中至少有一行:

    /*! \file */ 
    

    或者

    /** @file */ 
    
  • “@file”后的文件名需与当前文件名一致

2.3.2 结构体注释

简洁样式

struct ListNode         ///  the brief structcomment
{
    ListNode* m_next;   ///< The brief mement comment
    Node* m_node;       ///< The brief mement comment
};

详细样式

/**
 * this is details struct
 */
typedef struct DynamicConfigT   ///  The brief mementcomment
{
         int     nApplyId;      ///< The brief mement comment
         int     nTime;         ///< The brief mement comment
         int     nReboot;       ///< The brief mement comment

    /** this is details mement comment */
         char**  aValTable;     ///< The brief mement comment
         LocalHndl   pfnHndl;   ///< The brief mement comment
} DynamicConfig;

说明

  • “///”与注释间留有2个空格

  • “///<”与注释间留有1个空格

  • 结构体成员的详细注释写在该成员上面

  • 结构体成员的详细注释与上一成员间留1个空行

  • 推荐结构体使用typedef类型定义

  • 推荐使用简洁的结构体注释

2.3.3 宏注释

简洁样式

/// This macro is toolong, so comment here briefly!
#define HTTP_REQUEST_LEN_MAX    APPLY_BUF_SIZE_BIG

详细样式

/**
 * The detail macro comment, may be multi-line.
 * @param a The brief parameter comment
 * @param b The brief parameter comment
 * @return The brief return value comment
 */
#define MAX(a, b) ((a) > (b))? (a) : (b)

说明

2.3.4 函数注释

简洁样式

/// The brieffunction comment, may be multi-line.
static int apply_login();

详细样式

/**
 * The detail function comment, may be multi-line.
 * @param cur_id The brief parameter comment
 * @return The brief return value comment
 * @brief The brief function comment
 */
static int reboot_enable( intcur_id )

说明

  • 详述进行函数简要说明时需添加“@brief”;
  • 无参无返回值的函数使用简洁样式;