- 函数应该是一个独立的功能模块;
- 函数名要一定程度反映函数功能;
- 函数参数名要体现参数的意义;
- 尽量避免在函数中使用全局变量;
- 当函数参数不应该在函数体内被修改时,应加上const声明;
- 如果参数是指针,且仅作输入参数时,应加上const声明;
- 不能省略返回值类型,无返回类型应声明为void;
- 函数需对参数进行有效性检查;
- 不要返回指向“栈内存”的指针,“栈内存”在函数体结束时会被释放:
char * get_money() {
char m[] = "126.3"; // char m[5] = "126.3",也同样
// m是在栈上被创建的,并用字符串常量初始化
return m; // m指向的内存单元被释放
}
char * get_data() {
char *d = "hello"; // 字符串常量存放在静态数据存储区
printf("++p: %p\n",d);
printf("++p: %p\n", &"hello");
return d; // 返回字符串常量的地址,虽然d是栈上定义的,
// 它指向的是字符串常量的地址,不会被释放
}
/* 指向栈的指针 */
printf("get_money %s\n", get_money());
printf("get_data %s ,p: %p \n", get_data(),get_data());
输出
get_money 烫烫跟鄾
++p: 00007FF756519C18
++p: 00007FF756519C18
++p: 00007FF756519C18
++p: 00007FF756519C18
get_data hello ,p: 00007FF756519C18
- 函数规模要小,控制在80行内;
- 相同的输入对应相同的输出,避免函数带有记忆功能(避免在函数中使用全局);
- 避免函数有过多的参数,参数个数控制在4个以内,如有需要使用结构体替换;
- 函数名与返回值类型在语义上不可冲突 :
char a = getchar(); // getchar返回值为int
- 有时函数不需要返回值,但为了增加灵活性,如链式表达,可增加返回值:
char s[64];
int len = strlen(strcpy(s, "hello word"));