C C 中函式設計的若干問題

2021-04-01 08:01:39 字數 1664 閱讀 2562

1.函式介面的兩個要素是引數和返回值。c語言中,函式的引數和返回值的傳遞方式有兩種:值傳遞(pass by value)和指標傳遞(pass by pointer)。c++ 語言中多了引用傳遞(pass by reference)。由於引用傳遞的性質象指標傳遞,而使用方式卻象值傳遞,初學者常常迷惑不解,容易引起混亂,

2.引數規則:

1)如果引數是指標,且僅作輸入用,則應在型別前加const,以防止函式體內改動該指標指向的內容。(原文:以防止該指標在函式體內被意外修改。)

eg.

#include

#include

#include

void stringcpy(char *to,const char *from) //使用時保證from小於to指向的記憶體塊

*to=0;

} void main()

2)如果輸入引數以值傳遞的方式傳遞物件,則宜改用「const &」方式來傳遞,這樣可以省去臨時物件的構造和析構過程,從而提高效率。

3.返回值規則:

1)不要將正常值和錯誤標誌混在一起返回。正常值用輸出引數獲得,而錯誤標誌用return語句返回。( 注:在c的庫函式中有許多函式沒有按此規則,使用不便)

4.內部實現規則

1)在函式體的「入口處」,對引數的有效性進行檢查。

2)在函式體的「出口處」,對return語句的正確性和效率進行檢查。

如:a)return語句不可返回指向「棧記憶體」的「指標」或者「引用」,因為該內存在函式體結束時被自動銷毀。

b)如果函式返回值是乙個物件,要考慮return語句的效率。

5.使用斷言:程式一般分為debug版本和release版本,debug版本用於內部除錯,release 版本發行給使用者使用。斷言assert是僅在debug版本起作用的巨集,它用於檢查「不應該 」發生的情況。

1)使用斷言捕捉不應該發生的非法情況。不要混淆非法情況與錯誤情況之間的區別,後者是必然存在的並且是一定要作出處理的。

2)在函式的入口處,使用斷言檢查引數的有效性(合法性)。

3)在編寫函式時,要進行反覆的考查,並且自問:「我打算做哪些假定?」一旦確定了的假定,就要使用斷言對假定進行檢查。

6.引用與指標的比較(引用的主要功能是傳遞函式的引數和返回值。)

1)引用被建立的同時必須被初始化(指標則可以在任何時候被初始化)。

2)不能有null引用,引用必須與合法的儲存單元關聯(指標則可以是null)。

3)一旦引用被初始化,就不能改變引用的關係(指標則可以隨時改變所指的物件)。

4)如果的確只需要借用一下某個物件的「別名」,那麼就用「引用」,而不要用「指標」,以免發生意外。比如說,某人需要乙份證明,本來在檔案上蓋上公章的印子就行了,如果把取公章的鑰匙交給他,那麼他就獲得了不該有的權利。

7.其他經驗:

1)函式的功能要單一,不要設計多用途的函式。

2)函式體的規模要小,盡量控制在50行**之內。

3)盡量避免函式帶有「記憶」功能。相同的輸入應當產生相同的輸出。

帶有「記憶」功能的函式,其行為可能是不可**的,因為它的行為可能取決於某種「記憶狀態」。這樣的函式既不易理解又不利於測試和維護。在c/c++語言中,函式的static區域性變數是函式的「記憶」儲存器。建議盡量少用static區域性變數,除非必需。

(學習林銳《高質量c++程式設計》筆記)2005/07/20

CPU 設計的若干問題

1.處理器的應用領域?通訊領域 乙太網協議,hdlc,ppp 等常用協議的電路設計 工業控制領域 消費領域 手機 印表機 桌面 運算效能 及伺服器領域 可靠性,可服務性 2.處理器的端模式?endian 表示資料在儲存器中的存放順序 little endian little end first 符合...

xFire使用中的若干問題

1 通過xfire自動生成的client相關 在建立jaxbelement引數時,qname必須寫正確。比如 string qname 這個qname的取值,要參考自動生成的客戶端merchant物件的屬性,在自動生成的merchant物件中是這樣申明的 xmlelementref name cod...

MySQL 查詢中遇到的若干問題

mysql中查詢欄位為null或者不為null 在mysql中,查詢某字段為空時,不可用 null,而是 is null,不為空則是 is not null select from table where column isnull select from table where column is...