空白与缩进
空白
- 关键字
if
、while
、for
与其后的控制表达式的(
括号之间插入一个空格分隔,但括号内的表达式应紧贴括号。while (1);
- 双目运算符的两侧各插入一个空格分隔,单目运算符和操作数之间不加空格。
```
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(驼峰命名法)。
> 因为这种命名方式有高有低像驼峰一样。