2三、static的使用
————————
static關鍵字,表示了「靜態」,通常來講,他會被常常用於變量和函數。一個static的變量,其實就是全局變量,只不過他是有做用域的全局變量。好比一個函數中的static變量:
char*
getConsumerName()
{
static int cnt = 0;
....
cnt++;
....
}
cnt變量的值會跟隨着函數的調用次而遞增,函數退出後,cnt的值還存在,只是cnt只能在函數中才能被訪問。而cnt的內存也只會在函數第一次被調用時纔會被分配和初始化,之後每次進入函數,都不爲static分配了,而直接使用上一次的值。
對於一些被常常調用的函數內的常量,最好也聲明成static(參見第12條)
但static的最多的用處卻不在這裏,其最大的做用的控制訪問,在C中若是一個函數或是一個全局變量被聲明爲static,那麼,這個函數和這個全局變量,將只能在這個C文件中被訪問,若是別的C文件中調用這個C文件中的函數,或是使用其中的全局(用extern關鍵字),將會發生連接時錯誤。這個特性能夠用於數據和程序保密。
2四、函數中的代碼尺寸
——————————
一個函數完成一個具體的功能,通常來講,一個函數中的代碼最好不要超過600行左右,越少越好,最好的函數通常在100行之內,300行左右的孫函數就差很少了。有證據代表,一個函數中的代碼若是超過500行,就會有和別的函數相同或是相近的代碼,也就是說,就能夠再寫另外一個函數。
另外,函數通常是完成一個特定的功能,千萬忌諱在一個函數中作許多件不一樣的事。函數的功能越單一越好,一方面有利於函數的易讀性,另外一方面更有利於代碼的維護和重用,功能越單一表示這個函數就越可能給更多的程序提供服務,也就是說共性就越多。
雖然函數的調用會有必定的開銷,但比起軟件後期維護來講,增長一些運行時的開銷而換來更好的可維護性和代碼重用性,是很值得的一件事。
2五、typedef的使用
—————————
typedef是一個給類型起別名的關鍵字。不要小看了它,它對於你代碼的維護會有很好的做用。好比C中沒有bool,因而在一個軟件中,一些程序員使用int,一些程序員使用short,會比較混亂,最好就是用一個typedef來定義,如:
typedef char bool;
通常來講,一個C的工程中必定要作一些這方面的工做,由於你會涉及到跨平臺,不一樣的平臺會有不一樣的字長,因此利用預編譯和typedef可讓你最有效的維護你的代碼,以下所示:
#ifdef SOLARIS2_5
typedef boolean_t BOOL_T;
#else
typedef int BOOL_T;
#endif
typedef short INT16_T;
typedef unsigned short UINT16_T;
typedef int INT32_T;
typedef unsigned int UINT32_T;
#ifdef WIN32
typedef _int64 INT64_T;
#else
typedef long long INT64_T;
#endif
typedef float FLOAT32_T;
typedef char* STRING_T;
typedef unsigned char BYTE_T;
typedef time_t TIME_T;
typedef INT32_T PID_T;
使用typedef的其它規範是,在結構和函數指針時,也最好用typedef,這也有利於程序的易讀和可維護性。如:
typedef struct _hostinfo {
HOSTID_T host;
INT32_T hostId;
STRING_T hostType;
STRING_T hostModel;
FLOAT32_T cpuFactor;
INT32_T numCPUs;
INT32_T nDisks;
INT32_T memory;
INT32_T swap;
} HostInfo;
typedef INT32_T (*RsrcReqHandler)(
void *info,
JobArray *jobs,
AllocInfo *allocInfo,
AllocList *allocList);
C++中這樣也是很讓人易讀的:
typedef CArray<HostInfo, HostInfo&> HostInfoArray;
因而,當咱們用其定義變量時,會顯得十分易讀。如:
HostInfo* phinfo;
RsrcReqHandler* pRsrcHand;
這種方式的易讀性,在函數的參數中十分明顯。
關鍵是在程序種使用typedef後,幾乎全部的程序中的類型聲明都顯得那麼簡潔和清淅,並且易於維護,這纔是typedef的關鍵。
2六、爲常量聲明宏
————————
最好不要在程序中出現數字式的「硬編碼」,如:
int user[120];
爲這個120聲明一個宏吧。爲全部出如今程序中的這樣的常量都聲明一個宏吧。好比TimeOut的時間,最大的用戶數量,還有其它,只要是常量就應該聲明成宏。若是,忽然在程序中出現下面一段代碼,
for ( i=0; i<120; i++){
....
}
120是什麼?爲何會是120?這種「硬編碼」不只讓程序很讀,並且也讓程序很很差維護,若是要改變這個數字,得同時對全部程序中這個120都要作修改,這對修改程序的人來講是一個很大的痛苦。因此仍是把常量聲明成宏,這樣,一改百改,並且也很利於程序閱讀。
#define MAX_USR_CNT 120
for ( i=0; i<MAX_USER_CNT; i++){
....
}
這樣就很容易瞭解這段程序的意圖了。
有的程序員喜歡爲這種變量聲明全局變量,其實,全局變量應該儘可能的少用,全局變量不利於封裝,也不利於維護,並且對程序執行空間有必定的開銷,一不當心就形成系統換頁,形成程序執行速度效率等問題。因此聲明成宏,便可以避免去全局變量的開銷,也會有速度上的優點。
2七、不要爲宏定義加分號
———————————
有許多程序員不知道在宏定義時是否要加分號,有時,他們覺得宏是一條語句,應該要加分號,這就錯了。當你知道了宏的原理,你會贊同我爲會麼不要爲宏定義加分號的。看一個例子:
#define MAXNUM 1024;
這是一個有分號的宏,若是咱們這樣使用:
half = MAXNUM/2;
if ( num < MAXNUM )
等等,都會形成程序的編譯錯誤,由於,當宏展開後,他會是這個樣子的:
half = 1024;/2;
if ( num < 1024; )
是的,分號也被展進去了,因此形成了程序的錯誤。請相信我,有時候,一個分號會讓你的程序出現成百個錯誤。因此仍是不要爲宏加最後一個分號,哪怕是這樣:
#define LINE "================================="
#define PRINT_LINE printf(LINE)
#define PRINT_NLINE(n) while ( n-- >0 ) { PRINT_LINE; }
都不要在最後加上分號,當咱們在程序中使用時,爲之加上分號,
main()
{
char *p = LINE;
PRINT_LINE;
}
這一點很是符合習慣,並且,若是忘加了分號,編譯器給出的錯誤提示,也會讓咱們很容易看懂的。