C++代码规范-程序员宅基地

技术标签: C++  c++  后端  开发语言  

一、命名规范

对于C++代码,每个人的风格和习惯各不尽相同,但是为了在项目中形成一个统一的,阅读性比较好的代码,这里参考了主要的开源代码、国内外各大厂以及以往的项目经验,这里对C++代码的命名进行了一个约定规范。

1、目录/文件

规范:使用小写字母数字下划线,多个单词间用下划线分隔。
原因:Windows对目录和文件是大小写不区分的,而Linux是大小写区分的。为了达到平台统一,这里规定都使用小写字母。
示例:

目录:app_cxx/proc_ui/src/firewall
文件:firewall_mgr.h、main.cpp、nfsv2.cpp

2、函数/接口

规范:使用小驼峰命名法
原因:大部分著名的开源项目以及大厂对外提供的API都是这样的命名规范。
示例:

int test()
{
    
    return 0;
}

int getLocalPort()
{
    
    return 4335;
}

3、命名空间

规范:使用小写字母数字下划线,多个单词间用下划线分隔 (尽量只使用一个单词)
原因:
示例:

namespace logger
{
    
}

4、结构体/类

规范:使用大驼峰命名法不包含下划线
原因:
示例:

struct SendData
{
    
};

class LoggerManager
{
    
};

5、变量

规范:使用小驼峰命名法

(1)局部变量

示例:

void test()
{
    
    int reqNum = 0;
}

(2)全局变量

补充:需要加前缀g_
示例:

int g_reqNum= 0;

(3)静态变量

补充:需要加前缀s_
示例:

void test()
{
    
    static int s_reqNum = 0;
}

补充:当它同时也是全变量时使用全局变量的命名方式
示例:

int g_reqNum = 0;

(4)类成员变量

补充:需要加前缀m_
示例:

class ServerInfo
{
    
private:
    int m_reqNum
}

(5)类静态变量

补充:需要加前缀s_
示例:

class ServerInfo
{
    
private:
    static int s_reqNum;
}

(6)常量

补充:需要大写字母
原因:
示例:

const int MAX_NUM = 1024;

5、宏定义

规范:需要大写字母
原因:
示例:

#define CACHE_PATH "/data/cache"

6、枚举

规范:枚举名使用大驼峰命名法,枚举名建议带上class类型,枚举值需要小写字母
原因:避免和宏定义冲突
示例:

enum class ResultType
{
    
    ok,
    open_fail,
    unknown
};

二、注释规范

规范:尽量用/* */进行注释,避免使用//。
原因:使用//时,当不小心把其下面的一行代码回退到//所在行时,如果没注意的话容易造成逻辑出错。

1、结构体/类注释

示例:

/**
 * @brief 用户信息集合
 */
struct UserInfo
{
    
};

2、接口注释

示例:

/**
 * @brief 查询用户信息
 * @param username 用户名
 * @return 用户信息
 */
UserInfo queryUserInfo(const std::string& username);

3、变量注释

示例:

int age = 0; /* 年龄 */

三、设计规范

1、声明/定义的位置?

规范:宏/枚举/变量/接口的声明和定义需要就近原则,能不跨文件就不跨文件。
原因:使得代码更加内聚,提升代码阅读的便利性。
示例:
在类DbMgr中使用了宏定义:#define QUEYR_OK 1

  • 如果该宏只在源文件DbMgr.cpp中使用,则宏定义放在DbMgr.cpp中。
  • 如果该宏仅仅作为返回值透露到外部模块,则宏定义放在DbMgr.h中。
  • 如果该宏在其他若干业务中频繁使用,则宏定义放在公共的业务枚举定义文件中(可能如:enum_def.h)。

2、结构体(struct) or 类(class)?

规范:当定义的类型只是数据的集合且内部无复杂的处理逻辑时选择用struct,反之如果更注重行为的封装则选择class
原因:struct存在于栈上,用完即销毁。 注意: 由于栈有容量限制,避免在struct中存放超大量的值类型。
示例:

