1. 制表符8个空格
2. 每行最长80字符
3. 代码块的{放在首行,但是函数的{放在次行
4. 只有一行的if块,不加{}
5. 不在()前后加空格
6. 正常关键字后加一个空格,if, switch, case, for, do, while
7. 但是不要在sizeof、typeof、alignof或者__attribute__这些关键字之后放空格
8. 指针*号,靠近变量名,而不是靠近类型名
9. 操作符前后使用一个空格
10. 除非是可能32位,可能64位的情况类似场景下,使用typedef
11. 使用goto做函数集中式的退出
12. 宏请大写,但是形如函数名的宏小写
13. 相关常量请用枚举
14. 含有多个语句的宏应该被包含在一个do-while代码块里:
#define macrofun(a, b, c) \
do { \
if (a == 5) \
do_this(b, c); \
} while (0)
15. 1) 影响控制流程的宏:
#define FOO(x) \
do { \
if (blah(x) < 0) \
return -EBUGGERED; \
} while(0)
非常不好。它看起来像一个函数,不过却能导致“调用”它的函数退出;不要打乱读者大脑里
的语法分析器。
16. 2) 依赖于一个固定名字的本地变量的宏:
#define FOO(val) bar(index, val)
可能看起来像是个不错的东西,不过它非常容易把读代码的人搞糊涂,而且容易导致看起来
不相关的改动带来错误。
17. 不要重复发明内核宏
数组大小
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
类似的,如果你要计算某结构体成员的大小,使用
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
kernel编程规范