C語言程式設計心得

2021-05-22 11:33:12 字數 3443 閱讀 2685

一、.h檔案與.c檔案的關係:

迄今為止,寫過的

程式都是一些很簡單的程式,從來沒有想到要自己寫.h檔案,也不知道.h檔案到底什麼用,與.c檔案什麼關係。只是最近寫鍵盤程式,參考別人的程式時,發現別人寫的嚴格的程式都帶有乙個「key.h」,裡面定義了.c檔案裡用到的自己寫的函式,如keyhit()、keyscan()等。

經過查詢資料得知,.h檔案就是標頭檔案,估計就是head的意思吧,這是規範程式結構化

設計的需要,既可以實現大型程式的模組化,又可以實現根各模組的連線除錯。

1、.h檔案介紹: 在

微控制器c

程式設計中,專案一般按功能模組化進行結構化設計。將乙個專案劃分為多個功能,每個功能的相關程式放在乙個c程式文件中,稱之為乙個模組,對應的檔名即為模組名。乙個模組通常由兩個文件組成,乙個為標頭檔案*.h,對模組中的資料結構和函式原型進行描述;另乙個則為c檔案*.c ,對資料例項或物件定義,以及函式演算法具體實現。

2、.h檔案的作用

作為專案設計,除了對專案總體功能進行詳細描述外,就是對每個模組進行詳細定義,也就是給出所有模組的標頭檔案。通常h標頭檔案要定義模組中各函式的功能,以及輸入和輸出引數的要求。模組的具體實現,由專案組成根據h檔案進行設計、程式設計、除錯完成。為了保密和安全,模組實現後以可連線檔案obj、或庫檔案lib的方式提供給專案其他成員使用。由於不用提供源程式文件,一方面可以公

開發行,保證開發人員的所有權;另一方面可以防止別人有意或無意修改產生非一致性,造成版本混亂。所以h標頭檔案是專案的詳細設計和團隊工作劃分的依據,也是對模組進行測試的功能說明。要引用模組內的資料或演算法,只要用包含include指定模組h標頭檔案即可。

3、.h檔案的基本組成

/*如下為鍵盤驅動的頭文件*/

#ifndef _key_h_ //防重複引用,如果沒有定義過_key_h_,則

編譯下句

#define _key_h_ //此符號唯一, 表示只要引用過一次,即#i nclude,則定義符號_key_h_ /

char keyhit( void );    //擊鍵否

unsigned char keyscan( void ); //取鍵值 /

#endif

二、盡量使用巨集定義#define

開始看別人的程式時,發現程式開頭,在檔案包含後面有很多#define語句,當時就想,搞這麼多標示符替換來替換去的,麻不麻煩啊,完全沒有理解這種寫法的好處。原來,用乙個標示符表示常數,有利於以後的修改和維護,修改時只要在程式開頭改一下,程式中所有用到的地方就全部修改,節省時間。

#define keynum 65//按鍵數量,用於keycode[keynum]

#define linenum 8//鍵盤行數

#define rownum 8//鍵盤列數

注意的地方:

1、巨集名一般用大寫

2、巨集定義不是c語句,結尾不加分號

三、不要亂定義變數型別

以前寫程式,當需要乙個新的變數時,不管函式內還是函式外的,直接在程式開頭定義,雖然不是原則上的錯誤,但是很不可取的作法。

下面說一下,

c語言中變數型別的有關概念:

從變數的作用範圍來分,分為區域性變數和全域性變數:

1、全域性變數:是在函式外定義的變數,像我以前定義在程式開頭的變數都是全域性變數,這裡我就犯了乙個大忌,使用了過多的全域性變數。

帶來的問題有兩個:一是,全域性變數在程式全部執行過程中都占用資源;二是,全域性變數過多使程式的通用性變差,因為全域性變數是模組間耦合的原因之一。

2、區域性變數:在函式內部定義的變數,只在函式內部有效。

從變數的變數值存在的時間分為兩種:

1、靜態儲存變數:程式執行期間分配固定的儲存空間。

2、動態儲存變數:程式執行期間根據需要動態地分配儲存空間。

具體又包括四種儲存方式:auto static register extern

1、區域性變數,不加說明預設為auto型,即動態儲存,如果不賦初值,將是乙個不確定的值。而將區域性變數定義為static型的話,則它的值在函式內是不變的,且初值預設為0。

static unsigned char sts;//按鍵狀態變數

static unsigned char nowkeycode;//此時的鍵碼

static unsigned char prekeycode;//上一次的鍵碼

static unsigned char keydowntime;//矩形鍵盤按下去抖時間變數

static unsigned char keyuptime;//矩形鍵盤釋放去抖時間變數

static unsigned char onoffdowntime;//關機鍵按下去抖時間變數

static unsigned char onoffuptime;//關機鍵釋放去抖時間變數

static unsigned char onoff_10ms; //判斷關機鍵中斷次數變數,累計150次大約為3s,因為前後進了兩個10ms中斷

2、全域性變數,編譯時分配為靜態儲存區,可以被本檔案中的各個函式引用。如果是多個檔案的話,如果在乙個檔案中引用另外檔案中的變數,在此檔案中要用extern說明。不過如果乙個全域性變數定義為static的話,就只能在此乙個檔案中使用。

四、特殊關鍵字const volatile的使用

1、const

const用於宣告乙個唯讀的變數

const unsigned char a=1;//定義a=1,編譯器不允許修改a的值

作用:保護不希望被修改的引數

const unsigned char key_code[keynum]=;//鍵碼

const unsigned char line_out[linenum]=;//行輸出編碼

const unsigned char row_in[rownum]=;//列輸入編碼

2、volatile

乙個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。

static int i=0;

int main(void)

} /* interrupt service routine. */

void isr_2(void)

程式的本意是希望isr_2中斷產生時,在main當中呼叫dosomething函式,但是,由於編譯器判斷在main函式裡面沒有修改過i,因此可能只執行一次對從i到某暫存器的讀操作,然後每次if判斷都只使用這個暫存器裡面的「i副本」,導致dosomething永遠也不會被呼叫。如果將將變數加上volatile修飾,則編譯器保證對此變數的讀寫操作都不會被優化(肯定執行)。

一般說來,volatile用在如下的幾個地方:

1、中斷服務程式中修改的供其它程式檢測的變數需要加volatile;

2、多工環境下各任務間共享的標誌應該加volatile;

3、儲存器對映的

硬體暫存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義;

C語言程式設計心得(一)

1 用了if一定要注意else的情況。2 有問題的時候要注意兩個相近功能函式是否呼叫錯誤。3 相除的形式,如果分母 階乘 會越界,就用除法,約去分子分母的公約數。4 c語言沒有bool型別 在加入特殊庫之前 5 不要複製類似的 6 gets pointer 函式不會把空格作為輸入結束的標誌。7 陣列...

初期C語言程式設計心得

現在可以說是第二次學c語言了吧,之前在學校的課程基本咩怎麼學過c語言,抱著一副得過且過的態度去學習,現在大二快結束了,為自己的將來考慮,重新開始學習程式設計!剛開始必須去掌握c語言中的那些變數 關鍵字 識別符號 運算子 運算子優先順序等等,這些比較簡單,只要記住就行。然後就是輸入輸出語句,剛開始的東...

C語言程式設計學習心得

一,思維導圖 二,語法認識 1,if else的用法 if 條件一 else 問題 else與if的匹配關係不明確,導致程式異常。解決方法 牢記else與離其最近的乙個if配對,不與其他的if連用,並規範 書寫格式,使其看起來跟加清晰明了。2,while語句的用法 while 迴圈條件 注意事項 w...