struct UserInfo
{
    
    UserInfo() : age(0), sex(0) {
    }
 
    std::string username;
    int age;
    int sex;
};
class Grade
{
    
public:
    std::vector<UserInfo> queryUserInfoList(const std::string& username);
};

3、单文件(.hpp) or 多文件(.h,.cpp) ?

规范:当模块只是一些信息的集合且无复杂内部逻辑可以使用.hpp,反之使用多文件方式。
原因:模块逻辑复杂时,会经常变动,如果引用的外部模块多而使用.hpp时,编译时间会变长。
示例:
单文件user_info.hpp

#pragma once
#include <string>
 
struct UserInfo
{
    
    UserInfo() : age(0), sex(0) {
    }
 
    std::string username;
    int age;
    int sex;
};

多文件grade.hgrade.cpp

#pragma once
#include "user_info.h"
 
class Grade
{
    
public:
    std::vector<UserInfo> queryUserInfoList(const std::string& username);
};
#include "grade.h"
 
std::vector<UserInfo> Grade::queryUserInfoList(const std::string& username)
{
    
    return std::vector<UserInfo>{
    };
}

4、单例类

规范:把构造函数声明为私有。
原因:基于单例的定义,不允许类型不受控制的实例化。
示例:
头文件DbMgr.h

#pragma once
 
class DbMgr
{
    
private:
    DbMgr();
 
public:
    static DbMgr& getInstance();
};

源文件DbMgr.cpp

DbMgr::DbMgr() {
    }
 
