仓库中有 .clang-format,大部分代码风格的问题可以使用 Clang Format 这个工具解决。以下是附加规范:
-
文件名使用小写和下划线。头文件后缀名为
.h,源代码文件后缀名为.c。 -
注释使用双斜杠
//或者/** ... */。注释首字母不大写。每一句话后面需要有句点(.)。
// one line comment.
/* one line comment. */
// multi
// line
// comment.
/**
* multi
* line
* comment. Multi line comment.
*/-
结构体使用
typedef struct { ... } StructName;,枚举类型使用typedef enum { ... } EnumName;。 -
变量名、函数名使用
snake_case,类型名、结构体名、枚举类型名使用CamelCase。
void hello_world() {
usize some_count = 0;
}
typedef struct {
i32 a;
} HelloWorld;
typedef HelloWorld AnotherOne;-
如非名称过长,请尽量避免使用缩写。
-
无论什么名称,尽量避免使用双下划线(
__),包括开头和结尾。
#define __CORE_AHA_H__ // NO
#define _CORE_AHA_H_ // YES- 希望对其它编译单元隐藏的函数、变量,请在名称前加上下划线(
_)。
static bool _hidden;
static INLINE _helper_function();- 没有用到的函数参数,请使用
(void)arg_name。
i64 add(i64 a, i64 b, bool flag) {
(void)flag;
return a + b;
}- 使用头文件时,请使用尖括号
<...>。无论是不是在同一个文件夹下。
#include "some_header.h" // NO
#include <package/some_header.h> // YES-
头文件的第一行使用
#pragma once。 -
避免直接使用
int、short、unsigned、long long、size_t等类型,使用bool、i16、u32、i64、usize等。
int is_okay(); // NO
bool is_okay(); // YES-
尽量避免使用
0、1表示布尔值,而是使用false、true。 -
如果
typedef只用到了一次,可以不用。
// NO
typedef void (*SomeHandler)(void);
typedef struct {
SomeHandler handler;
} Context;
// YES
typedef struct {
void (*handler)(void);
} Context;- 函数和函数指针的申明中请带上参数名称。
// NO
i32 foo(i32);
typedef struct {
void (*func)(i32);
} Interface;
// YES
i32 foo(i32 value);
typedef struct {
void (*func)(i32 value);
} Interface;- 函数指针中若没有需要传入的参数,请填入
void。
typedef int (*VoidFunc)(void);- 所有
inline函数请使用static INLINE或者static ALWAYS_INLINE。
inline i64 add(i64 a, i64 b); // NO
static INLINE i64 add(i64 a, i64 b); // YES- 如果希望函数不被内联优化,请使用
NO_INLINE。
NO_INLINE i64 complicated_add(i64 a, i64 b);- 不会返回的函数(如
panic、fork),请在前面标注NO_RETURN。
NO_RETURN void panic();
NO_RETURN void panic() {
while (1) {}
}- 对于一个模块(如内存分配器),建议将所有全局变量放到一个结构体内。如果不需要被其它模块引用,请标记为
static。
// NO
SpinLock mem_lock;
usize mem_size;
// YES
typedef struct {
SpinLock lock;
usize size;
} MemoryContext;
static MemoryContext ctx;-
请使用
asm volatile而不是asm。 -
请尽可能消除所有的编译器警告,而不是忽略它们。
欢迎对当前的代码风格提出意见。