首页 > 代码库 > 小野熊的c语言编程风格

小野熊的c语言编程风格

模仿bsd编码规范写了个给自己的规范,呵呵。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*
 * 非常重要的单行注释像这样
 */
 
/* 一般的单行注释这样写 */
 
/*
 * 多行注释
 * 这样写
 */
 
//这种c++注释风格只可以用在调试(注释代码)上,不能做一般的注释
/* 所以上一句是不符合小野熊编程规范的 */
 
#if 0
如果你有大段代码要注释,用#if 0
如果你正在调试两种情况,用#if 0 + #else
因为可以方便的把#if 0改为#if 1
#else
这样就可以快速切换到这里的代码
#endif
 
/*
这是另一种注释代码的方式
当你要重新启用这里的代码时
就把第一行的/*变成//*
很神奇吧
//*/
 
#include <assert.h> /* include文件时记得按首字母排序 */
#include <stdio.h>  /* 先include系统(/usr/include)里的头文件 再include自己的头文件 */
#include <unistd.h> /* 记得空一行 */
 
#include "stack.h"
 
#undef SWAP
#define SWAP(x,y) do { \
    typeof(x) tmp = (x); \
    (x) = (y); \
    (y) = tmp; \
} while (0)
/*
 * 写宏的时候学会用末尾的\以及do ... while(0)
 * 并且先把它给undef了,免得出错
 * 放心,假如这个宏原本就没有定义的话#undef也不会出错
 * 另外,宏名全大写
 */
 
enum boolean {
    TRUE = 1,
    FALSE = 0
};
/*
 * 写enum的时候把member都写成全大写
 * enum最后会被当作宏定义来处理
 */
 
/*
 * 无论一个结构体中记录数据的类型有多小,都请用另一个结构体来包装
 * 因为这样不仅增强了可读性
 * 而且扩展起来也方便
 */
struct foodata {
    char *string; /* 千万不要用data之类的名字 —— 万一你有好几个member呢?管她们叫data1 data2? */
};
 
typedef int count; /* 永恒不变的类型用typedef来包装 增强可读性 */
 
struct foo {
    struct foo *next;
    struct foodata data; /* 现在就可以用data了 */
    count len;
};
/*
 * 无论如何,千万不要用typedef来包装结构体!!
 */
 
static char function(int); /* 函数原型不用写出形参名 */
static void usage(void);
 
int /* 定义完整函数时, 第一行为函数返回值 */
main(int argc, char **argv) /* 第二行为函数名以及形参名以及形参类型 */
{ /* 第三行留给单独的开大括号 */
    int ch;
    enum boolean aflag = FALSE;
    enum boolean fflag = FALSE;
     
    while ((ch = getopt(argc, argv, "oaf:")) != -1) { /*
                                                      * 像这些while,for,和if就不要单独留一行给开大括号了
                                                      * 处理命令行形参用getopt(man 3 getopt)
                                                      */
        switch (ch) { /* 开大括号后需缩进 */
        case ‘a‘: /* case是个例外 */
            aflag = TRUE;
            /* FALLTHROUGH */ /* 使用switch特殊用法时需注明 */
        case ‘f‘:
            fflag = FALSE;
            break;
        case ‘o‘:
            putchar(function(1));
            break;
        case ‘?‘:
            /* FALLTHROUGH */
        default:
            usage();
        }
    }
     
    for (;;)
        ; /* 不管for,while,if的语句有多短,都要缩进 */
     
    for (;;) {
        function(2);
        function(3);
        usage();
    }
     
    for (;;) /* 如果只有一个语句就不要写开大括号了 */
        SWAP(ch, aflag); /* 函数调用以及声明时在‘,‘后加一个空格 */
     
    while (1) /* 缩进一般为8格 */
        ch = a + really + long + statement + that + needs + /* 如果一个表达式太长,怎样美观怎样缩进(用空格) */
                 two + lines; /* 但是她最前面必须跟随上一行来用tab缩进 */
     
    return 0;
}
 
static char
function(int a)
{ /* 最后声明完整的函数 */
    return (a == 0) ? a : function(abs(a) - 1);
}
 
static void
usage(void)
{
    fprintf(stderr,
            "usage: f [-aDde] [-b b_arg] [-m m_arg] req1 req2 [opt1 [opt2]] \n"
            "usage: f [-a | -b] [-c [-dEe] [-n number]] \n");
}
 
/* 如果这个程序有什么bug的话,在文件末尾写上 */
/*
 * 这个程序不能运行
 */
 
/* 最后写作者信息 */
/* Author: Louis(TinyKUMA) Lisp-CN <46897asd@gmail.com> */
 
/* 记得最后一行必须是空着的 */