DbMgr& DbMgr::getInstance()
{
    
    static DbMgr s_instance;
    return s_instance;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hezhanran/article/details/121358418

智能推荐

Win10+VS2019编译PCL库1.12.0(含gpu)_pcl 1.12eigen-程序员宅基地

文章浏览阅读4.3k次,点赞3次,收藏29次。PCL1.11.1AllInOne里的三方库CMAKE 3.19.2Windows 10EIGEN_ROOT D:/Program Files/PCL 1.11.1/3rdParty/Eigen/eigen3VTK_DIR D:/Program Files/PCL 1.11.1/3rdParty/VTK/lib/cmake/vtk-8.2_pcl 1.12eigen

【隐私合规】个人信息收集的合法性、必要性、被收集者同意、征得被收集者同意的例外、隐私政策优化、间接获取个人信息的要求_征得用户同意前就开始收集个人信息或打开可收集个人信息的权限-程序员宅基地

文章浏览阅读7k次,点赞3次,收藏3次。个人信息收集的合法性、必要性、被收集者同意、征得被收集者同意的例外、隐私政策优化、间接获取个人信息的要求等六方面来探讨个人信息收集的合规化_征得用户同意前就开始收集个人信息或打开可收集个人信息的权限

WPF自学—模仿QQ窗体载入和关闭动画_wpf 流动动画 防qq-程序员宅基地

文章浏览阅读2.6k次。这两天把《WPF编程宝典》这本书的动画相关章节看完了,于是想写个小程序练练手,但是不知道写什么好。看书的时候虽然也把上面的案例照着敲了一遍,但是它们毕竟和实际应用有很大差别,想用到日常项目里也不知道从何下手。刚好看到了一位网友 youngytj 分享的模仿QQ载入和关闭动画的文章,我就跟着学习模仿了一遍,下面来讲讲具体如何实现的。首先分析下我想实现的效果:第一,我打开程序后它从上到下滚动_wpf 流动动画 防qq

Facebook 详解 -程序员宅基地

文章浏览阅读1.4k次。 Facebook 详解 译者:本文译自英文维基百科条目“Facebook”。只翻译了个人觉得对中国互联网从业者有价值的部分。比如有关Facebook相关的法律纠纷,就略去了。中文维基百科只完成了原文2%的翻译。如中文维基百科的志愿者们愿意,请随意使用本文的全部或部分内容充实中文维基百科的相关条目。其他转载,必须遵照维基百科的相关协议,并链接到本文和译言首页。谢谢。Faceboo

HDU 1595-程序员宅基地

文章浏览阅读519次。find the longest of the shortestTime Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1258 Accepted Submission(s): 445Problem Descripti_hdu 1595

基尔霍夫矩阵(求最小生成树)_基尔霍夫指数和邻接矩阵计算-程序员宅基地

文章浏览阅读238次。条件:给定一个右n个节点的简单图G(无重边、无自环、无向图),它的基尔霍夫矩阵Q(Q=D-A),Q*(去掉任意一行一列)的行列式(绝对值)即为图G的生成树个数度矩阵Dn*nd(i,j)=deg(vi)--节点i的边数 i==j 否则d(i,j)=0邻接矩阵An*nA(i,j)=1--vi与vj有边相连 否则A(i,j)=0..._基尔霍夫指数和邻接矩阵计算

随便推点

BUG_ON_bug_on(blk_queued_rq(req));-程序员宅基地

文章浏览阅读595次。调试的时候很有用的东西:dump_stack 使用前,先在内核配置中把kernel debug选上:make menuconfig:kernel hacking-->kernel debug 作用:一些内核调用可以用来方便标记bug,提供断言并输出信息。最常用的两个是BUG()和BUG_ON()。当被调用的时候,它们会引发oops,导致栈的回溯和错误信息_bug_on(blk_queued_rq(req));

基于微信汽车维修保养小程序毕业设计作品成品(2)后台管理系统-程序员宅基地

文章浏览阅读219次。本课题主要目标是设计并能够实现一个基于微信汽车维修保养小程序系统,前台用户使用小程序,小程序使用微信开发者工具开发;后台管理使用基PP+MySql的B/S架构,开发工具使用phpstorm;通过后台录入汽修店信息,录入维修和保养信息,用户通过小程序登录,查看汽修店信息,收藏汽修店,预约维修保养,发起评论等。

Zookeeper与ApacheCurator-程序员宅基地

文章浏览阅读777次,点赞27次,收藏23次。1.背景介绍1. 背景介绍Apache Zookeeper 和 Apache Curator 都是分布式系统中的一种集中式管理服务,用于实现分布式应用的一些基本功能,如集中配置管理、分布式同步、集群管理等。Apache Zookeeper 是一个开源的分布式应用程序,它提供了一种可靠的、高性能的分布式协同服务。Apache Curator 是一个基于 Zookeeper 的客户端库,它提供...

分布式事务与SpringCloud的集成-程序员宅基地

文章浏览阅读860次,点赞16次,收藏21次。1.背景介绍在分布式系统中,事务是一种用于保证数据的一致性和完整性的机制。分布式事务是指在多个不同的节点上执行的事务,这些节点之间需要协同工作以确保事务的一致性。SpringCloud是一个用于构建微服务架构的开源框架,它提供了一系列的组件来简化分布式事务的处理。1. 背景介绍分布式事务是一个复杂的问题,它涉及到多个节点之间的通信和协同。在传统的单机环境中,事务通常由数据库来处理,数据...

Linux重启网卡报错Device eth0 does not seem to be present_device ens5f0 does not seem to be prevent-程序员宅基地

文章浏览阅读5k次。Centos6.8重启网卡报错Device eth0 does not seem to be present虚拟机安装Centos系统以后,导出镜像,然后倒入镜像,修改IP后发现网卡启动失败:# service network restartShutting down loopback insterface: _device ens5f0 does not seem to be prevent

如何使用 API 网关实现 API 请求签名和验证-程序员宅基地

文章浏览阅读917次,点赞22次,收藏22次。1.背景介绍API 网关是一种在云计算中广泛使用的架构模式,它作为应用程序和服务之间的中介,负责接收来自客户端的请求并将其转发给后端服务。API 网关通常负责实现 API 请求的签名和验证,以确保请求的安全性和有效性。在本文中,我们将讨论如何使用 API 网关实现 API 请求签名和验证,以及相关的核心概念、算法原理、代码实例和未来发展趋势。2.核心概念与联系2.1 API 网关A..._网关做appid验签的目的是