C语言编码风格
很多人不重视这点,认为无所谓,甚至国内的绝大多数教材也不讨论这个话题,导致学生入公司后仍要进行编码风格的教育。我接触过很多学生,发现他们由于平时缺乏这种意识,养成了不好的习惯,导致很难改正过来。代码没有注释,变量、函数等命名混乱,过两天自己都看不懂自己的代码。下面是一些我见过的比较好的做法,希望读者能有所收获。
1、每一个函数都必须有注释,即使函数短到可能只有几行。头部说明需要包含包含的内容和次序如下:
/************************************************************************
* Function Name : nucFindThread
* Create Date : 2000/01/07
* Author/Corporation : your name/your company name
**
Description : Find a proper thread in thread array.
* If it’s a new then search an empty.
*
* Param : ThreadNo: someParam description
* ThreadStatus: someParam description
**
Return Code : Return Code description,eg:
ERROR_Fail: not find a thread
ERROR_SUCCEED: found
*
* Global Variable : DISP_wuiSegmentAppID
* File Static Variable : naucThreadNo
* Function Static Variable : None
*
*------------------------------------------------------------------------
* Revision History
* No. Date Revised by Item Description
* V0.5 2008/01/07 your name … …
************************************************************************/
static unsigned char nucFindThread(unsigned char ThreadNo,unsigned char ThreadStatus)
{
…
}
2、每个函数定义结束之后以及每个文件结束之后都要加一个或若干个空行。例如:
/************************************************************************
* ………
* Function1 Description
* ………
************************************************************************/
void Function1(……)
{
…
}
//Blank Line
/************************************************************************
* ………
* Function2 Description
* ………
************************************************************************/
void Function2(……)
{
…
}
//Blank Line
/************************************************************************
* ………
* Function3 Description
* ………
************************************************************************/
void Function3(……)
{
…
}
//Blank Line
3、在一个函数体内,变量定义与函数语句之间要加空行。例如:
/************************************************************************
* ………
* Function Description
*………
************************************************************************/
void Function1()
{
int n;
//Blank Line
statement1
…….
}
4、逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。例如:
//Blank Line
while (condition)
{
statement1;
//Blank Line
if (condition)
{
statement2;
}
else
{
statement3;
}
//Blank Line
statement4
}
5、复杂的函数中,在分支语句,循环语句结束之后需要适当的注释,方便区分各分支或循环体。
while (condition)
{
statement1;
if (condition)
{
for(condition)
{
Statement2;
}//end “for(condition)”
}
else
{
statement3;
}//”end if (condition)”
statement4
}//end “while (condition)”
6、修改别人代码的时候不要轻易删除别人的代码,应该用适当的注释方式。例如:
while (condition)
{
statement1;
//////////////////////////////////////
//your name , 2008/01/07 delete
//if (condition)
//{
// for(condition)
// {
// Statement2;
// }
//}
//else
//{
// statement3;
//}
////////////////////////////////////////
///////////////////////////////////////
// your name , 2000/01/07 add
…
new code
…
///////////////////////////////////////
statement4
}
7、用缩行显示程序结构,使排版整齐,缩进量统一使用4个字符(不使用TAB缩进)。
每个编辑器的TAB键定义的空格数不一致,可能导致在别的编辑器打开你的代码乱成一团糟。
8、在函数体的开始、结构/联合的定义、枚举的定义以及循环、判断等语句中的代码都要采用缩行。
9、同层次的代码在同层次的缩进层上。例如:
10、代码行最大长度宜控制在80 个字符以内,较长的语句、表达式等要分成多行书写。
11、长表达式要在低优先级操作符处划分新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。例如:
if ((very_longer_variable1 >= very_longer_variable12)
&& (very_longer_variable3 <= very_longer_variable14)
&& (very_longer_variable5 <= very_longer_variable16))
{
dosomething();
}
for (very_longer_initialization;
very_longer_condition;
very_longer_update)
{
dosomething();
}
12、如果函数中的参数较长,则要进行适当的划分。例如:
void function(float very_longer_var1,
float very_longer_var2,
float very_longer_var3)
13、用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。例如:
int aiMinValue;
int aiMaxValue;
int niSet_Value(…);
int niGet_Value(…);
14、如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。例如:
leap_year = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
15、不要编写太复杂的复合表达式。例如:
i = a >= b&&c < d && c + f <= g + h; 复合表达式过于复杂
16、不要有多用途的复合表达式。例如:
d = (a = b + c) + r;
该表达式既求a 值又求d 值。应该拆分为两个独立的语句:
a = b + c;
d = a + r;
17、尽量避免含有否定运算的条件表达式。例如:
if (!(num >= 10))
应改为:
if (num < 10)
18、参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。如果函数没有参数,则用void 填充。例如:
1、每一个函数都必须有注释,即使函数短到可能只有几行。头部说明需要包含包含的内容和次序如下:
/************************************************************************
* Function Name : nucFindThread
* Create Date : 2000/01/07
* Author/Corporation : your name/your company name
**
Description : Find a proper thread in thread array.
* If it’s a new then search an empty.
*
* Param : ThreadNo: someParam description
* ThreadStatus: someParam description
**
Return Code : Return Code description,eg:
ERROR_Fail: not find a thread
ERROR_SUCCEED: found
*
* Global Variable : DISP_wuiSegmentAppID
* File Static Variable : naucThreadNo
* Function Static Variable : None
*
*------------------------------------------------------------------------
* Revision History
* No. Date Revised by Item Description
* V0.5 2008/01/07 your name … …
************************************************************************/
static unsigned char nucFindThread(unsigned char ThreadNo,unsigned char ThreadStatus)
{
…
}
2、每个函数定义结束之后以及每个文件结束之后都要加一个或若干个空行。例如:
/************************************************************************
* ………
* Function1 Description
* ………
************************************************************************/
void Function1(……)
{
…
}
//Blank Line
/************************************************************************
* ………
* Function2 Description
* ………
************************************************************************/
void Function2(……)
{
…
}
//Blank Line
/************************************************************************
* ………
* Function3 Description
* ………
************************************************************************/
void Function3(……)
{
…
}
//Blank Line
3、在一个函数体内,变量定义与函数语句之间要加空行。例如:
/************************************************************************
* ………
* Function Description
*………
************************************************************************/
void Function1()
{
int n;
//Blank Line
statement1
…….
}
4、逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。例如:
//Blank Line
while (condition)
{
statement1;
//Blank Line
if (condition)
{
statement2;
}
else
{
statement3;
}
//Blank Line
statement4
}
5、复杂的函数中,在分支语句,循环语句结束之后需要适当的注释,方便区分各分支或循环体。
while (condition)
{
statement1;
if (condition)
{
for(condition)
{
Statement2;
}//end “for(condition)”
}
else
{
statement3;
}//”end if (condition)”
statement4
}//end “while (condition)”
6、修改别人代码的时候不要轻易删除别人的代码,应该用适当的注释方式。例如:
while (condition)
{
statement1;
//////////////////////////////////////
//your name , 2008/01/07 delete
//if (condition)
//{
// for(condition)
// {
// Statement2;
// }
//}
//else
//{
// statement3;
//}
////////////////////////////////////////
///////////////////////////////////////
// your name , 2000/01/07 add
…
new code
…
///////////////////////////////////////
statement4
}
7、用缩行显示程序结构,使排版整齐,缩进量统一使用4个字符(不使用TAB缩进)。
每个编辑器的TAB键定义的空格数不一致,可能导致在别的编辑器打开你的代码乱成一团糟。
8、在函数体的开始、结构/联合的定义、枚举的定义以及循环、判断等语句中的代码都要采用缩行。
9、同层次的代码在同层次的缩进层上。例如:
10、代码行最大长度宜控制在80 个字符以内,较长的语句、表达式等要分成多行书写。
11、长表达式要在低优先级操作符处划分新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。例如:
if ((very_longer_variable1 >= very_longer_variable12)
&& (very_longer_variable3 <= very_longer_variable14)
&& (very_longer_variable5 <= very_longer_variable16))
{
dosomething();
}
for (very_longer_initialization;
very_longer_condition;
very_longer_update)
{
dosomething();
}
12、如果函数中的参数较长,则要进行适当的划分。例如:
void function(float very_longer_var1,
float very_longer_var2,
float very_longer_var3)
13、用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。例如:
int aiMinValue;
int aiMaxValue;
int niSet_Value(…);
int niGet_Value(…);
14、如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。例如:
leap_year = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
15、不要编写太复杂的复合表达式。例如:
i = a >= b&&c < d && c + f <= g + h; 复合表达式过于复杂
16、不要有多用途的复合表达式。例如:
d = (a = b + c) + r;
该表达式既求a 值又求d 值。应该拆分为两个独立的语句:
a = b + c;
d = a + r;
17、尽量避免含有否定运算的条件表达式。例如:
if (!(num >= 10))
应改为:
if (num < 10)
18、参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。如果函数没有参数,则用void 填充。例如: