C

C知识汇总-代码风格

Posted by zihengCat on 2017-07-29

空白与缩进

空白

  1. 关键字ifwhilefor与其后的控制表达式的(括号之间插入一个空格分隔,但括号内的表达式应紧贴括号。
    while (1);
    
  2. 双目运算符的两侧各插入一个空格分隔,单目运算符和操作数之间不加空格。
    ```
    i = i + 1;

++i;
!(i < 1);
-x;
&a[1];

3. 后缀运算符和操作数之间不加空格。

s.a /* 取结构体成员 /
foo(arg1) /
函数调用 /
a[i] /
取数组成员 */

4. 逗号`,`与分号`;`之后加空格,这是英文的书写习惯。

for(i = 0; i < 10; i++);
foo(arg1, arg2);

5. 以上关于双目运算符和后缀运算符的规则并没有严格要求,有时候为了突出优先级也可以写得更紧凑一些,但是省略的空格一定不要误导了读代码的人。

6. 由于UNIX系统标准的字符终端是24行80列的,接近或大于80个字符的较长语句要折行写,折行后用空格和上面的表达式或参数对齐。

7. 较长的字符串可以断成多个字符串分行书写,C编译器会自动把相邻的多个字符串拼接在一起。

printf(“This is such a long sentence that “
“it cannot be held within a line\n”);

8. 可以在变量定义语句中使变量名对齐,这样看起来很美观。

## 缩进

1. 要用缩进体现出语句块的层次关系。

2. 不要混用Tab与空格。

3. `if/else`、`while`、`do/while`、`for`、`switch` 这些带语句块的语句,语句块`{...}`可以和关键字写在同一行,用空格隔开;也可以单独写一行。

4. `switch` 语句块里的 `case`、`default` 对齐写。

switch (c) {
case ‘A’:
/* statements /
case ‘B’:
/
statements /
case ‘C’:
/
statements /
default:
/
statements */
}


5. 代码中每个逻辑段落之间应该用一个空行分隔开。例如每个函数定义之间应该插入一个空行,头文件、全局变量定义和函数定义之间也应该插入空行。

6. 如果一个函数的语句很长,也可以根据相关性分成若干组,用空行分隔。

# 注释

1. 注释应采用`/* comment */`的形式,用空格把界定符和文字分隔来开。

2. 函数注释说明此函数的功能、参数、返回值、错误码等,写在函数定义上侧,和此函数定义之间不留空行,顶头写不缩进。

3. 相对独立的语句组注释对这一组语句做特别说明,写在语句组上侧,和此语句组之间不留空行,与当前语句组的缩进一致。

4. 代码行右侧的简短注释对当前代码行做特别说明,一般为单行注释,和代码之间至少用一个空格隔开,一个源文件中所有的右侧注释最好能上下对齐。

5. 复杂的结构体定义比函数更需要注释说明。

6. 复杂的宏定义和变量声明也需要注释。

> 关于注释应该使用 `/*...*/` 还是 `//` 可以具体情况具体分析。
> *Linux Kernel* 因为考虑到平台兼容性,不允许使用 C99 的`//`注释。
> 但如果程序并不会兼容性有过多要求,也可以使用`//`进行注释。

# 命名

## 变量命名

内核编码风格规定: 
- 变量、函数和类型采用全小写加下划线的方式命名。
- 变量的名字应当使用“名词”或者“形容词+名词”。

### 普通变量命名

string table_name; /* good - uses underscore /
string tableName; /
bad - mixed case */

### 全局变量命名

尽量不使用全局变量,如果不得已需要全局变量,则在全局变量加前缀`g_`(表示 *global*)。

int g_how_many_people; /* global variable /
int g_how_much_money; /
global variable*/


### 静态变量命名

静态变量加前缀 `s_`(表示 *static*)。

void init(…)
{
static int s_init_value; /* static variable */

}


## 常量命名

常量采用全大写加下划线的方式命名。
- const 常量
- 宏定义常量
- 枚举常量

## 函数、类型命名
函数、类型命名统一小写加下划线,和变量的命名方式相同。

void add_table_entry();
int delete_url();
struct complex_struct{
double x, y;
};
enum coordinate_type { RECTANGULAR, POLAR };

> Modern C++ 建议函数名的每个单词首字母大写, 没有下划线。
> 这种大小写混合的命名方式在c++代码中很普遍,称为 camelcase(驼峰命名法)。
> 因为这种命名方式有高有低像驼峰一样。