C/C++语言代码规范

参考文献:https://www.cnblogs.com/henjay724/p/12259328.html

一. 引言

     制定此编码风格指导手册的目的是为了使按此规范编写出的C/C++代码极易被阅读和理解。

二. 与其他编码风格对比

C/C++语言代码规范

 

 三. 基本排版格式

    1. 需要以4个空格为单位的缩进

    2. 坚决不用Tab键,要用空格键

    3. 所有文件结尾必须空一行

    4. 文本文件必须使用UTF-8编码

    5. 每一行不能超过100个字符

四. 文档与注释

    1. 恰当地进行代码注释

    2. 关于注释长度没有具体限制,只要能提供帮助,就尽可能地注释

    3. 注释应该解释代码为什么要这么做,而不是如何去做(代码本身已经表明了如何去做)

    4. 选择Doxygen文档系统来完成注释,除了在函数中的注释之外(因为Doxygen不适合个别代码的注释),Doxygen也不适用于汇编

    5. 头文件定义

         C语言头文件为了避免多次重复包含,需要定义一个符号。这个符号的定义形式请采用如下 的风格:

#ifndef __FILE_H__
#define __FILE_H__
/* header file content */
#endif

   6. 在每个源文件文件头上,应该包括相应的版权信息,Change Log 记录:

/*
    * File      : rtthread.h
    * This file is part of RT-Thread RTOS
    * COPYRIGHT (C) 2006 - 2012, RT-Thread Development Team
    *
    *  This program is free software; you can redistribute it and/or modify
    *  it under the terms of the GNU General Public License as published by
    *  the Free Software Foundation; either version 2 of the License, or
    *  (at your option) any later version.
    *
    *  This program is distributed in the hope that it will be useful,
    *  but WITHOUT ANY WARRANTY; without even the implied warranty of
    *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    *  GNU General Public License for more details.
    *
    *  You should have received a copy of the GNU General Public License along
    *  with this program; if not, write to the Free Software Foundation, Inc.,
    *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
    *
    * Change Logs:
    * Date           Author       Notes
    * 2006-03-18     Bernard      the first version
    * 2006-04-26     Bernard      add semaphore APIs
    * ...
    */

 

五. 标准数据类型

    1. 仅使用C99标准给出的整型(定义见stdint.h文件),如uint32_t,int16_t等,不要typedef自己的整型类型,如u8,int_32,WORD等,

    2. 使用char或wchar_t来表示字符串,但二进制缓存仍应使用uint8_t

    3. 仅使用C99标准给出的bool型(定义见stdbool.h文件)来表示布尔变量,true和false表示其值。(PS:windows 平台下编译时需要自行定义,因为windows下不包含stdbool.h文件)

六. 标识符发命令

    6.1 以下是C/C++下变量,函数,typedef,宏命名的基本规则,命名规则可以接受细微改动,但要保证在同一模板中的一致性:

        1. 全局函数名:全小写,单词用下划线隔开,

            如:i2c_receive_data()

        2. 普通变量名: Camel命名法,

            如:thisIsMyVariable

        3. 结构体名和类名:Pascal命名法,

            如:BigBoxOfTools

        4. 类成员函数名:Camel命名法,

            如:initialLongProcess()

        5. 用typedef重命名:全小写,单词用下划线隔开,加_t后缀,

            如:big_box_of_tools_t

        6. 用宏命名:单词全大写(仅在宏中使用,且必须使用)

    6.2 描述性强的,可读性强的变量名非常重要:

        1. 大部分单词都不应该缩写,比如应用block而不是blk,应用count而不是cnt,一些流行的缩写还是可以的,比如init或config

        2. 完全可以接受较长的,描述性的变量名

        3. 布尔型变量可以使用”is”,”did”等前缀,这会清晰地表明其是一个布尔型

        4. 变量名应该可以表达其目的,但坚决反对匈牙利命名(加数据类型前缀)

            正确: temporaryParameters, startBlock, nodeKey, isAlarmEnabled

            错误:u32BlkNum, bEnabled

    6.3. 有时候为了表明范围和目的,有些变量命名是可以加前缀和后缀的:

        局部变量:无需前缀

        全局变量:加g_前缀

        静态变量:加s_前缀

        类成员变量:加m_前缀

        常量:加k前缀
            1):如kUnconstrained, kFirstPage, kMaxBufferBytes
            2):k前缀使常量很容易被识别

        typedef型变量:加_t后缀

        PS:切记不要用匈牙利命名法,因为其会导致变量名难于阅读,且类型前缀常常会与变量真正类型不同步,微软曾是此命名法的拥趸,但其已意识到此命名法的缺陷,目前正在逐渐脱离此方法

