由 onis_man 于 08-11-03 02:22 發(fā)表:
c編程規(guī)范(本人的深切體會(huì))
c編程規(guī)范(本人的深切體會(huì))
真要說(shuō)起來(lái),c的功能是非常強(qiáng)大的,可以說(shuō),匯編能實(shí)現(xiàn)的功能,c都能實(shí)現(xiàn) 除了人們正常使用的功能外,還具有如下功能
a.讀寫(xiě)寄存器 b.讀寫(xiě)端口————因此可直接讀寫(xiě)磁盤(pán)扇區(qū),當(dāng)然這會(huì)很麻煩,而且在保護(hù)模式下,應(yīng)用 程序好像是無(wú)法執(zhí)行這些指令的(這點(diǎn)本人記得不是很清楚)至于為什么不能執(zhí)行, 這不是本文要討論的,有興趣的同仁可以看一下保護(hù)模式的文章,就明白了。 c.直接對(duì)內(nèi)存尋址操做————指針可以實(shí)現(xiàn)這個(gè)功能,操作所有的內(nèi)存空間,當(dāng)然成功與否 就依賴(lài)于在什么操作系統(tǒng)下了,實(shí)模式下對(duì)內(nèi)存訪(fǎng)問(wèn)沒(méi)有越界保護(hù),所以你在dos下可以 讀寫(xiě)任意地址的內(nèi)存,這不是本文的重點(diǎn),在此不詳細(xì)討論) d.嵌入?yún)R編(遇到特別講效率的代碼,嵌入?yún)R編不失為一種好辦法)
由于c本身對(duì)很多東西都不約束,因此編寫(xiě)c時(shí)必須要有一些規(guī)范,尤其是指針的使用。 也正因?yàn)槿绱?,很多學(xué)校在開(kāi)設(shè)第一門(mén)編程語(yǔ)言課的時(shí)候不開(kāi)c而開(kāi)pascal,不過(guò)本人還 是認(rèn)為先學(xué)c好。
一。指針的規(guī)范 雖然指針提供了一切內(nèi)存尋址的功能,但是正因?yàn)槿绱?,使用的時(shí)候一定要小心。 1.指針定義的時(shí)候一定要初始化 通常情況下,初始化為NULL。 2.指針使用之前要判斷是否為空 3.使用指針指向的內(nèi)存前要確認(rèn)該指針指向的內(nèi)存是可用的 未初始化的指針指向的內(nèi)存不可用,初始化為NULL的也不可用,或者該指針指向已 定義的變量,或者你為該指針動(dòng)態(tài)分配了內(nèi)存。 4.為指針動(dòng)態(tài)分配內(nèi)存后一定要記著釋放。 不然這塊內(nèi)存將會(huì)丟失,本程序用不到,別的也用不了。 5.釋放內(nèi)存后一定要將該指針置為空。 這是規(guī)范,雖然不是必要,但是它可以有效檢測(cè)你在釋放過(guò)后還錯(cuò)誤的使用該指針。 如果操作值為NULL的指針?biāo)赶虻膬?nèi)存,目前通常的操作系統(tǒng)都會(huì)產(chǎn)生出錯(cuò)(這屬 于保護(hù)模式的范疇)
二。變量局部化的規(guī)范 內(nèi)存單元本身沒(méi)有局部全局的區(qū)分,一塊內(nèi)存在被分配后均可以使用,但是變量的 概念不同于內(nèi)存的概念,正常函數(shù)內(nèi)定義的變量均置在棧內(nèi)(什么是棧,在此不詳 細(xì)討論),而什么時(shí)候如何為這個(gè)變量分配棧的空間,這不是我們要做的事,編譯 器幫我們完成了這件事,所以變量的生存期是編譯器為了編程的方便所規(guī)定出來(lái)的 概念,不然一段代碼亂糟糟的象匯編一樣,做程序員的豈不是大費(fèi)心力。
軟件工程有一項(xiàng)理論,就是緊內(nèi)聚,松耦合,用于這兒的概念就是變量越局部越好, 最好全局的變量一個(gè)都沒(méi)有,每個(gè)函數(shù)都只管傳入的參數(shù)和返回值。當(dāng)然要是沒(méi)有任何 全局的信息,對(duì)于程序來(lái)說(shuō),可能還會(huì)造成很多不方便,也會(huì)導(dǎo)致函數(shù)的參數(shù)過(guò)多。所以 怎么來(lái)把握這個(gè)度,這個(gè)是程序員的經(jīng)驗(yàn)問(wèn)題。
基于局部化全局化的概念,變量分為如下三種 1。函數(shù)內(nèi)局部變量:函數(shù)內(nèi)使用 2。文件內(nèi)局部變量:文件內(nèi)的所有函數(shù)均可使用 3。程序的全局變量:所有本程序的文件均可使用(同上一種比較,只是在頭文件中多了 extern的聲明) 同樣函數(shù)也存在這么幾種 1。文件內(nèi)的函數(shù) 2。程序的全局函數(shù)(同上一種比較,只是在頭文件內(nèi)多了該函數(shù)的原型,包含了該頭 文件的文件當(dāng)然就可以使用這個(gè)函數(shù)樂(lè))
三。項(xiàng)目的規(guī)范 要把程序做大,在單個(gè)文件內(nèi)實(shí)現(xiàn)是不現(xiàn)實(shí)的,必須使用多個(gè)文件,然后鏈接成最終的可 執(zhí)行程序。 1。每項(xiàng)功能對(duì)應(yīng)一個(gè).c文件,而每個(gè).c文件對(duì)應(yīng)一個(gè)同名的.h文件,第二個(gè).c文件想使用 第一個(gè).c文件定義的全局變量,全局函數(shù)等,必須包含第一個(gè)的.h文件,這是規(guī)范,多數(shù)人 都是這么做的,當(dāng)然不這么編也沒(méi)人攔你,不過(guò)這是很多人的經(jīng)驗(yàn)。 2。防止頭文件的重包含 頭文件內(nèi)通常定義一些類(lèi)型、結(jié)構(gòu)等,如果被包含多次,將會(huì)出現(xiàn)類(lèi)型重復(fù)定義的錯(cuò)誤,所以 通常使用預(yù)編譯來(lái)避免這一條,形式如下: #ifndefine _MYPROGRAM_H_ #define _MYPROGRAM_H_ /* you code */ #endif 需要在.h文件頭尾加上這么幾句話(huà)。雖然這個(gè)很簡(jiǎn)單,但是在實(shí)際生活中,我經(jīng)常看到有人不 知道這一點(diǎn),似乎很多書(shū)上也沒(méi)有提到,所以在這兒說(shuō)明一下。
四。程序編寫(xiě)的格式規(guī)范 這也是很重要的一方面,程序代碼的好壞很重要的一方面就是易維護(hù)性。所以格式一定要標(biāo)準(zhǔn), 讓人人都能看懂,自己也看得明白。這方面我不多說(shuō)了,大家在看源代碼的過(guò)程中很容易就能 學(xué)到。
這些都是c的基本規(guī)范,很多規(guī)范可以不遵從,但是顯然遵從了會(huì)有很多好處。不管你在什么開(kāi)發(fā) 環(huán)境下,我想這些規(guī)范都是一個(gè)初學(xué)者應(yīng)當(dāng)遵守的。高手咱規(guī)范不了:)。暫時(shí)只能想起來(lái)這些東西 ,以后說(shuō)不定還會(huì)有一些。
此文系本人嘔心瀝血所做( ,為了c的大業(yè)),高手看了千萬(wàn)不要扔柿子,有什么不對(duì)的告訴我, 我也好有則改之,無(wú)則加勉
由 diudiu 于 08-11-03 22:01 發(fā)表:
鼓勵(lì),支持你。兄弟
謝謝大家對(duì)丟丟個(gè)人站點(diǎn)的支持: http://www.
致力于C /C++技術(shù)討論
由 巴豆 于 08-12-03 13:31 發(fā)表:
指針,該死的指針,可是不得不學(xué)呀
別做程序了,給你們一個(gè)賺錢(qián)的秘訣,做豆腐,做硬了賣(mài)豆腐干,做稀了賣(mài)豆腐花,太稀了賣(mài)豆?jié){,豆腐賣(mài)不動(dòng)了放幾天賣(mài)臭豆腐,還賣(mài)不動(dòng)就放壞了賣(mài)腐乳!
由 diudiu 于 08-12-03 14:05 發(fā)表:
還可以阿,開(kāi)始有點(diǎn)麻煩。等入門(mén)了,就習(xí)慣,喜歡它了。。
謝謝大家對(duì)丟丟個(gè)人站點(diǎn)的支持: http://www.
致力于C /C++技術(shù)討論
由 hqwjun 于 08-15-03 18:04 發(fā)表:
支持你
擁有你是我最大的幸福
由 homer 于 09-07-03 06:15 發(fā)表:
支持一下....
個(gè)人認(rèn)為在指針應(yīng)用方面我還是比較自覺(jué)的。呵呵。
關(guān)于重包含的問(wèn)題還真從來(lái)沒(méi)有注意過(guò)。
由 smcree 于 09-22-03 18:59 發(fā)表:
支持你
由 sadly 于 09-24-03 16:34 發(fā)表:
支持一下~
搶劫中國(guó)銀行 實(shí)現(xiàn)心中理想
QQ:824008 ICQ:2896699 MSN:goodyork@hotmail.com
由 jx123jx123 于 10-08-03 00:34 發(fā)表:
支持
寫(xiě)的好
我是從basic轉(zhuǎn)而學(xué)c的 對(duì)指針的體會(huì)最深 干開(kāi)始學(xué)的時(shí)候好痛苦 老是用錯(cuò) 現(xiàn)在對(duì)了 感覺(jué)指針好好用喲
永遠(yuǎn)的westwood?。?!
由 tellmewhy 于 11-16-03 20:51 發(fā)表:
我也支持一下,雖然是很舊的帖子了!
There is nothing permanent except change.
由 htll 于 11-30-03 06:55 發(fā)表:
指針真是個(gè)好東西呀?。?/P>
由 wangfeng_1981 于 12-10-03 02:10 發(fā)表:
關(guān)于 "防止頭文件的重包含" 的一點(diǎn)看法!
我覺(jué)得 預(yù)編譯應(yīng)該包含 頭文件,而不是代碼!
#ifndefine _HEADERFILE_H_ #define _HEADERFILE_H_
#include("headerfile.h") ....
#endif
如果說(shuō)得不正確,請(qǐng)指正!
==饑渴稚嫩的腦袋!
由 日出東方XP 于 12-15-03 19:12 發(fā)表:
指針----內(nèi)存地址也。
希望直接打印的,希望打開(kāi)網(wǎng)頁(yè)后全屏顯示的,希望點(diǎn)了按鈕后直接退出瀏覽器的進(jìn)來(lái),希望設(shè)置客戶(hù)端分辨率的進(jìn)來(lái) 永遠(yuǎn)愛(ài)你—— 東河頭村——生我養(yǎng)我的地方 永遠(yuǎn)愛(ài)你—— 石家莊——我生活的地方 永遠(yuǎn)愛(ài)你—— 河北經(jīng)貿(mào)大學(xué)——我成長(zhǎng)、我起步的地方
由 onis_man 于 12-28-03 22:42 發(fā)表:
Re: 關(guān)于 "防止頭文件的重包含" 的一點(diǎn)看法!
quote:
最初由 wangfeng_1981 發(fā)布 我覺(jué)得 預(yù)編譯應(yīng)該包含 頭文件,而不是代碼!
#ifndefine _HEADERFILE_H_ #define _HEADERFILE_H_
#include("headerfile.h") ....
#endif
如果說(shuō)得不正確,請(qǐng)指正!
不太清楚你說(shuō)的什么意思,預(yù)編譯是正式編譯之前執(zhí)行的一次編譯,生成目標(biāo)文件,正式編譯對(duì)預(yù)編譯生成的目標(biāo)文件再次進(jìn)行編譯,通過(guò)預(yù)編譯,不僅可以防止這種重包含問(wèn)題,而且還可以編寫(xiě)release和debug的不同類(lèi)的二進(jìn)制文件,例如 #ifdefine DEBUG debug code #endif 這樣如果編譯release版本,debug code在預(yù)編譯生成的目標(biāo)文件里不會(huì)有,精簡(jiǎn)了最終生成的二進(jìn)制文件的大小。 除此以外,預(yù)編譯也經(jīng)常用來(lái)進(jìn)行跨平臺(tái)程序的編寫(xiě),例如
#ifdefine _IA64_ intel 64位平臺(tái)下運(yùn)行的代碼 #endif
#ifdefine _BSD_ unix BSD系統(tǒng)下運(yùn)行的代碼 #endif
由 plusKid 于 03-16-04 22:33 發(fā)表:
hehe!
|