【C++】一、C++代码编写风格

【C++】一、C++代码编写风格

 * 
 *   ┏┓   ┏┓+ +
 *  ┏┛┻━━━┛┻┓ + +
 *  ┃       ┃  
 *  ┃   ━   ┃ ++ + + +
 *  ████━████ ┃+
 *  ┃       ┃ +
 *  ┃   ┻   ┃
 *  ┃       ┃ + +
 *  ┗━┓   ┏━┛
 *    ┃   ┃           
 *    ┃   ┃ + + + +
 *    ┃   ┃
 *    ┃   ┃ +  
 *    ┃   ┃    
 *    ┃   ┃  +         
 *    ┃    ┗━━━┓ + +
 *    ┃        ┣┓
 *    ┃        ┏┛
 *    ┗┓┓┏━┳┓┏┛ + + + +
 *     ┃┫┫ ┃┫┫
 *     ┗┻┛ ┗┻┛+ + + +
 * 

简介

Author: louis

Email:louis.yyj.dev@foxmail.com

Description:学习和总结C++的代码编写风格

Reference:

1.Chrona(罗剑锋).C++实战笔记[M].人民邮电出版社.2021.11.

一、留白的艺术

代码未留白(十分紧凑、令人窒息):

if(!value.contains("xxx")){
    LOGIT(WARNING,"value is incomplete.\n")
    return;
}
char suffix[16]="xxx";
int data_len=100;
if(!value.empty()&&value.contains("tom")){
    const char* name=value.c_str();
    for(int i=1;i<MAX_LEN;i++){
        ... // do something
    }
    int count=0;
    for(int i=0;i<strlen(name);i++){
        .. //do something
    }
}

代码留白(错落有致、舒缓得当):

if (!value.contains("xxx")) {
    LOGIT(WARNING, "value is incomplete.\n")
    return;
}

char suffix[16] = "xxx";
int data_len = 100;

if (!value.empty() && value.contains("tom")) {
    const char* name = value.c_str();

    for(int i = 1; i < MAX_LEN; i++){
        ... // do something
    }

    int count = 0;

    for(int i = 0; i < strlen(name); i++){
        .. //do something
    }
}

二、命名规范

驼峰式命名法(C++中受欢迎程度一般般):

class MyJobClass; // (大驼峰,每个单词首字母均大写)
class myJobClass; // (小驼峰,除首个单词外,其余单词首字母均大写)

匈牙利命名法(C++大型项目比较受欢迎):

int m_example; // m = member,表明这是某个局部域的成员变量)
int g_example; // g = global,表明这是一个全局变量)

snake_case命名法(c++主要命名方式):

int sys_flag; //单词小写,单词之间用下划线连接

总结建议:

1.变量、函数和名字空间用snake_case,全局变量加"g_"前缀。

2.自定义类名用驼峰命名风格,成员函数用snake_case,成员变量加"m_"前缀。

3.宏和常量应当全大写,单词之间用下划线连接.

4.尽量不要将下划线作为变量的前缀或后缀(如:local),很难辨识。

5.命名的名字长度可根据作用域大小来编写,即局部变量名字短一些,全局变量名字长一些。

/** example: **/

#define MAX_PATH_LEN 256      // 常量,全大写,单词之间下划线连接

int g_sys_flag;               // 全局变量加"g_"前缀,且单词小写,单词之间下划线连接

namespace linux_sys {         // 命名空间,全小写
    void get_rlimit_core();   // 成员函数,全小写
}

class FilePath final          // 类名,大驼峰,首字母大写,final关键字表示不可被继承
{
public:
    void set_path(const string& str);   // 成员函数,全小写
private:
    string m_path;    // 成员变量,加"m_"前缀
    int    m_level;   // 成员变量,加"m_"前缀
};

三、注释规范

1.代码中的注释尽量用英文,因为英文的兼容性较好。

2.实在需要中文也可以,但注意编码使用"UTF-8"。

例子:

// author       : louis
// date         : 2023.4.4
// purpose      : get inner counter value of generic T
// notice       : T must have xxx member
// notice       : return value maybe -1,means ..., you should ...
template<typename T>
int get_value(const T& v);

四、源码组织和管理

作者Chrono说,在".h"中声明类,“.cpp"中实现类的方式属于传统方式,已经落后了,不利于源码管理,那么C++是否可以不分离,只在一个文件里实现全部的类功能代码呢?当然可以,并且这是当下最好的方式.采用”.hpp"文件即可.

示例如下:

#ifndef _XXX_HPP_INCLUDE_
#define _XXX_HPP_INCLUDE_

// This is the full imeplement of XXX,we do not need any cpp file

class XXX final
{
public:
    void function1(){ ... }
    void function2(){ ... }
};


#endif // _XXX_HPP_INCLUDE_

总结:

1.利于源码管理,减少文件数量.

2.使用这种方式不必担心头文件太大导致编译器崩溃,因为string/vector/map也是纯头文件形式,都能轻松编译.

3.如果不想对外暴露类的实现细节,只需再编写一个只有前置声明的".hpp",将所有的".hpp"的类名作为接口放入该前置声明的".hpp"中提供给外界即可。

五、其他建议

1.同一代码组或项目里尽量风格统一。

2.缩进不要直接用TAB,用四个空格代替。

3.代码行宽度限制在80个字符内,方便阅读,方便Linux下调试。

4.花括号(“{}”)保持一直对齐格式,"{“单独一行或者在行尾都行,但”}"必须单独留一行,且后面空一行再写之后的代码。

5.if/for等语句,即使只有一行,也要使用花括号(“{}”)。

6.if/switch/for等语句的嵌套层次不宜过深。

7.函数体、循环语句不易过长,保证一页内显示完毕。

8.函数入口参数不宜过多,确实有必要,应当用struct/tuple打包。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值