c編程規范(本人的深切體會(huì ))
c編程規范(本人的深切體會(huì ))
真要說(shuō)起來(lái),c的功能是非常強大的,可以說(shuō),匯編能實(shí)現的功能,c都能實(shí)現
除了人們正常使用的功能外,還具有如下功能
a.讀寫(xiě)寄存器
b.讀寫(xiě)端口————因此可直接讀寫(xiě)磁盤(pán)扇區,當然這會(huì )很麻煩,而且在保護模式下,應用
程序好像是無(wú)法執行這些指令的(這點(diǎn)本人記得不是很清楚)至于為什么不能執行,
這不是本文要討論的,有興趣的同仁可以看一下保護模式的文章,就明白了。
c.直接對內存尋址操做————指針可以實(shí)現這個(gè)功能,操作所有的內存空間,當然成功與否
就依賴(lài)于在什么操作系統下了,實(shí)模式下對內存訪(fǎng)問(wèn)沒(méi)有越界保護,所以你在dos下可以
讀寫(xiě)任意地址的內存,這不是本文的重點(diǎn),在此不詳細討論)
d.嵌入匯編(遇到特別講效率的代碼,嵌入匯編不失為一種好辦法)
由于c本身對很多東西都不約束,因此編寫(xiě)c時(shí)必須要有一些規范,尤其是指針的使用。
也正因為如此,很多學(xué)校在開(kāi)設第一門(mén)編程語(yǔ)言課的時(shí)候不開(kāi)c而開(kāi)pascal,不過(guò)本人還
是認為先學(xué)c好。
一。指針的規范
雖然指針提供了一切內存尋址的功能,但是正因為如此,使用的時(shí)候一定要小心。
1.指針定義的時(shí)候一定要初始化
通常情況下,初始化為NULL。
2.指針使用之前要判斷是否為空
3.使用指針指向的內存前要確認該指針指向的內存是可用的
未初始化的指針指向的內存不可用,初始化為NULL的也不可用,或者該指針指向已
定義的變量,或者你為該指針動(dòng)態(tài)分配了內存。
4.為指針動(dòng)態(tài)分配內存后一定要記著(zhù)釋放。
不然這塊內存將會(huì )丟失,本程序用不到,別的也用不了。
5.釋放內存后一定要將該指針置為空。
這是規范,雖然不是必要,但是它可以有效檢測你在釋放過(guò)后還錯誤的使用該指針。
如果操作值為NULL的指針所指向的內存,目前通常的操作系統都會(huì )產(chǎn)生出錯(這屬
于保護模式的范疇)
二。變量局部化的規范
內存單元本身沒(méi)有局部全局的區分,一塊內存在被分配后均可以使用,但是變量的
概念不同于內存的概念,正常函數內定義的變量均置在棧內(什么是棧,在此不詳
細討論),而什么時(shí)候如何為這個(gè)變量分配棧的空間,這不是我們要做的事,編譯
器幫我們完成了這件事,所以變量的生存期是編譯器為了編程的方便所規定出來(lái)的
概念,不然一段代碼亂糟糟的象匯編一樣,做程序員的豈不是大費心力。
軟件工程有一項理論,就是緊內聚,松耦合,用于這兒的概念就是變量越局部越好,
最好全局的變量一個(gè)都沒(méi)有,每個(gè)函數都只管傳入的參數和返回值。當然要是沒(méi)有任何
全局的信息,對于程序來(lái)說(shuō),可能還會(huì )造成很多不方便,也會(huì )導致函數的參數過(guò)多。所以
怎么來(lái)把握這個(gè)度,這個(gè)是程序員的經(jīng)驗問(wèn)題。
基于局部化全局化的概念,變量分為如下三種
1。函數內局部變量:函數內使用
2。文件內局部變量:文件內的所有函數均可使用
3。程序的全局變量:所有本程序的文件均可使用(同上一種比較,只是在頭文件中多了
extern的聲明)
同樣函數也存在這么幾種
1。文件內的函數
2。程序的全局函數(同上一種比較,只是在頭文件內多了該函數的原型,包含了該頭
文件的文件當然就可以使用這個(gè)函數樂(lè ))
三。項目的規范
要把程序做大,在單個(gè)文件內實(shí)現是不現實(shí)的,必須使用多個(gè)文件,然后鏈接成最終的可
執行程序。
1。每項功能對應一個(gè).c文件,而每個(gè).c文件對應一個(gè)同名的.h文件,第二個(gè).c文件想使用
第一個(gè).c文件定義的全局變量,全局函數等,必須包含第一個(gè)的.h文件,這是規范,多數人
都是這么做的,當然不這么編也沒(méi)人攔你,不過(guò)這是很多人的經(jīng)驗。
2。防止頭文件的重包含
頭文件內通常定義一些類(lèi)型、結構等,如果被包含多次,將會(huì )出現類(lèi)型重復定義的錯誤,所以
通常使用預編譯來(lái)避免這一條,形式如下:
#ifndefine _MYPROGRAM_H_
#define _MYPROGRAM_H_
/* you code */
#endif
需要在.h文件頭尾加上這么幾句話(huà)。雖然這個(gè)很簡(jiǎn)單,但是在實(shí)際生活中,我經(jīng)??吹接腥瞬?br>知道這一點(diǎn),似乎很多書(shū)上也沒(méi)有提到,所以在這兒說(shuō)明一下。
四。程序編寫(xiě)的格式規范
這也是很重要的一方面,程序代碼的好壞很重要的一方面就是易維護性。所以格式一定要標準,
讓人人都能看懂,自己也看得明白。這方面我不多說(shuō)了,大家在看源代碼的過(guò)程中很容易就能
學(xué)到。
這些都是c的基本規范,很多規范可以不遵從,但是顯然遵從了會(huì )有很多好處。不管你在什么開(kāi)發(fā)
環(huán)境下,我想這些規范都是一個(gè)初學(xué)者應當遵守的。高手咱規范不了:)。暫時(shí)只能想起來(lái)這些東西
,以后說(shuō)不定還會(huì )有一些。
此文系本人嘔心瀝血所做(


鼓勵,支持你。兄弟

由 巴豆 于 08-12-03 13:31 發(fā)表:
指針,該死的指針,可是不得不學(xué)呀

還可以阿,開(kāi)始有點(diǎn)麻煩。等入門(mén)了,就習慣,喜歡它了。。
支持你
支持一下....
個(gè)人認為在指針應用方面我還是比較自覺(jué)的。呵呵。
關(guān)于重包含的問(wèn)題還真從來(lái)沒(méi)有注意過(guò)。
支持你
支持一下~

寫(xiě)的好
我是從basic轉而學(xué)c的
對指針的體會(huì )最深
干開(kāi)始學(xué)的時(shí)候好痛苦


我也支持一下,雖然是很舊的帖子了!
指針真是個(gè)好東西呀??!
關(guān)于 "防止頭文件的重包含" 的一點(diǎn)看法!
我覺(jué)得 預編譯應該包含 頭文件,而不是代碼!
#ifndefine _HEADERFILE_H_
#define _HEADERFILE_H_
#include("headerfile.h")
....
#endif
如果說(shuō)得不正確,請指正!

指針----內存地址也。
Re: 關(guān)于 "防止頭文件的重包含" 的一點(diǎn)看法!
quote:
最初由 wangfeng_1981 發(fā)布
我覺(jué)得 預編譯應該包含 頭文件,而不是代碼!
#ifndefine _HEADERFILE_H_
#define _HEADERFILE_H_
#include("headerfile.h")
....
#endif
如果說(shuō)得不正確,請指正!
hehe!
聯(lián)系客服