1 注释风格
1.1 注释的原则是有助于对程序的阅读和理解,注释不宜太多也不能太少。注释语⾔必须准确、易懂、简洁,没有歧义性。
* Function:
// 函数名称
* Description:
// 函数功能、性能等的描述
* Calls:
// 被本函数调⽤的函数清单
* Called By:
// 调⽤本函数的函数清单
* Input:
// 输⼊参数说明,包括每个参数的作⽤
* Output:
// 输出参数说明,有时通过指针参数返回⼀些变量值
* Return:
// 函数返回值的说明
* Others:
// 其他说明
*/
1.4 对于所有有特定含义的变量、常量、宏、结构体等数据结构,如果其命名不是充分⾃注释的,在声明时都必须加上注释,说明其实际含义。变量、常量、宏的注释应放在其上⽅或右⽅。
1.5 全局变量要有较详细的注释,包括功能,取值范围,哪些函数访问它,访问时的注意事项。
1.6 为使程序排版整齐,⽅便阅读和理解,注释也要进⾏缩进和对齐。
void example_function( void )
{
/* comments one */
unsigned int min_port, max_port;
/* comments two */
if ...
}
1.7 在复杂程序块的结束⾏右⽅加注释,以表明某程序块的结束。c语言struct头文件
⽰例:
if (...)
{
.
..
while ( ... )
} /* while ( ... )循环语句结束*/
...
} /* end of if (...)语句结束 */
2 排版风格
2.1 相对独⽴的程序块之间、变量声明之后必须加空⾏。
int conn_fd;
int ret;
conn_fd = socket(AF_INET, SOCK_STREAM,0);
if (conn_fd < 0) {
perror("socket create");
}
2.2 程序块要采⽤缩进风格编写,缩进为4个空格或⼀个Tab键。
2.3 对于较长的语句(超过个80字符)要分成多⾏书写,划分出的新⾏要进⾏适当的缩进,使排版整齐,语句可读。对于参数较长的函数也要划分成多⾏。
ret = connect(conn_fd, (struct sockaddr *)&serv_addr,
sizeof (struct sockaddr));
2.4 ⼀⾏只写⼀条语句,不允许把多个短语句写在⼀⾏中。
以下语句是不规范的:
min_port = 1;
max_port = 65535;
应该如下书写:
min_port = 1;
max_port = 65535;
2.5 if、for、do、while、case、switch、default等语句各⾃占⼀⾏,且if、for、do、while等语句的执⾏语句部分⽆论多少都要加括号{ }。
以下语句是不规范的:
if (conn_fd < 0) perror("socket create");
应该如下书写:
if (conn_fd < 0) {
perror("socket create");
}
2.6 ‘{’ 和 ‘}’ 要独占⼀⾏
for (i=1; i
}
或者在代码中‘{’与for语句同⾏,‘{’前⾯要有⼀个空格。
for (i=1; i
...
}
2.7 空格的使⽤
(1)以下语句在逗号后⾯加空格。
int min_port, max_port;
(2)"+"、"-"、"*"、"="等算术运算符两边都有⼀个空格。
a = i + j;
(3)"="等⽐较操作符两边都有⼀个空格。
if (conn_fd < 0) {
(4)"!"、"~"、"++"、"--"、"&"(地址运算符)等单⽬操作符前后不加空格。
i++;
(5)"->"、"."前后不加空格。
portinfo.min_port = i * seg_len + 1;
3 变量定义
3.1 变量命名要清晰明了,有明确含义,同时使⽤完整的单词或⼤家基本可以理解的缩写,避免使⼈产⽣误解。
⽰例:
temp可以简写为tmp
message可以简写为msg
3.2 对于变量命名,禁⽌使⽤单个字符(如i、j、k),建议除了要有具体含义外,还能表明其数据类型等,但i、j、k作为局部循环变量是允许的。
int iwidth;
// i表明该变量为int型,width指明是宽度
3.3 在Linux下变量命名⼀般是全⼩写加下划线的风格。
⼀般使⽤:
int min_port;
⼀般不使⽤:
int minPort;
3.4 在多线程程序中使⽤全局变量,应注意对变量操作的原⼦性。
3.5 应避免局部变量与全局变量同名。
3.6 严禁使⽤未经初始化的变量作为右值。在C程序中,引⽤未经赋值的指针,经常会引起程序崩溃。
以下代码在Linux下将导致错误,原因在于:没有使p_string指向某个内存空间的情况下,即对其进⾏操作是错误的。char *p_string;
p_sting[0] = ‘a’;
应先进⾏初始化:
char *p_string;
p_string = (char *)malloc(BUFF_SIZE); // 这⾥假设BUFF_SIZE已定义
p_sting[0] = ‘a’;
4 宏定义
4.1 代码中尽量少使⽤字⾯常量,⽽使⽤宏常量。
4.2 宏定义时宏名尽量⼤写
4.3 如果宏名由多个单词组成,那么个单词中间要加_
#define BUFF_SIZE 1024
input_data = (char *)malloc(BUFF_SIZE);
4.4 ⽤宏定义表达式时,要使⽤完备的括号。
如下定义的宏存在⼀定的风险:
#define GET_AREA(a,b) a*b
应该定义为:
#define GET_AREA(a,b) ((a)*(b))
4.5 若宏中有多条语句,应该将这些语句放在⼀对⼤括号中。
下⾯语句中只有宏的第⼀条表达式被执⾏。
#define INTI_RECT_VALUE( a, b )
a = 0;
b = 0;
for (index = 0; index < RECT_TOTAL_NUM; index++)
INTI_RECT_VALUE( rect.a, rect.b );
正确的⽤法应为:
#define INTI_RECT_VALUE( a, b ) {
a = 0;
b = 0;
}
for (index = 0; index < RECT_TOTAL_NUM; index++) {
INTI_RECT_VALUE( rect[index].a, rect[index].b );
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论