C语言~函数设计原则

  • 函数应该是一个独立的功能模块;
  • 函数名要一定程度反映函数功能;
  • 函数参数名要体现参数的意义;
  • 尽量避免在函数中使用全局变量;
  • 当函数参数不应该在函数体内被修改时,应加上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"));

你可能感兴趣的:(#,C/C++,编程语言)