您好,登錄后才能下訂單哦!
這篇文章主要介紹了C語言容易被忽視的函數(shù)設(shè)計原則是什么的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C語言容易被忽視的函數(shù)設(shè)計原則是什么文章都會有所收獲,下面我們一起來看看吧。
函數(shù)從意義上應(yīng)該是一個獨立的功能模塊
函數(shù)名要在一定程度上反映函數(shù)的功能
函數(shù)參數(shù)名要能夠體現(xiàn)參數(shù)的意義
盡量避免在函數(shù)中使用全局變量
當(dāng)函數(shù)參數(shù)不應(yīng)該在函數(shù)體內(nèi)部被修改時,應(yīng)加上 const 聲明
如果參數(shù)是指針,且僅作輸入?yún)?shù),則應(yīng)加上 const 聲明,如下:
不能省略返回值的類型
如果函數(shù)沒有返回值,那么應(yīng)聲明為 void
類型對參數(shù)進(jìn)行有效性檢查
對于指針參數(shù)的檢查尤為重要
不要返回指向“棧內(nèi)存”的指針
棧內(nèi)存在函數(shù)體結(jié)束時被自動釋放
函數(shù)體的規(guī)模要小,盡量控制在 80 行代碼之內(nèi)
相同的輸入對應(yīng)相同的輸出,避免函數(shù)帶有“記憶”功能
避免函數(shù)有過多的參數(shù),參數(shù)個數(shù)盡量控制在 4 個以內(nèi)
有時候函數(shù)不需要返回值,但為了增加靈活性,如支持鏈?zhǔn)奖磉_(dá),可以附加返回值
函數(shù)名與返回值類型在語義上不可沖突
下面來欣賞一份優(yōu)秀的代碼:
/******************************************************************************* * Copyright (c) 2000, 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * Kevin Cornell (Rational Software Corporation) *******************************************************************************/ /* Eclipse Launcher Utility Methods */ #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 256 /* Is the given VM J9 */ int isJ9VM( _TCHAR* vm ) { _TCHAR * ch = NULL, *ch3 = NULL; int res = 0; if (vm == NULL) return 0; ch = lastDirSeparator( vm ); if (isVMLibrary(vm)) { /* a library, call it j9 if the parent dir is j9vm */ 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) { /* directory */ return VM_DIRECTORY; } ch = _tcsrchr( vm, _T_ECLIPSE('.') ); if(ch == NULL) return VM_OTHER; #ifdef _WIN32 if (_tcsicmp(ch, _T_ECLIPSE(".dll")) == 0) #else if ((_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; } /* * pathList is a pathSeparator separated list of paths, run each through * checkPath and recombine the results. * New memory is always allocated for the result */ _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; /* first count how large a buffer we need */ 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; } /* * buffer contains a pathSeparator separated list of paths, check * that it contains all the paths given. Each path is expected to be * terminated with a pathSeparator character. */ int containsPaths(_TCHAR * str, _TCHAR** paths) { _TCHAR * buffer; _TCHAR * c; int i; /* terminate the string with a pathSeparator */ 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)) { /* entry not found */ free(buffer); return 0; } } free(buffer); return 1; } int isVMLibrary( _TCHAR* vm ) { _TCHAR *ch = NULL; if (vm == NULL) return 0; ch = _tcsrchr( vm, '.' ); if(ch == NULL) return 0; #ifdef _WIN32 return (_tcsicmp(ch, _T_ECLIPSE(".dll")) == 0); #else return (_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> /* Return the JVM version in the format x.x.x */ 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; /* Define a unique filename for the java output. */ (void) time(&curTime); (void) sprintf(fileName, "/tmp/tmp%ld.txt", curTime); /* Write java -version output to a temp file */ (void) sprintf(cmd,"%s -version 2> %s", vmPath, fileName); (void) system(cmd); fp = fopen(fileName, "r"); if (fp != NULL) { /* Read java -version output from a temp file */ if (fgets(lineString, MAX_LINE_LENGTH, fp) == NULL) lineString[0] = '\0'; fclose(fp); unlink(fileName); /* Extract version number */ firstChar = (char *) (strchr(lineString, '"') + 1); if (firstChar != NULL) numChars = (int) (strrchr(lineString, '"') - firstChar); /* Allocate a buffer and copy the version string into it. */ if (numChars > 0) { version = malloc( numChars + 1 ); strncpy(version, firstChar, numChars); version[numChars] = '\0'; } } return version; } /* Compare JVM Versions of the form "x.x.x..." * * Returns -1 if ver1 < ver2 * Returns 0 if ver1 = ver2 * Returns 1 if ver1 > ver2 */ 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) /* x.y > x */ return 1; if (!dot1 && dot2) /* x < x.y */ return -1; if (!dot1 && !dot2) /* x == x */ return 0; return versionCmp((char*)(dot1 + 1), (char*)(dot2 + 1) ); } #endif /* AIX */
關(guān)于“C語言容易被忽視的函數(shù)設(shè)計原則是什么”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“C語言容易被忽視的函數(shù)設(shè)計原則是什么”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。