函式堆疊:
函式呼叫是通過堆疊來完成,堆疊裡儲存函式執行時的資訊。但是函式堆疊是在呼叫到他的時候才動態在預先分配好的記憶體空間上建立的。
函式堆疊的3個用途:在進入函式前儲存環境變數和返回位址,在進入函式時儲存實參的拷貝,在函式體內儲存區域性變數。
函式呼叫規範:
函式呼叫規範即呼叫約定。規範決定了函式呼叫的實參壓棧,退棧以及堆疊釋放的方式。windows環境下常用的呼叫規範有 __cdecl,__stdcall,_thiscall,__fastcall.函式呼叫與其實現的呼叫規範應該一致.
函式連線規範:
引數傳遞規範:
技巧1:引數名不要空著,因為標準c把空的引數列表解釋為可以接收任何型別和個數的引數。
技巧2:引數名要恰當,一般而言輸出引數在前,輸入引數在後,並且不要交叉出現輸入輸出函式。
技巧3:如果引數是指標,且僅作輸入作用,則應在型別前加const,以防止指標指向的記憶體單元在函式體內無意中被修改。
建議1:避免函式引數的個數太多,盡量控制在5個以內,太多了順序會亂,若引數太多,可以將引數包裝,以位址的方式傳遞。
建議2:盡量不要使用型別和書目不確定的引數列表。c標準庫函式printf是採用不確定型別和引數的典型代表。
int printf(const char *format[,argument]...) ;
這種風格在編譯時喪失了嚴格的靜態型別安全檢查。
返回值的的規則:
技巧1:不要省略返回值的型別,因為標準c,凡是不宣告型別都預設為int.
建議1:函式名字與返回值型別在語義上不衝突。
函式內部實現的規則:
在函式入口處和出口處從嚴把關。
規則1:在函式入口處使用斷言檢測引數。
規則2:在函式出口處對return語句的正確性的有效性進行檢查。
(1):return無法返回指向」堆疊記憶體「的指標,因為函式結束後就自動釋放了。如區域性變數的位址。
(2):要搞清楚返回的究竟是」物件的值「,物件的」指標「,還是」物件的引用「。
(3):返回的型別與接收的型別要一致。
建議1:函式的功能要單一,即乙個函式完成一件事情,不要設計多用途的函式。函式體的規模盡量保持在50行以內。
建議2:盡量少使用帶記憶功能的函式,如static.
儲存型別和作用域規則:
全域性變數預設為static,除非在定義了它的編譯單元之外顯示的使用了extern,否則不能被訪問。
還有一種儲存型別,叫」自由儲存(或堆儲存)「,由使用者顯示的分配和釋放。他的生存週期在分配和釋放間的一段時間。
區域性變數的作用域具有程式塊作用域(由{}決定)。
連線型別:外連線,內連線以及無連線。
高質量C C 程式設計之函式設計
函式介面的兩大要素是引數和返回值。c語言中,函式的引數和返回值的傳遞方式有兩種值傳遞pass by value和指標傳遞pass by pointer。c 中,更多採用的是引用傳遞pass by reference。引用傳遞性質像指標傳遞,但使用方式更像值傳遞。1.引數的規則 規則1 引數的書寫要完...
高質量程式設計C C
一 請填寫bool float,指標變數與 零值 比較的 if 語句。10 分 請寫出 bool flag 與 零值 比較的 if 語句。3 分 標準答案 if flag if flag 如下寫法均屬不良風格,不得分。if flag true if flag 1 if flag false if f...
高質量c c 程式設計
第1章 為防止標頭檔案被重複引用,應當用 ifndef define endif 結構產生預處理塊 使用 include引用標準庫標頭檔案,使用 include filename.h 引用非標準庫標頭檔案 標頭檔案中只存放 宣告 不存放 定義 第2章 應在關聯性不強的語句間新增空行 一行 只做一件事...