C语言容易被忽视的函数设计原则是什么
这篇文章主要介绍了C语言容易被忽视的函数设计原则是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言容易被忽视的函数设计原则是什么文章都会有所收获,下面我们一起来看看吧。
函数设计原则
函数从意义上应该是一个独立的功能模块
函数名要在一定程度上反映函数的功能
函数参数名要能够体现参数的意义
尽量避免在函数中使用全局变量
当函数参数不应该在函数体内部被修改时,应加上 const 声明
如果参数是指针,且仅作输入参数,则应加上 const 声明,如下:
不能省略返回值的类型
如果函数没有返回值,那么应声明为 void
类型对参数进行有效性检查
对于指针参数的检查尤为重要
不要返回指向“栈内存”的指针
栈内存在函数体结束时被自动释放
函数体的规模要小,尽量控制在 80 行代码之内
相同的输入对应相同的输出,避免函数带有“记忆”功能
避免函数有过多的参数,参数个数尽量控制在 4 个以内
有时候函数不需要返回值,但为了增加灵活性,如支持链式表达,可以附加返回值
函数名与返回值类型在语义上不可冲突
下面来欣赏一份优秀的代码:
#include "eclipseOS.h"#include "eclipseCommon.h"#include "eclipseUtil.h"#include <string.h>#include <stdlib.h>#include <stdio.h>#include <sys/stat.h>#ifdef _WIN32#include <direct.h>#else#include <unistd.h>#include <strings.h>#endif#define MAX_LINE_LENGTH 256int isJ9VM( _TCHAR* vm ){_TCHAR * ch = NULL, *ch3 = NULL;int res = 0;if (vm == NULL)return 0;ch = lastDirSeparator( vm );if (isVMLibrary(vm)) {if(ch == NULL)return 0;ch[0] = 0;ch3 = lastDirSeparator(vm);if(ch3 != NULL) {res = (_tcsicmp(ch3 + 1, _T_ECLIPSE("j9vm")) == 0);}ch[0] = dirSeparator;return res;} else {if (ch == NULL) ch = vm;else ch++;return (_tcsicmp( ch, _T_ECLIPSE("j9") ) == 0);}}int checkProvidedVMType( _TCHAR* vm ) {_TCHAR* ch = NULL;struct _stat stats;if (vm == NULL) return VM_NOTHING;if (_tstat(vm, &stats) == 0 && (stats.st_mode & S_IFDIR) != 0) {return VM_DIRECTORY;}ch = _tcclass="lazy" data-srchr( vm, _T_ECLIPSE('.') );if(ch == NULL)return VM_OTHER;#ifdef _WIN32if (_tcsicmp(ch, _T_ECLIPSE(".dll")) == 0)#elseif ((_tcsicmp(ch, _T_ECLIPSE(".so")) == 0) || (_tcsicmp(ch, _T_ECLIPSE(".jnilib")) == 0) || (_tcsicmp(ch, _T_ECLIPSE(".dylib")) == 0))#endif{return VM_LIBRARY;}if (_tcsicmp(ch, _T_ECLIPSE(".ee")) == 0)return VM_EE_PROPS;return VM_OTHER;}_TCHAR * checkPathList( _TCHAR* pathList, _TCHAR* programDir, int reverseOrder) {_TCHAR * c1, *c2;_TCHAR * checked, *result;size_t checkedLength = 0, resultLength = 0;size_t bufferLength = _tcslen(pathList);result = malloc(bufferLength * sizeof(_TCHAR));c1 = pathList; while (c1 != NULL && *c1 != _T_ECLIPSE('\0')) { c2 = _tcschr(c1, pathSeparator);if (c2 != NULL)*c2 = 0;checked = checkPath(c1, programDir, reverseOrder);checkedLength = _tcslen(checked);if (resultLength + checkedLength + 1> bufferLength) {bufferLength += checkedLength + 1;result = realloc(result, bufferLength * sizeof(_TCHAR));}if(resultLength > 0) {result[resultLength++] = pathSeparator;result[resultLength] = _T_ECLIPSE('\0');}_tcscpy(result + resultLength, checked);resultLength += checkedLength;if(checked != c1)free(checked);if(c2 != NULL)*(c2++) = pathSeparator;c1 = c2;} return result;}_TCHAR * concatStrings(_TCHAR**strs) {return concatPaths(strs, 0);}_TCHAR * concatPaths(_TCHAR** strs, _TCHAR separator) {_TCHAR separatorString[] = { separator, 0 };_TCHAR * result;int i = -1;size_t length = 0;while (strs[++i] != NULL) {length += _tcslen(strs[i]) + (separator != 0 ? 1 : 0);}result = malloc((length + 1) * sizeof(_TCHAR));result[0] = 0;i = -1;while (strs[++i] != NULL) {result = _tcscat(result, strs[i]);if (separator != 0)result = _tcscat(result, separatorString);}return result;}int containsPaths(_TCHAR * str, _TCHAR** paths) {_TCHAR * buffer;_TCHAR * c;int i;buffer = malloc((_tcslen(str) + 2) * sizeof(_TCHAR));_stprintf(buffer, _T_ECLIPSE("%s%c"), str, pathSeparator);for (i = 0; paths[i] != NULL; i++) {c = _tcsstr(buffer, paths[i]);if ( c == NULL || !(c == buffer || *(c - 1) == pathSeparator)){free(buffer);return 0;}}free(buffer);return 1;}int isVMLibrary( _TCHAR* vm ){_TCHAR *ch = NULL;if (vm == NULL) return 0;ch = _tcclass="lazy" data-srchr( vm, '.' );if(ch == NULL)return 0;#ifdef _WIN32return (_tcsicmp(ch, _T_ECLIPSE(".dll")) == 0);#elsereturn (_tcsicmp(ch, _T_ECLIPSE(".so")) == 0) || (_tcsicmp(ch, _T_ECLIPSE(".jnilib")) == 0) || (_tcsicmp(ch, _T_ECLIPSE(".dylib")) == 0);#endif}#ifdef AIX#include <sys/types.h>#include <time.h>char* getVMVersion( char *vmPath ){ char cmd[MAX_LINE_LENGTH]; char lineString[MAX_LINE_LENGTH]; char* firstChar; char fileName[MAX_LINE_LENGTH]; time_t curTime; FILE* fp; int numChars = 0; char* version = NULL; (void) time(&curTime); (void) sprintf(fileName, "/tmp/tmp%ld.txt", curTime); (void) sprintf(cmd,"%s -version 2> %s", vmPath, fileName); (void) system(cmd); fp = fopen(fileName, "r"); if (fp != NULL) { if (fgets(lineString, MAX_LINE_LENGTH, fp) == NULL) lineString[0] = '\0'; fclose(fp); unlink(fileName); firstChar = (char *) (strchr(lineString, '"') + 1); if (firstChar != NULL) numChars = (int) (strrchr(lineString, '"') - firstChar); if (numChars > 0) { version = malloc( numChars + 1 ); strncpy(version, firstChar, numChars);version[numChars] = '\0';}} return version;} int versionCmp(char *ver1, char *ver2){ char* dot1; char* dot2; int num1; int num2; dot1 = strchr(ver1, '.'); dot2 = strchr(ver2, '.'); num1 = atoi(ver1); num2 = atoi(ver2); if (num1 > num2) return 1;if (num1 < num2)return -1;if (dot1 && !dot2) return 1; if (!dot1 && dot2) return -1; if (!dot1 && !dot2) return 0; return versionCmp((char*)(dot1 + 1), (char*)(dot2 + 1) );}#endif
关于“C语言容易被忽视的函数设计原则是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C语言容易被忽视的函数设计原则是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341