2021-07-28 C语言学习函数编写规范

一、每一个函数都必须有注释,即使函数短到可能只有几行。头部说明需要包含包含的内容和次序如下:

/************************************************************************
* Function Name : nucFindThread
* Create Date : 
* 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 … …
************************************************************************/

二、每个函数定义结束之后以及每个文件结束之后都要加一个或若干个空行

/************************************************************************
* ………
* Function1 Description
* ………
************************************************************************/
void Function1(……)
{}
//Blank Line

三、在一个函数体内,变量定义与函数语句之间要加空行

/************************************************************************
* ………
* Function Description
*………
************************************************************************/
void Function1()
{
int n;
//Blank Line
statement1
…….
}

四、修改别人代码的时候不要轻易删除别人的代码,应该用适当的注释方式

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
}

五、用缩行显示程序结构,使排版整齐,缩进量统一使用4个字符,在函数体的开始、结构/联合的定义、枚举的定义以及循环、判断等语句中的代码都要采用缩行。
同层次的代码在同层次的缩进层上。

struct tagMyStruct
{
int a;
int b;
int c;
};
if (condition)
{
//program code
}
else
{
//program code
}

六、代码行最大长度宜控制在80 个字符以内,较长的语句、表达式等要分成多行书写,如果函数中的参数较长,则要进行适当的划分。

void function(float very_longer_var1,
              float very_longer_var2,
              float very_longer_var3)

七、用正确的反义词组命名具有互斥意义的变量或相反动作的函数等

int aiMinValue;
int aiMaxValue;
int niSet_Value();
int niGet_Value();

八、不要编写太复杂的复合表达式,不要有多用途的复合表达式。

例如:
d = (a = b + c) + r;

该表达式既求a 值又求d 值。应该拆分为两个独立的语句:
a = b + c;
d = a + r;

九、尽量避免含有否定运算的条件表达式。
如: if (!(num >= 10))
应改为: if (num < 10)

十、参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。如果函数没有参数,则用void 填充。

十一、原则上尽量少使用全局变量,因为全局变量的生命周期太长,容易出错,也会长时间占用空间.各个源文件负责本身文件的全局变量,同时提供一对对外函数,方便其它函数使用该函数来访问变量。
比如:niSet_ValueName(⋯);niGet_ValueName(⋯);

十二、参数命名要恰当,顺序要合理。
void str_copy (char *str1, char *str2);
那么我们很难搞清楚究竟是把str1 拷贝到str2 中,还是刚好倒过来。
可以把参数名字起得更有意义,如叫strSource 和strDestination。这样从名字上就可以看出应该把strSource 拷贝到strDestination。
一般地,应将目的参数放在前面,源参数放在后面

十三、如果参数是指针,且仅作输入参数用,则应在类型前加const,以防止该指针在函数体内被意外修改。
例如:
void str_copy (char *strDestination,const char *strSource);

十四、不要省略返回值的类型,如果函数没有返回值,那么应声明为void 类型。
如果没有返回值,编译器则默认为函数的返回值是int类型的。

十五、return 语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销毁。
例如:
char * Func(void)
{
char str[30];

return str;
}
str 属于局部变量,位于栈内存中,在Func 结束的时候被释放,所以返回str 将导致错误。

十六、函数体的规模要小,尽量控制在80 行代码之内

十七、相同的输入应当产生相同的输出。尽量避免函数带有“记忆”功能。带有“记忆”功能的函数,其行为可能是不可预测的,因为它的行为可能取决于某种“记忆状态“。这样的函数既不易理解又不利于测试和维护。在C 语言中,函数的static局部变量是函数的“记忆”存储器。建议尽量少用static 局部变量,除非必需。

十八、避免函数有太多的参数,参数个数尽量控制在4个或4个以内。如果参数太多,在使用时容易将参数类型或顺序搞错
实际上是基于ARM的ATPCS建议函数的形参不超过4个,如果形参个数少于或等于4,则形参由R0,R1,R2,R3四个寄存器进行传递;若形参个数大于4,大于4的部分必须通过堆栈进行传递,则效率降低。

十九、函数名与返回值类型在语义上不可冲突。

char c;
c = getchar();
if(EOF == c)
{}

按照getchar 名字的意思,应该将变量c 定义为char 类型。但是很不幸,getchar 函数的返回值却是int 类型,其原型为:
int getchar(void);
由于c 是char 类型的,取值范围是[-128,127],如果宏EOF 的值在char 的取值范围之外,EOF 的值将无法全部保存到c 内,会发生截断,将EOF 值的低8 位保存到c 里。这样if 语句有可能总是失败。这种潜在的危险,如果不是犯过一次错,肯怕很难发现。

二十、递归的效率很低,递归的深度太大甚至可能出现错误(比如栈溢出)。所以,平时写代码,不到万不得已,尽量不要用递归。即便是要用递归,也要注意递归的层次不要太深,防止出现栈溢出的错误;同时递归的停止条件一定要正确,否则,递归可能没完没了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值