第六章:函數
函數應該簡(jiǎn)短而漂亮,并且只完成一件事情。函數應該可以一屏或者兩屏顯示完(我們都知道ISO/ANSI屏幕大小是80x24),只做一件事情,而且把它做好。
一個(gè)函數的最大長(cháng)度是和該函數的復雜度和縮進(jìn)級數成反比的。所以,如果你有一個(gè)理論上很簡(jiǎn)單的只有一個(gè)很長(cháng)(但是簡(jiǎn)單)的case語(yǔ)句的函數,而且你需要在每個(gè)case里做很多很小的事情,這樣的函數盡管很長(cháng),但也是可以的。
不過(guò),如果你有一個(gè)復雜的函數,而且你懷疑一個(gè)天分不是很高的高中一年級學(xué)生可能甚至搞不清楚這個(gè)函數的目的,你應該更嚴格的遵守最大限制。使用輔助函數,并為之取個(gè)具描述性的名字(如果你覺(jué)得其對性能要求嚴格的話(huà),你可以要求編譯器將它們內聯(lián)展開(kāi),它往往會(huì )比你更好的完成任務(wù)。)
函數的另外一個(gè)衡量標準是本地變量的數量。此數量不應超過(guò)5-10個(gè),否則你的函數就有問(wèn)題了。重新考慮一下你的函數,把它分拆成更小的函數。人的大腦一般可以輕松的同時(shí)跟蹤7個(gè)不同的事物,如果再增多的話(huà),就會(huì )糊涂了。即便你聰穎過(guò)人,你也可能會(huì )記不清你2個(gè)星期前做過(guò)的事情。
在源文件里,使用空行隔開(kāi)不同的函數。如果該函數需要被導出,它的EXPORT*宏應該緊貼在它的結束大括號之下。比如:
int system_is_up(void)
{
return system_state == SYSTEM_RUNNING;
}
EXPORT_SYMBOL(system_is_up);
在函數原型中,包含函數名和它們的數據類(lèi)型。雖然C語(yǔ)言里沒(méi)有這樣的要求,在Linux里這是提倡的做法,因為這樣可以很簡(jiǎn)單的給讀者提供更多的有價(jià)值的信息。
第七章:集中的函數退出途徑
雖然被某些人聲稱(chēng)已經(jīng)過(guò)時(shí),但是goto語(yǔ)句的等價(jià)物還是經(jīng)常被編譯器所使用,具體形式是無(wú)條件跳轉指令。當一個(gè)函數從多個(gè)位置退出并且需要做一些通用的清潔工作的時(shí)候,goto的好處就顯現出來(lái)了。
理由是:
- 無(wú)條件語(yǔ)句容易理解和跟蹤
- 嵌套程度減小
- 可以避免由于修改時(shí)忘記更新某個(gè)單獨的退出點(diǎn)而導致的錯誤
- 減輕了編譯器的工作,無(wú)需刪除冗余代碼;)
int fun(int a)
{
int result = 0;
char *buffer = kmalloc(SIZE);
if (buffer == NULL)
return -ENOMEM;
if (condition1) {
while (loop1) {
...
}
result = 1;
goto out;
}
...
out:
kfree(buffer);
return result;
}