zoukankan      html  css  js  c++  java
  • C/C++代码规范

    C/C++代码规范

    命名

    命名,包括文件名、类名、结构名、类型名、函数名、变量名、参数名等都是程序设计中重要的一部分。一个好的名称,体现了一个深思熟虑的过程,同时也 能够帮助别人更好地理解开发者的思路。如果发现程序中,充满了a, b, c, x, y, z, tmp这种命名的变量,这时候就需要仔细的考虑自己的实现是否有问题。

    类(结构)名

    • 类名必须是名词,类名必须明确表示这个类代表了什么。
    • 如果类名超过3个单词,说明这个类有可能需要拆分了。
    • 不要把父类的名字带到子类中。
    • 类名加上后缀也是一种选择。如下载代理类,可以写为DownloadProxy。
    • 类名首字母大写;用大写字母分隔单词,除单词的首字母外,全部小写;类名中不要出现下划线“_”。

    类(结构)属性名

    • 属性由成员前缀”m_“属性,属性名采用匈牙利命名规范。

    方法

    • 方法与函数执行一个任务,因此应当用动词来命名。比方说,DumpDataToFile()就要好于DataFile()。
    • 方法名首字母大写;用大写字母分隔单词,除单词的首字母外,全部小写,方法名中不要出现下划线。

    函数

    • 方法与函数执行一个任务,因此应当用动词来命名。
    • 函数名全部小写,单词之间用下划线分隔。

    方法与函数参数名

    • 首字母小写。
    • 除了第一个单词,所有单词的首字母大写。
    • 名称中不应出现”_”。

    类库名

    • 如果使用C书写类库,或在C++不使用namespace书写类库,为了避免命名冲突,需要在类名,结构名,函数名前加上类库名前缀。类库名应当简洁、明确。 如:
      ImEgg* ImEgg_new();   
      

    变量名

    • 变量名使用匈牙利命名规则。
    • 全部小写字母。
    • 使用”_”作为分隔符。
    • 唯一能违反以上命名规则的,是一些循环中需要用到的自增变量。 如:
      int fun(Point* pPoint)
      {
          Point* p_nest_point = pPoint;
          char* p = NULL;
          char sz_buf[255];
          for (int i = 0; i < 50 && (sz_buf+p++) != ' '; i++)
          {
              // do stuff
          }
      }
      
      p point
      b byte
      w word
      dw double word
      ch char
      wch wide char
      n number
      sz char[]
      f bool
      fn function pointer
      v void
      lpsz char* terminated by zero

    指针变量

    • 指针变量应在类型前加上p前缀,其后变量名命名规则不变。
    • *号永远靠近类型,一行声明中只出现一个指针变量。 如:
         Point* p_point;
      

    引用变量

    • 引用变量应在类型前加上r前缀,其后变量名命名规则不变。

    全局变量

    • 全用变量应使用g_属性描述,其后变量名命名规则不变。 如:
      ImLog4c* g_pLogger;
      

    静态变量

    • 静态变量应使用s_属性描述,其后变量名命名规则不变。
      ImLog4c* s_pLogger;
      

    枚举类型

    • 枚举类型命名规则使用大写字母,用下划线分隔单词。
      Enum PIN
      {
      PIN_ON = 1;
      PIN_OFF;
      };
      

    • 宏命名规则使用大写字母,用下划线分隔单词。
      #define MAX_LENGTH 50
      #define MAX(a, b) (a)>(b)?(a):(b)
      

    集合名称

    • 集合名称使用复数,其它与变量名规范相同。
      GList* edges = g_list_new();
      vector<Edge> edges;
      typedef vector<Edge> EdgeVector;
      typedef map<string, EdgeVector> EdgeMap;
      typedef list<EdgeMap> EdgeList;
      

    格式

    {}规则

    • “{“与”}”单独占一行。
    • “{“与”}”与上一行行首对齐。
    • If与while后哪怕只有一句话,也要加上“{“与”}”。
         while (*(buf+p++) != ' ')
      printf("hello
      ");
      

    ()规则

    • "("与前一个关键字之间留一个空格。
    • "("与前函数名之间不需要留一个空格。
    • Return语句尽可能不要用"()"
      return (a*b^2>100)?(a):(b);
      

    缩进规则

    • 缩进永远为4。
    • 用空格代替tab。
    • Tab永远用4。
    • 如果缩进超过5层,考虑代码优化。

    列长度

    • 一列不应该超过80个英文字符。
    • 一个声明占一行
    • 一个声明占一行。

    三元表达式

    • 条件表达式占一行
    • then与else应单独占一行。
      (condition) ? funct1() : func2();   
      Or
         (condition)
            ? long statement
            : another long statement;
      

    头文件顺序

    • 头文件应当按照与功能的特点性从高到低排列。顺序为
    • 当前目录的头文件。
    • 自行开发库的头文件。
    • 第三方库的头文件。
    • 标准C++头文件。
    • 标准C头文件。

    空格

    • 操作符需要加上空格。
    • 关键字前后要加上空格。
    • 逗号后要加上空格。
    • 冒号后要加上空格。
    • 在一行内的分号后要加上空格,行末的分号不要空格。
      fun(a, b);
      for (int I = 0; I < 50; i++);
      

    类与结构

    类文件与结构文件命名

    • 公有类,C中用以模拟类的结构,需要位于一个独立的文件中。
    • 文件名与公有类名,C中用以模拟类的结构名相同。

    类与结构头文件布局

    • 文件描述,使用Doxygen语法。
    • 头文件保护宏。
    • 头文件。
    • 类或结构描述,使用Doxygen语法。
    • 类或结构名。
    • 属性描述,使用Doxygen语法。以下每个属性或方法都要求对应一个描述。
    • 属性声明。
    • C++与身命周期相关函数声明。C++中的构造方法,析构方法以及工厂方法。
    • C++操作符重载。
    • C++访问器,get与set方法。
  • 相关阅读:
    Sprinig.net 双向绑定 Bidirectional data binding and data model management 和 UpdatePanel
    Memcached是什么
    Spring.net 网络示例 codeproject
    jquery.modalbox.show 插件
    UVA 639 Don't Get Rooked
    UVA 539 The Settlers of Catan
    UVA 301 Transportation
    UVA 331 Mapping the Swaps
    UVA 216 Getting in Line
    UVA 10344 23 out of 5
  • 原文地址:https://www.cnblogs.com/elitiwin/p/3517608.html
Copyright © 2011-2022 走看看