七. 可调试性

     7.1. 一系列的整型常量应该用枚举来表示,而不是用宏来定义

         1. 在调试时,常量被显示为真实的标识,而不是数字

         2. 便于常量的逻辑分组

    7.2. 大部分情况下,使用内联函数来代替宏功能 

         1. 在调试中,内联函数可以被禁用,故可以跳过

         2. 内联函数参数有类型,而宏中参数不可以有类型

         3. 这个规则仅适用于当用宏来表示一段代码时,不适用于在表达式中表示某部分的宏

         PS: 头文件中,内联功能启用应用static inline来完成

八. C/C++通用性

    8.1. 头文件中的公用函数原型必须包含在下列语句中

#if defined(__cplusplus)
extern "C" {
#endif // __cplusplus

// 此处放函数原型

#if defined(__cplusplus)
}
#endif // __cplusplus

     C中一般都用typedef来重命名结构体和枚举数据类型,不要提及原始的结构体或枚举型名

     C++中,则不需用typedef来重命名,直接用原始的结构体或枚举型名;但是如果代码被C/C++共享,则应遵从C风格
  对于被用在C++中的函数(比如类成员)而言,如果函数不带任何参数,则不需要一个专门的void参数来表明,而在C中这是需要的

九. 花括号的使用

    9.1. 花括号的使用虽重要性不高,但经常起争议

         a. 通常情况下,花括号应该单独起一行,不需要额外的缩进

         b. 有时为了保持可读性,可以不遵守上一规则

         c. 花括号使用的关键点在于不要将代码凑在一起,从而使得代码比较难阅读;也不要因为具体格式的限定,从而打破视觉流程

    9.2. 使用规则可以接受细微改动,但要保证在同一模块中的一致性,以及易于阅读

C/C++语言代码规范

结构体和类示例:
struct Monkey
{
    int x;
};

typedef struct MonkeyTwo {
    int y;
} monkey_two_t;

class Cube
{
public:
    Cube(int theSize);

private:
    int m_size;
};
枚举示例:
enum _my_enum
{
    kValueOne = 1,
    kValueTwo = 2
};

typedef enum _another {
    kAnotherOne = 10,
    kAnotherTwo = 20
} another_t;
函数示例:
void foo()
{
    printf("hin");
}
If语句示例:
if (baz >= kMaximumBaz)
{
    baz = kMaximumBaz;
}
else if (!ready)
{
    makeItReady();
}
else
{
    abort();
}
For语句示例:
for (i=0; i < 10; ++i)
{
    printf("%d", i);
}
While语句示例:
while (!done)
{
    doSomething();
}
Do-while语句示例:
do {
    doSomething();
} while (!done);
Switch语句示例:
switch (value)
{
    case 0:
        x += 1;
        break;

    case 1:
    {
        int y;
        calculateIt(&y);
        break;
    }

    default:
        return;
}
命名空间示例:
namespace fsl
{
// Don't indent namespace contents!
}
Try-catch语句示例:
try
{
}
catch (std::exception & e)
{
}
catch (...)
{
}

View Code

 

原文链接: https://www.cnblogs.com/linux-37ge/p/12266503.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C/C++语言代码规范

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/327170

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午4:09
下一篇 2023年3月1日 下午4:09

相关推荐