Author:Once Day Date:2023年12月27日
配套的clang-format配置可参考文档:
程序文件摘要,包括版权说明、作者信息、功能概括和版本历史信息等。
头文件包含,<x.h>在前,”x.h”在后。
顺序定义常数宏,定义函数宏,typedef、struct和enums。
静态数据声明和定义。
函数,应按它们的逻辑关系而非调用顺序来组织。
/* sys/types.h */
#ifndef _SYS_TYPES_H_ ? 注意宏定义中包含分路径名(主目录下面不需要)
#define _SYS_TYPES_H_
.../* body of types.h */
#endif /* _SYS_TYPES_H_ */ ? 强制加此注释
/* ? 注意块注释中‘*’的位置,注意‘*’的对齐
* Here is a block comment
* The comment text should be spaced over uniformly.
* The opening slash-star and closing slash-star should are
* alone on a line.
*/
/*
* Copyright(C) 2005 Ruijie Network. All rights reserved.
*/ 2005是指本文件的履历,如2009年再修改本文件,则改为2005-09或2005, 2009或2005-2009
/*
* mktime.c ? 文件名
* Original Author: staff1@ruijie.com.cn, 2005-8-1 ? 最初作者,创建日期
* ? 以下是功能的简要说明
* xxxxxxxxxxxxxxxxxxxxxxxx
*
* History ? 记录1.0版以后的重大修改,1.0版不需要历史记录
* v1.2 stsff3@ruijie.com.cn 2005-10-1 ? 倒序记录
* XXXXXYYYYY ? 本次修改的简要说明
* v1.1 stsff2@ruijie.com.cn 2005-9-1
* XXXXXYYYYY
*/
如果是多重嵌套的大跨度复合语句,末尾注释中需要更多信息以便区分对应重数。
while (len--) {
sum += *data;
sum <<= 1;
...
} /* End of while */ ? 超过30行的复合语句强制加此注释
#include <stdio.h>
? 头文件包含后,与后续语句之间有一空行
#define HELLO_CNT 3
? 文件全部宏定义,与后续语句之间有一空行
int main(void)
{
int i;
? 函数内声明与语句之间有一空行
for (i = 0 ; i < HELLO_CNT; i++) {
printf(“hello world.\n”);
}
? 函数内逻辑块之间有一空行
return 0;
}
关键字与其后面表达式之间有空格。
单目操作符不应与它们的操作数分开。
除’.’和’->’外,其它双目操作符应与它们的操作数用空格隔开。
control {
statement;
statement;
}
注意case与switch在同一列
switch (expr) {
case ABC: ? 这种情况不需加注释
case DEF:
statement;
break;
case UVW:
statement;
/* FALLTHROUGH */ ? 强制加注释
case XYZ:
statement;
break;
default:
break;
}
while (*dest++ = *src++) {?一定要用大括号
(void)0;
}
struct boat {
int wllength; /* water line length in meters */
int type; /* see below */
long sailarea; /* sail area in square mm */ ? 注释的对齐
};
/* defines for boat.type */
#define KETCH 1 ? 常数的对齐
#define YAWL 2
#define SLOOP 3
#define SQRIG 4
#define MOTOR 5
静态局部函数无需使用模块名前缀来标识其所属的模块。
函数名原则上不超过30个字符,超过30个字符的函数占该文件全部函数比例不超过10%。
typedef struct splodge {
int sp_count;
char *sp_name, *sp_alias;
} splodge_t;
或者:
typedef struct { ? struct没有名字
int sp_count
char *sp_name, *sp_alias;
} splodge_t;
/** ? 注意此处是2个‘*’,这种格式只用于外部接口说明
* call_usermodehelper - start a usermode application
* @path: pathname for the application ? 注意参数前有‘@’
* @argv: null-terminated argument list
* @envp: null-terminated environment list
*
* Runs a user-space application. The application is started
* asynchronously. It runs as a child of keventd. It runs wite
* full root capabilities. keventd silently reaps the child when
* it exits.
*
* Must be called from process context. Returns zero on success,
* else a negative error code.
*/
int call_usermodehelper(char *path, char **argv, char **envp)