锘??xml version="1.0" encoding="utf-8" standalone="yes"?> OnPaint鏄榪欎釜娑堟伅鐨勫弽搴斿嚱鏁?/font> mfc 鐨?CWnd::OnPaint 娌″仛浠涔堬紝鍙槸涓㈢粰緋葷粺澶勭悊銆?/font> 涓 錛?/strong> OnEraseBkGnd涓嶰nPaint鐨勫尯鍒笌鑱旂郴 鍦∣nEraseBkGnd涓?濡傛灉浣犱笉璋冪敤鍘熸潵緙虹渷鐨凮nEraseBkGnd鍙槸閲嶇敾鑳屾櫙鍒欎笉浼氭湁闂儊.鑰屽湪OnPaint閲岄潰,鐢變簬瀹冮殣鍚殑璋冪敤浜哋nEraseBkGnd,鑰屼綘鍙堟病鏈夊鐞哋nEraseBkGnd 鍑芥暟,榪欐椂灝卞拰紿楀彛緙虹渷鐨勮儗鏅埛鐩稿叧浜?緙虹渷鐨?OnEraseBkGnd鎿嶄綔浣跨敤紿楀彛鐨勭己鐪佽儗鏅埛鍒鋒柊鑳屾櫙(涓鑸儏鍐典笅鏄櫧鍒?,鑰岄殢鍚庝綘鍙堣嚜宸遍噸鐢昏儗鏅犳垚灞忓箷闂姩. OnEraseBkGnd涓嶆槸姣忔閮戒細琚皟鐢ㄧ殑.濡傛灉浣?font style="BACKGROUND-COLOR: #ccff00">璋冪敤Invalidate鐨勬椂鍊欏弬鏁頒負TRUE,閭d箞鍦∣nPaint閲岄潰闅愬惈璋冪敤BeginPaint鐨勬椂鍊欏氨浜?font style="BACKGROUND-COLOR: #ccff00">鐢焀M_ERASEBKGND娑堟伅,濡傛灉鍙傛暟鏄疐ALSE,鍒欎笉浼氶噸鍒瘋儗鏅? ZYP瑙i噴錛?/strong>void Invalidate( BOOL bErase = TRUE ); 璇ュ嚱鏁扮殑浣滅敤鏄嬌鏁翠釜紿楀彛瀹㈡埛鍖烘棤鏁堛傜獥鍙g殑瀹㈡埛鍖烘棤鏁堟剰鍛崇潃闇瑕侀噸緇橈紝鍙傛暟bErase涓篢RUE鏃訛紝閲嶇粯鍖哄煙鍐呯殑鑳屾櫙灝嗚閲嶇粯鍗蟲摝闄わ紝鍚﹀垯錛岃儗鏅皢淇濇寔涓嶅彉銆傝皟鐢↖nvalidate絳夊嚱鏁板悗紿楀彛涓嶄細绔嬪嵆閲嶇粯錛岃繖鏄敱浜嶹M_PAINT娑堟伅鐨勪紭鍏堢駭寰堜綆錛屽畠闇瑕佺瓑娑堟伅闃熷垪涓殑鍏跺畠娑堟伅鍙戦佸畬鍚庢墠鑳借澶勭悊銆?/font> OnPaint閲岄潰浼氳皟鐢?/font>BeginPaint鍑芥暟鑷姩璁劇疆鏄劇ず璁懼鍐呭鐨勫壀鍒囧尯鍩熻屾帓闄や換浣曟洿鏂板尯鍩熷鐨勫尯鍩熸洿鏂板尯鍩熴傚鏋滄洿鏂板尯鍩熻鏍囪涓哄彲鎿﹂櫎鐨勶紝BeginPaint鍙戦佷竴涓猈M_ERASEBKGND娑堟伅緇欑獥鍙c俉M_ERASEBKGND娑堟伅鐨勫搷搴斿嚱鏁版棦鏄?font style="BACKGROUND-COLOR: #ccff00" color=#000099>OnEraseBkGnd錛堬級 鍦∕FC涓?浠諱綍涓鍊媤indow鍏冧歡鐨勭躬鍦?閮芥槸鏀懼湪閫欏叐鍊媘ember function涓?br>鍦ㄨō瀹氫笂 OnEraseBkgnd()鏄敤渚嗙暙搴曞湒鐨?鑰孫nPaint()鏄敤渚嗙暙涓昏鐗╀歡鐨?br>鑸変緥瑾槑 涓鍊嬫寜閳曟槸鐏拌壊鐨?涓婇潰閭勬湁鏂囧瓧 BOOL CMyDlg::OnEraseBkgnd(CDC* pDC) 浠ヤ笂鏈締鏄渻鍛煎彨CDialog::OnEraseBkgnd() 浣嗘槸濡傛灉鎴戝戜笉鍛煎彨鐨勮┍ Q:鍩轟簬瀵硅瘽妗嗙殑紼嬪簭涓浣曢噸杞絆nEraseBkGnd()鍑芥暟 A:榪欐槸涓涓秷鎭疻M_ERASEBKWND 浜?錛?/font> MFC涓璒nDraw涓嶰nPaint鐨勫尯鍒?/font> 鍦∣nPaint涓皟鐢∣nDraw錛屼竴鑸潵璇達紝鐢ㄦ埛鑷繁鐨勭粯鍥句唬鐮佸簲鏀懼湪OnDraw涓?/font> OnPaint()鏄疌Wnd鐨勭被鎴愬憳錛岃礋璐e搷搴擶M_PAINT娑堟伅銆侽nDraw()鏄疌VIEW鐨勬垚鍛樺嚱鏁幫紝娌℃湁鍝嶅簲娑堟伅鐨勫姛鑳?褰撹鍥懼彉寰楁棤鏁堟椂錛堝寘鎷ぇ灝忕殑鏀瑰彉錛岀Щ鍔紝琚伄鐩栫瓑絳夛級錛學indows鍙戦乄M_PAINT娑堟伅銆傝瑙嗗浘鐨凮nPaint 澶勭悊鍑芥暟閫氳繃鍒涘緩CPaintDC綾葷殑DC瀵硅薄鏉ュ搷搴旇娑堟伅騫惰皟鐢ㄨ鍥劇殑OnDraw鎴愬憳鍑芥暟.OnPaint鏈鍚庝篃瑕佽皟鐢∣nDraw,鍥犳涓鑸湪OnDraw鍑芥暟涓繘琛岀粯鍒躲?/font> 鍦∣nPaint涓紝灝嗚皟鐢˙eginPaint錛岀敤鏉ヨ幏寰楀鎴峰尯鐨勬樉紺鴻澶囩幆澧冿紝騫朵互姝よ皟鐢℅DI鍑芥暟鎵ц緇樺浘鎿嶄綔銆傚湪緇樺浘鎿嶄綔瀹屾垚鍚庯紝灝嗚皟鐢‥ndPaint浠ラ噴鏀炬樉紺鴻澶囩幆澧冦傝孫nDraw鍦˙eginPaint涓嶦ndPaint闂磋璋冪敤銆傦紙涓涓簲鐢ㄧ▼搴忛櫎浜嗗搷搴擶M_PAINT娑堟伅澶栵紝涓嶅簲璇ヨ皟鐢˙eginPaint銆傛瘡嬈¤皟鐢˙eginPaint閮藉簲璇ユ湁鐩稿簲鐨凟ndPaint鍑芥暟銆?/font>錛?/font> 1) 鍦╩fc緇撴瀯閲孫nPaint鏄疌Wnd鐨勬垚鍛樺嚱鏁? OnDraw鏄疌View鐨勬垚鍛樺嚱鏁? OnDraw()鍜孫nPaint()鏈変粈涔堝尯鍒憿錛?br>棣栧厛錛氭垜浠厛瑕佹槑紜瓹View綾繪淳鐢熻嚜CWnd綾匯傝孫nPaint()鏄疌Wnd鐨勭被鎴愬憳錛屽悓鏃惰礋璐e搷搴擶M_PAINT娑堟伅銆侽nDraw()鏄疌VIEW鐨勬垚鍛樺嚱鏁幫紝騫朵笖娌℃湁鍝嶅簲娑堟伅鐨勫姛鑳姐傝繖灝辨槸涓轟粈涔堜綘鐢╒C鎴愮殑紼嬪簭浠g爜鏃訛紝鍦ㄨ鍥劇被鍙湁OnDraw娌℃湁OnPaint鐨?/strong>鍘熷洜銆傝屽湪鍩轟簬瀵硅瘽妗嗙殑紼嬪簭涓紝鍙湁OnPaint銆?br>鍏舵錛氭垜浠湪絎婃瘡澶╄窡鎴戝MFC銆?鐨勫紑濮嬮儴鍒嗗凡緇忚鍒頒簡銆傝鎯沖湪灞忓箷涓婄粯鍥炬垨鏄劇ず鍥懼艦錛岄鍏堥渶瑕佸緩绔嬭澶囩幆澧僁C銆傚叾瀹濪C鏄竴涓暟鎹粨鏋勶紝瀹冨寘鍚緭鍑鴻澶囷紙涓嶅崟鎸囦綘17瀵哥殑綰睆鏄劇ず鍣紝榪樺寘鎷墦鍗版満涔嬬被鐨勮緭鍑鴻澶囷級鐨勭粯鍥懼睘鎬х殑鎻忚堪銆侻FC鎻愪緵浜咰PaintDC綾誨拰CWindwoDC綾繪潵瀹炴椂鐨勫搷搴旓紝鑰孋PaintDC鏀寔閲嶇敾銆傚綋瑙嗗浘鍙樺緱鏃犳晥鏃訛紙鍖呮嫭澶у皬鐨勬敼鍙橈紝縐誨姩錛岃閬洊絳夌瓑錛夛紝Windows 灝?WM_PAINT 娑堟伅鍙戦佺粰瀹冦傝瑙嗗浘鐨凮nPaint 澶勭悊鍑芥暟閫氳繃鍒涘緩 CPaintDC 綾葷殑DC瀵硅薄鏉ュ搷搴旇娑堟伅騫惰皟鐢ㄨ鍥劇殑 OnDraw 鎴愬憳鍑芥暟銆傞氬父鎴戜滑涓嶅繀緙栧啓閲嶅啓鐨?OnPaint 澶勭悊鎴愬憳鍑芥暟銆?br>///CView榛樿鐨勬爣鍑嗙殑閲嶇敾鍑芥暟 CPaintDC dc(this); 鏃㈢劧OnPaint鏈鍚庝篃瑕佽皟鐢∣nDraw,鍥犳鎴戜滑涓鑸細鍦∣nDraw鍑芥暟涓繘琛岀粯鍒躲備笅闈㈡槸涓涓吀鍨嬬殑紼嬪簭銆?br>///瑙嗗浘涓殑緇樺浘浠g爜棣栧厛媯绱㈡寚鍚戞枃妗g殑鎸囬拡錛岀劧鍚庨氳繃DC榪涜緇樺浘璋冪敤銆?br>void CMyView::OnDraw( CDC* pDC ) CMyDoc* pDoc = GetDocument(); OnDraw涓彲浠ョ粯鍒剁敤鎴峰尯鍩熴侽nPaint涓彧鏄綋紿楀彛鏃犳晥鏃墮噸緇樹笉浼氫繚鐣機ClientDC緇樺埗鐨勫唴瀹廣?/font> 榪欎袱涓嚱鏁版湁鍖哄埆涔熸湁鑱旂郴錛?/font> 1銆佸尯鍒細OnDraw鏄竴涓函铏氬嚱鏁幫紝瀹氫箟涓簐irtual void OnDraw( CDC* pDC ) = 0;銆鑰孫nPaint鏄竴涓秷鎭搷搴斿嚱鏁幫紝瀹冨搷搴斾簡WM錛縋ANIT娑堟伅錛屼篃鏄槸紿楀彛閲嶇粯娑堟伅銆?/font> 2銆佽仈緋伙細鎴戜滑涓鑸湪瑙嗙被涓綔鍥劇殑鏃跺欙紝寰寰涓嶇洿鎺ュ搷搴擶M錛縋ANIT娑堟伅錛岃屾槸閲嶈澆OnDraw綰櫄鍑芥暟錛岃繖鏄洜涓哄湪CVIEW綾諱腑鐨刉M錛縋ANIT娑堟伅鍝嶅簲鍑芥暟涓皟鐢ㄤ簡OnDraw鍑芥暟錛屽鏋滃湪CMYVIEW綾諱腑鍝嶅簲浜哤M錛縋AINT娑堟伅錛屼笉鏄懼紡鍦拌皟鐢∣nDraw鍑芥暟鐨勮瘽錛屾槸涓嶄細鍦ㄧ獥鍙i噸緇樼殑鏃跺欒皟鐢∣nDraw鍑芥暟鐨勩?/font> 搴旂敤紼嬪簭涓嚑涔庢墍鏈夌殑緇樺浘閮藉湪瑙嗗浘鐨?OnDraw 鎴愬憳鍑芥暟涓彂鐢燂紝蹇呴』鍦ㄨ鍥劇被涓噸鍐欒鎴愬憳鍑芥暟銆傦紙榧犳爣緇樺浘鏄釜鐗逛緥錛岃繖鍦ㄩ氳繃瑙嗗浘瑙i噴鐢ㄦ埛杈撳叆涓璁恒傦級 鐨勭‘錛孫nPaint()鐢ㄦ潵鍝嶅簲WM_PAINT娑堟伅錛岃綾葷殑OnPaint()鍐呴儴鏍規嵁鏄墦鍗拌繕鏄睆騫曠粯鍒跺垎鍒互涓嶅悓鐨勫弬鏁拌皟鐢∣nDraw()铏氬嚱鏁般傛墍浠ュ湪OnDraw()閲屼綘鍙互鍖哄埆瀵瑰緟鎵撳嵃鍜屽睆騫曠粯鍒躲?br>鍏跺疄錛孧FC鍦ㄨ繘琛屾墦鍗板墠鍚庤繕鍋氫簡寰堝宸ヤ綔錛岃皟鐢ㄤ簡寰堝铏氬嚱鏁幫紝姣斿OnPreparePrint()絳夈?/font> 瑙嗗浘紿楀彛瀹屽叏寤虹珛鍚庣涓涓妗嗘灦璋冪敤鐨勫嚱鏁般傛鏋跺湪絎竴嬈¤皟鐢∣nDraw鍓嶄細璋冪敤OnInitialUpdate錛屽洜姝nInitialUpdate鏄緗粴鍔ㄨ鍥劇殑閫昏緫灝哄鍜屾槧灝勬ā寮忕殑鏈鍚堥傜殑鍦版柟銆?/font> 鍥犱負錛宮akefile鍏崇郴鍒頒簡鏁翠釜宸ョ▼鐨勭紪璇戣鍒欍備竴涓伐紼嬩腑鐨勬簮鏂囦歡涓嶈鏁幫紝鍏舵寜綾誨瀷銆佸姛鑳姐佹ā鍧楀垎鍒斁鍦ㄨ嫢騫蹭釜鐩綍涓紝makefile瀹氫箟浜嗕竴緋誨垪鐨勮鍒欐潵鎸囧畾錛屽摢浜涙枃浠墮渶瑕佸厛緙栬瘧錛屽摢浜涙枃浠墮渶瑕佸悗緙栬瘧錛屽摢浜涙枃浠墮渶瑕侀噸鏂扮紪璇戯紝鐢氳嚦浜庤繘琛屾洿澶嶆潅鐨勫姛鑳芥搷浣滐紝鍥犱負makefile灝卞儚涓涓猄hell鑴氭湰涓鏍鳳紝鍏朵腑涔熷彲浠ユ墽琛屾搷浣滅郴緇熺殑鍛戒護銆?
makefile甯︽潵鐨勫ソ澶勫氨鏄斺?#8220;鑷姩鍖栫紪璇?#8221;錛屼竴鏃﹀啓濂斤紝鍙渶瑕佷竴涓猰ake鍛戒護錛屾暣涓伐紼嬪畬鍏ㄨ嚜鍔ㄧ紪璇戯紝鏋佸ぇ鐨勬彁楂樹簡杞歡寮鍙戠殑鏁堢巼銆俶ake鏄竴涓懡浠ゅ伐鍏鳳紝鏄竴涓В閲妋akefile涓寚浠ょ殑鍛戒護宸ュ叿錛屼竴鑸潵璇達紝澶у鏁扮殑IDE閮芥湁榪欎釜鍛戒護錛屾瘮濡傦細Delphi鐨刴ake錛孷isual C++鐨刵make錛孡inux涓婫NU鐨刴ake銆傚彲瑙侊紝makefile閮芥垚涓轟簡涓縐嶅湪宸ョ▼鏂歸潰鐨勭紪璇戞柟娉曘?
鐜板湪璁茶堪濡備綍鍐檓akefile鐨勬枃绔犳瘮杈冨皯錛岃繖鏄垜鎯沖啓榪欑瘒鏂囩珷鐨勫師鍥犮傚綋鐒訛紝涓嶅悓浜у晢鐨刴ake鍚勪笉鐩稿悓錛屼篃鏈変笉鍚岀殑璇硶錛屼絾鍏舵湰璐ㄩ兘鏄湪“鏂囦歡渚濊禆鎬?#8221;涓婂仛鏂囩珷錛岃繖閲岋紝鎴戜粎瀵笹NU鐨刴ake榪涜璁茶堪錛屾垜鐨勭幆澧冩槸RedHat Linux 8.0錛宮ake鐨勭増鏈槸3.80銆傚繀绔燂紝榪欎釜make鏄簲鐢ㄦ渶涓哄箍娉涚殑錛屼篃鏄敤寰楁渶澶氱殑銆傝屼笖鍏惰繕鏄渶閬靛驚浜嶪EEE 1003.2-1992 鏍囧噯鐨勶紙POSIX.2錛夈?
鍦ㄨ繖綃囨枃妗d腑錛屽皢浠/C++鐨勬簮鐮佷綔涓烘垜浠熀紜錛屾墍浠ュ繀鐒舵秹鍙婁竴浜涘叧浜嶤/C++鐨勭紪璇戠殑鐭ヨ瘑錛岀浉鍏充簬榪欐柟闈㈢殑鍐呭錛岃繕璇峰悇浣嶆煡鐪嬬浉鍏崇殑緙栬瘧鍣ㄧ殑鏂囨。銆傝繖閲屾墍榛樿鐨勭紪璇戝櫒鏄疷NIX涓嬬殑GCC鍜孋C銆?
緙栬瘧鏃訛紝緙栬瘧鍣ㄩ渶瑕佺殑鏄娉曠殑姝g‘錛屽嚱鏁頒笌鍙橀噺鐨勫0鏄庣殑姝g‘銆傚浜庡悗鑰咃紝閫氬父鏄綘闇瑕佸憡璇夌紪璇戝櫒澶存枃浠剁殑鎵鍦ㄤ綅緗紙澶存枃浠朵腑搴旇鍙槸澹版槑錛岃屽畾涔夊簲璇ユ斁鍦–/C++鏂囦歡涓級錛屽彧瑕佹墍鏈夌殑璇硶姝g‘錛岀紪璇戝櫒灝卞彲浠ョ紪璇戝嚭涓棿鐩爣鏂囦歡銆備竴鑸潵璇達紝姣忎釜婧愭枃浠墮兘搴旇瀵瑰簲浜庝竴涓腑闂寸洰鏍囨枃浠訛紙O鏂囦歡鎴栨槸OBJ鏂囦歡錛夈?
閾炬帴鏃訛紝涓昏鏄摼鎺ュ嚱鏁板拰鍏ㄥ眬鍙橀噺錛屾墍浠ワ紝鎴戜滑鍙互浣跨敤榪欎簺涓棿鐩爣鏂囦歡錛圤鏂囦歡鎴栨槸OBJ鏂囦歡錛夋潵閾炬帴鎴戜滑鐨勫簲鐢ㄧ▼搴忋傞摼鎺ュ櫒騫朵笉綆″嚱鏁版墍鍦ㄧ殑婧愭枃浠訛紝鍙鍑芥暟鐨勪腑闂寸洰鏍囨枃浠訛紙Object File錛夛紝鍦ㄥぇ澶氭暟鏃跺欙紝鐢變簬婧愭枃浠跺お澶氾紝緙栬瘧鐢熸垚鐨勪腑闂寸洰鏍囨枃浠跺お澶氾紝鑰屽湪閾炬帴鏃墮渶瑕佹槑鏄懼湴鎸囧嚭涓棿鐩爣鏂囦歡鍚嶏紝榪欏浜庣紪璇戝緢涓嶆柟渚匡紝鎵浠ワ紝鎴戜滑瑕佺粰涓棿鐩爣鏂囦歡鎵撲釜鍖咃紝鍦╓indows涓嬭繖縐嶅寘鍙?#8220;搴撴枃浠?#8221;錛圠ibrary File)錛屼篃灝辨槸 .lib 鏂囦歡錛屽湪UNIX涓嬶紝鏄疉rchive File錛屼篃灝辨槸 .a 鏂囦歡銆?
鎬葷粨涓涓嬶紝婧愭枃浠墮鍏堜細鐢熸垚涓棿鐩爣鏂囦歡錛屽啀鐢變腑闂寸洰鏍囨枃浠剁敓鎴愭墽琛屾枃浠躲傚湪緙栬瘧鏃訛紝緙栬瘧鍣ㄥ彧媯嫻嬬▼搴忚娉曪紝鍜屽嚱鏁般佸彉閲忔槸鍚﹁澹版槑銆傚鏋滃嚱鏁版湭琚0鏄庯紝緙栬瘧鍣ㄤ細緇欏嚭涓涓鍛婏紝浣嗗彲浠ョ敓鎴怬bject File銆傝屽湪閾炬帴紼嬪簭鏃訛紝閾炬帴鍣ㄤ細鍦ㄦ墍鏈夌殑Object File涓壘瀵誨嚱鏁扮殑瀹炵幇錛屽鏋滄壘涓嶅埌錛岄偅鍒板氨浼氭姤閾炬帴閿欒鐮侊紙Linker Error錛夛紝鍦╒C涓嬶紝榪欑閿欒涓鑸槸錛歀ink 2001閿欒錛屾剰鎬濊鏄錛岄摼鎺ュ櫒鏈兘鎵懼埌鍑芥暟鐨勫疄鐜般備綘闇瑕佹寚瀹氬嚱鏁扮殑Object File.
濂斤紝璦褰掓浼狅紝GNU鐨刴ake鏈夎澶氱殑鍐呭錛岄棽璦灝戝彊錛岃繕鏄鎴戜滑寮濮嬪惂銆?
棣栧厛錛屾垜浠敤涓涓ず渚嬫潵璇存槑Makefile鐨勪功鍐欒鍒欍備互渚跨粰澶у涓涓劅鍏磋璇嗐傝繖涓ず渚嬫潵婧愪簬GNU鐨刴ake浣跨敤鎵嬪唽錛屽湪榪欎釜紺轟緥涓紝鎴戜滑鐨勫伐紼嬫湁8涓狢鏂囦歡錛屽拰3涓ご鏂囦歡錛屾垜浠鍐欎竴涓狹akefile鏉ュ憡璇塵ake鍛戒護濡備綍緙栬瘧鍜岄摼鎺ヨ繖鍑犱釜鏂囦歡銆傛垜浠殑瑙勫垯鏄細
鍙鎴戜滑鐨凪akefile鍐欏緱澶熷ソ錛屾墍鏈夌殑榪欎竴鍒囷紝鎴戜滑鍙敤涓涓猰ake鍛戒護灝卞彲浠ュ畬鎴愶紝make鍛戒護浼氳嚜鍔ㄦ櫤鑳藉湴鏍規嵁褰撳墠鐨勬枃浠朵慨鏀圭殑鎯呭喌鏉ョ‘瀹氬摢浜涙枃浠墮渶瑕侀噸緙栬瘧錛屼粠鑰岃嚜宸辯紪璇戞墍闇瑕佺殑鏂囦歡鍜岄摼鎺ョ洰鏍囩▼搴忋?
prerequisites灝辨槸錛岃鐢熸垚閭d釜target鎵闇瑕佺殑鏂囦歡鎴栨槸鐩爣銆?
command涔熷氨鏄痬ake闇瑕佹墽琛岀殑鍛戒護銆傦紙浠繪剰鐨凷hell鍛戒護錛?
榪欐槸涓涓枃浠剁殑渚濊禆鍏崇郴錛屼篃灝辨槸璇達紝target榪欎竴涓垨澶氫釜鐨勭洰鏍囨枃浠朵緷璧栦簬prerequisites涓殑鏂囦歡錛屽叾鐢熸垚瑙勫垯瀹氫箟鍦╟ommand涓傝鐧戒竴鐐瑰氨鏄錛宲rerequisites涓鏋滄湁涓涓互涓婄殑鏂囦歡姣攖arget鏂囦歡瑕佹柊鐨勮瘽錛宑ommand鎵瀹氫箟鐨勫懡浠ゅ氨浼氳鎵ц銆傝繖灝辨槸Makefile鐨勮鍒欍備篃灝辨槸Makefile涓渶鏍稿績鐨勫唴瀹廣?
璇村埌搴曪紝Makefile鐨勪笢瑗垮氨鏄繖鏍蜂竴鐐癸紝濂藉儚鎴戠殑榪欑瘒鏂囨。涔熻緇撴潫浜嗐傚懙鍛點傝繕涓嶅敖鐒訛紝榪欐槸Makefile鐨勪富綰垮拰鏍稿績錛屼絾瑕佸啓濂戒竴涓狹akefile榪樹笉澶燂紝鎴戜細浠ュ悗闈竴鐐逛竴鐐瑰湴緇撳悎鎴戠殑宸ヤ綔緇忛獙緇欎綘鎱㈡參鍒版潵銆傚唴瀹硅繕澶氱潃鍛€傦細錛?
鍦ㄨ繖涓猰akefile涓紝鐩爣鏂囦歡錛坱arget錛夊寘鍚細鎵ц鏂囦歡edit鍜屼腑闂寸洰鏍囨枃浠訛紙*.o錛夛紝渚濊禆鏂囦歡錛坧rerequisites錛夊氨鏄啋鍙峰悗闈㈢殑閭d簺 .c 鏂囦歡鍜?.h鏂囦歡銆傛瘡涓涓?.o 鏂囦歡閮芥湁涓緇勪緷璧栨枃浠訛紝鑰岃繖浜?.o 鏂囦歡鍙堟槸鎵ц鏂囦歡 edit 鐨勪緷璧栨枃浠躲備緷璧栧叧緋葷殑瀹炶川涓婂氨鏄鏄庝簡鐩爣鏂囦歡鏄敱鍝簺鏂囦歡鐢熸垚鐨勶紝鎹㈣█涔嬶紝鐩爣鏂囦歡鏄摢浜涙枃浠舵洿鏂扮殑銆?
鍦ㄥ畾涔夊ソ渚濊禆鍏崇郴鍚庯紝鍚庣畫鐨勯偅涓琛屽畾涔変簡濡備綍鐢熸垚鐩爣鏂囦歡鐨勬搷浣滅郴緇熷懡浠わ紝涓瀹氳浠ヤ竴涓猅ab閿綔涓哄紑澶淬傝浣忥紝make騫朵笉綆″懡浠ゆ槸鎬庝箞宸ヤ綔鐨勶紝浠栧彧綆℃墽琛屾墍瀹氫箟鐨勫懡浠ゃ俶ake浼氭瘮杈僼argets鏂囦歡鍜宲rerequisites鏂囦歡鐨勪慨鏀規棩鏈燂紝濡傛灉prerequisites鏂囦歡鐨勬棩鏈熻姣攖argets鏂囦歡鐨勬棩鏈熻鏂幫紝鎴栬卼arget涓嶅瓨鍦ㄧ殑璇濓紝閭d箞錛宮ake灝變細鎵ц鍚庣畫瀹氫箟鐨勫懡浠ゃ?
榪欓噷瑕佽鏄庝竴鐐圭殑鏄紝clean涓嶆槸涓涓枃浠訛紝瀹冨彧涓嶈繃鏄竴涓姩浣滃悕瀛楋紝鏈夌偣鍍廋璇█涓殑lable涓鏍鳳紝鍏跺啋鍙峰悗浠涔堜篃娌℃湁錛岄偅涔堬紝make灝變笉浼氳嚜鍔ㄥ幓鎵炬枃浠剁殑渚濊禆鎬э紝涔熷氨涓嶄細鑷姩鎵ц鍏跺悗鎵瀹氫箟鐨勫懡浠ゃ傝鎵ц鍏跺悗鐨勫懡浠わ紝灝辮鍦╩ake鍛戒護鍚庢槑鏄懼緱鎸囧嚭榪欎釜lable鐨勫悕瀛椼傝繖鏍風殑鏂規硶闈炲父鏈夌敤錛屾垜浠彲浠ュ湪涓涓猰akefile涓畾涔変笉鐢ㄧ殑緙栬瘧鎴栨槸鍜岀紪璇戞棤鍏崇殑鍛戒護錛屾瘮濡傜▼搴忕殑鎵撳寘錛岀▼搴忕殑澶囦喚錛岀瓑絳夈?
榪欏氨鏄暣涓猰ake鐨勪緷璧栨э紝make浼氫竴灞傚張涓灞傚湴鍘繪壘鏂囦歡鐨勪緷璧栧叧緋伙紝鐩村埌鏈緇堢紪璇戝嚭絎竴涓洰鏍囨枃浠躲傚湪鎵懼鐨勮繃紼嬩腑錛屽鏋滃嚭鐜伴敊璇紝姣斿鏈鍚庤渚濊禆鐨勬枃浠舵壘涓嶅埌錛岄偅涔坢ake灝變細鐩存帴閫鍑猴紝騫舵姤閿欙紝鑰屽浜庢墍瀹氫箟鐨勫懡浠ょ殑閿欒錛屾垨鏄紪璇戜笉鎴愬姛錛宮ake鏍規湰涓嶇悊銆俶ake鍙鏂囦歡鐨勪緷璧栨э紝鍗籌紝濡傛灉鍦ㄦ垜鎵句簡渚濊禆鍏崇郴涔嬪悗錛屽啋鍙峰悗闈㈢殑鏂囦歡榪樻槸涓嶅湪錛岄偅涔堝涓嶈搗錛屾垜灝變笉宸ヤ綔鍟︺?
閫氳繃涓婅堪鍒嗘瀽錛屾垜浠煡閬擄紝鍍廲lean榪欑錛屾病鏈夎絎竴涓洰鏍囨枃浠剁洿鎺ユ垨闂存帴鍏寵仈錛岄偅涔堝畠鍚庨潰鎵瀹氫箟鐨勫懡浠ゅ皢涓嶄細琚嚜鍔ㄦ墽琛岋紝涓嶈繃錛屾垜浠彲浠ユ樉紺鴻make鎵ц銆傚嵆鍛戒護鈥斺?#8220;make clean”錛屼互姝ゆ潵娓呴櫎鎵鏈夌殑鐩爣鏂囦歡錛屼互渚塊噸緙栬瘧銆?
浜庢槸鍦ㄦ垜浠紪紼嬩腑錛屽鏋滆繖涓伐紼嬪凡琚紪璇戣繃浜嗭紝褰撴垜浠慨鏀逛簡鍏朵腑涓涓簮鏂囦歡錛屾瘮濡俧ile.c錛岄偅涔堟牴鎹垜浠殑渚濊禆鎬э紝鎴戜滑鐨勭洰鏍噁ile.o浼氳閲嶇紪璇戯紙涔熷氨鏄湪榪欎釜渚濇у叧緋誨悗闈㈡墍瀹氫箟鐨勫懡浠わ級錛屼簬鏄痜ile.o鐨勬枃浠朵篃鏄渶鏂扮殑鍟︼紝浜庢槸file.o鐨勬枃浠朵慨鏀規椂闂磋姣攅dit瑕佹柊錛屾墍浠dit涔熶細琚噸鏂伴摼鎺ヤ簡錛堣瑙乪dit鐩爣鏂囦歡鍚庡畾涔夌殑鍛戒護錛夈?
鑰屽鏋滄垜浠敼鍙樹簡“command.h”錛岄偅涔堬紝kdb.o銆乧ommand.o鍜宖iles.o閮戒細琚噸緙栬瘧錛屽茍涓旓紝edit浼氳閲嶉摼鎺ャ?
姣斿錛屾垜浠0鏄庝竴涓彉閲忥紝鍙玱bjects, OBJECTS, objs, OBJS, obj, 鎴栨槸 OBJ錛屽弽姝d笉綆′粈涔堝暒錛屽彧瑕佽兘澶熻〃紺簅bj鏂囦歡灝辮浜嗐傛垜浠湪makefile涓寮濮嬪氨榪欐牱瀹氫箟錛? 浜庢槸濡傛灉鏈夋柊鐨?.o 鏂囦歡鍔犲叆錛屾垜浠彧闇綆鍗曞湴淇敼涓涓?objects 鍙橀噺灝卞彲浠ヤ簡銆?
鍏充簬鍙橀噺鏇村鐨勮瘽棰橈紝鎴戜細鍦ㄥ悗緇粰浣犱竴涓閬撴潵銆?
鍙make鐪嬪埌涓涓猍.o]鏂囦歡錛屽畠灝變細鑷姩鐨勬妸[.c]鏂囦歡鍔犲湪渚濊禆鍏崇郴涓紝濡傛灉make鎵懼埌涓涓獁hatever.o錛岄偅涔坵hatever.c錛屽氨浼氭槸whatever.o鐨勪緷璧栨枃浠躲傚茍涓?cc -c whatever.c 涔熶細琚帹瀵煎嚭鏉ワ紝浜庢槸錛屾垜浠殑makefile鍐嶄篃涓嶇敤鍐欏緱榪欎箞澶嶆潅銆傛垜浠殑鏄柊鐨刴akefile鍙堝嚭鐐変簡銆? 鍏充簬鏇翠負璇︾粏鐨?#8220;闅愭櫐瑙勫垯”鍜?#8220;浼洰鏍囨枃浠?#8221;錛屾垜浼氬湪鍚庣畫緇欎綘涓涓閬撴潵銆?
涓婇潰灝辨槸涓涓猰akefile鐨勬璨岋紝涔熸槸makefile鐨勫熀紜錛屼笅闈㈣繕鏈夊緢澶歮akefile鐨勭浉鍏崇粏鑺傦紝鍑嗗濂戒簡鍚楋紵鍑嗗濂戒簡灝辨潵銆?
鏈鍚庯紝榪樺煎緱涓鎻愮殑鏄紝鍦∕akefile涓殑鍛戒護錛屽繀欏昏浠Tab]閿紑濮嬨?
褰撶劧錛屼綘鍙互浣跨敤鍒殑鏂囦歡鍚嶆潵涔﹀啓Makefile錛屾瘮濡傦細“Make.Linux”錛?#8220;Make.Solaris”錛?#8220;Make.AIX”絳夛紝濡傛灉瑕佹寚瀹氱壒瀹氱殑Makefile錛屼綘鍙互浣跨敤make鐨?#8220;-f”鍜?#8220;--file”鍙傛暟錛屽錛歮ake -f Make.Linux鎴杕ake --file Make.AIX銆?
鍦╥nclude鍓嶉潰鍙互鏈変竴浜涚┖瀛楃錛屼絾鏄粷涓嶈兘鏄痆Tab]閿紑濮嬨俰nclude鍜?filename>鍙互鐢ㄤ竴涓垨澶氫釜絀烘牸闅斿紑銆備婦涓緥瀛愶紝浣犳湁榪欐牱鍑犱釜Makefile錛歛.mk銆乥.mk銆乧.mk錛岃繕鏈変竴涓枃浠跺彨foo.make錛屼互鍙婁竴涓彉閲?(bar)錛屽叾鍖呭惈浜唀.mk鍜宖.mk錛岄偅涔堬紝涓嬮潰鐨勮鍙ワ細
濡傛灉鏈夋枃浠舵病鏈夋壘鍒扮殑璇濓紝make浼氱敓鎴愪竴鏉¤鍛婁俊鎭紝浣嗕笉浼氶┈涓婂嚭鐜拌嚧鍛介敊璇傚畠浼氱戶緇澆鍏ュ叾瀹冪殑鏂囦歡錛屼竴鏃﹀畬鎴恗akefile鐨勮鍙栵紝make浼氬啀閲嶈瘯榪欎簺娌℃湁鎵懼埌錛屾垨鏄笉鑳借鍙栫殑鏂囦歡錛屽鏋滆繕鏄笉琛岋紝make鎵嶄細鍑虹幇涓鏉¤嚧鍛戒俊鎭傚鏋滀綘鎯寵make涓嶇悊閭d簺鏃犳硶璇誨彇鐨勬枃浠訛紝鑰岀戶緇墽琛岋紝浣犲彲浠ュ湪include鍓嶅姞涓涓噺鍙?#8220;-”銆傚錛?
浣嗘槸鍦ㄨ繖閲屾垜榪樻槸寤鴻涓嶈浣跨敤榪欎釜鐜鍙橀噺錛屽洜涓哄彧瑕佽繖涓彉閲忎竴琚畾涔夛紝閭d箞褰撲綘浣跨敤make鏃訛紝鎵鏈夌殑Makefile閮戒細鍙楀埌瀹冪殑褰卞搷錛岃繖緇濅笉鏄綘鎯崇湅鍒扮殑銆傚湪榪欓噷鎻愯繖涓簨錛屽彧鏄負浜嗗憡璇夊ぇ瀹訛紝涔熻鏈夋椂鍊欎綘鐨凪akefile鍑虹幇浜嗘簨錛岄偅涔堜綘鍙互鐪嬬湅褰撳墠鐜涓湁娌℃湁瀹氫箟榪欎釜鍙橀噺銆?
1-5姝ヤ負絎竴涓樁孌碉紝6-7涓虹浜屼釜闃舵銆傜涓涓樁孌典腑錛屽鏋滃畾涔夌殑鍙橀噺琚嬌鐢ㄤ簡錛岄偅涔堬紝make浼氭妸鍏跺睍寮鍦ㄤ嬌鐢ㄧ殑浣嶇疆銆備絾make騫朵笉浼氬畬鍏ㄩ┈涓婂睍寮錛宮ake浣跨敤鐨勬槸鎷栧歡鎴樻湳錛屽鏋滃彉閲忓嚭鐜板湪渚濊禆鍏崇郴鐨勮鍒欎腑錛岄偅涔堜粎褰撹繖鏉′緷璧栬鍐沖畾瑕佷嬌鐢ㄤ簡錛屽彉閲忔墠浼氬湪鍏跺唴閮ㄥ睍寮銆?
褰撶劧錛岃繖涓伐浣滄柟寮忎綘涓嶄竴瀹氳娓呮錛屼絾鏄煡閬撹繖涓柟寮忎綘涔熶細瀵筸ake鏇翠負鐔熸倝銆傛湁浜嗚繖涓熀紜錛屽悗緇儴鍒嗕篃灝卞鏄撶湅鎳備簡銆?
鍦∕akefile涓紝瑙勫垯鐨勯『搴忔槸寰堥噸瑕佺殑錛屽洜涓猴紝Makefile涓彧搴旇鏈変竴涓渶緇堢洰鏍囷紝鍏跺畠鐨勭洰鏍囬兘鏄榪欎釜鐩爣鎵榪炲甫鍑烘潵鐨勶紝鎵浠ヤ竴瀹氳璁﹎ake鐭ラ亾浣犵殑鏈緇堢洰鏍囨槸浠涔堛備竴鑸潵璇達紝瀹氫箟鍦∕akefile涓殑鐩爣鍙兘浼氭湁寰堝錛屼絾鏄涓鏉¤鍒欎腑鐨勭洰鏍囧皢琚‘绔嬩負鏈緇堢殑鐩爣銆傚鏋滅涓鏉¤鍒欎腑鐨勭洰鏍囨湁寰堝涓紝閭d箞錛岀涓涓洰鏍囦細鎴愪負鏈緇堢殑鐩爣銆俶ake鎵瀹屾垚鐨勪篃灝辨槸榪欎釜鐩爣銆?
濂戒簡錛岃繕鏄鎴戜滑鏉ョ湅涓鐪嬪浣曚功鍐欒鍒欍?
command鏄懡浠よ錛屽鏋滃叾涓嶄笌“target:prerequisites”鍦ㄤ竴琛岋紝閭d箞錛屽繀欏諱互[Tab閿甝寮澶達紝濡傛灉鍜宲rerequisites鍦ㄤ竴琛岋紝閭d箞鍙互鐢ㄥ垎鍙峰仛涓哄垎闅斻傦紙瑙佷笂錛?
prerequisites涔熷氨鏄洰鏍囨墍渚濊禆鐨勬枃浠訛紙鎴栦緷璧栫洰鏍囷級銆傚鏋滃叾涓殑鏌愪釜鏂囦歡瑕佹瘮鐩爣鏂囦歡瑕佹柊錛岄偅涔堬紝鐩爣灝辮璁や負鏄?#8220;榪囨椂鐨?#8221;錛岃璁や負鏄渶瑕侀噸鐢熸垚鐨勩傝繖涓湪鍓嶉潰宸茬粡璁茶繃浜嗐?
濡傛灉鍛戒護澶暱錛屼綘鍙互浣跨敤鍙嶆枩妗嗭紙‘\’錛変綔涓烘崲琛岀銆俶ake瀵逛竴琛屼笂鏈夊灝戜釜瀛楃娌℃湁闄愬埗銆傝鍒欏憡璇塵ake涓や歡浜嬶紝鏂囦歡鐨勪緷璧栧叧緋誨拰濡備綍鎴愭垚鐩爣鏂囦歡銆?
涓鑸潵璇達紝make浼氫互UNIX鐨勬爣鍑哠hell錛屼篃灝辨槸/bin/sh鏉ユ墽琛屽懡浠ゃ?
濡傛灉鎴戜滑鎯沖畾涔変竴緋誨垪姣旇緝綾諱技鐨勬枃浠訛紝鎴戜滑寰堣嚜鐒跺湴灝辨兂璧蜂嬌鐢ㄩ氶厤絎︺俶ake鏀寔涓夊悇閫氶厤絎︼細“*”錛?#8220;?”鍜?#8220;[...]”銆傝繖鏄拰Unix鐨凚-Shell鏄浉鍚岀殑銆?
娉㈡氮鍙鳳紙“~”錛夊瓧絎﹀湪鏂囦歡鍚嶄腑涔熸湁姣旇緝鐗規畩鐨勭敤閫斻傚鏋滄槸“~/test”錛岃繖灝辮〃紺哄綋鍓嶇敤鎴風殑$HOME鐩綍涓嬬殑test鐩綍銆傝?#8220;~hchen/test”鍒欒〃紺虹敤鎴穐chen鐨勫涓葷洰褰曚笅鐨則est鐩綍銆傦紙榪欎簺閮芥槸Unix涓嬬殑灝忕煡璇嗕簡錛宮ake涔熸敮鎸侊級鑰屽湪Windows鎴栨槸MS-DOS涓嬶紝鐢ㄦ埛娌℃湁瀹夸富鐩綍錛岄偅涔堟嘗嫻彿鎵鎸囩殑鐩綍鍒欐牴鎹幆澧冨彉閲?#8220;HOME”鑰屽畾銆?
閫氶厤絎︿唬鏇夸簡浣犱竴緋誨垪鐨勬枃浠訛紝濡?#8220;*.c”琛ㄧず鎵浠ュ悗緙涓篶鐨勬枃浠躲備竴涓渶瑕佹垜浠敞鎰忕殑鏄紝濡傛灉鎴戜滑鐨勬枃浠跺悕涓湁閫氶厤絎︼紝濡傦細“*”錛岄偅涔堝彲浠ョ敤杞箟瀛楃“\”錛屽“\*”鏉ヨ〃紺虹湡瀹炵殑“*”瀛楃錛岃屼笉鏄換鎰忛暱搴︾殑瀛楃涓層?
濂藉惂錛岃繕鏄厛鏉ョ湅鍑犱釜渚嬪瓙鍚э細 鍦ㄤ竴浜涘ぇ鐨勫伐紼嬩腑錛屾湁澶ч噺鐨勬簮鏂囦歡錛屾垜浠氬父鐨勫仛娉曟槸鎶婅繖璁稿鐨勬簮鏂囦歡鍒嗙被錛屽茍瀛樻斁鍦ㄤ笉鍚岀殑鐩綍涓傛墍浠ワ紝褰搈ake闇瑕佸幓鎵懼鏂囦歡鐨勪緷璧栧叧緋繪椂錛屼綘鍙互鍦ㄦ枃浠跺墠鍔犱笂璺緞錛屼絾鏈濂界殑鏂規硶鏄妸涓涓礬寰勫憡璇塵ake錛岃make鍦ㄨ嚜鍔ㄥ幓鎵俱?
Makefile鏂囦歡涓殑鐗規畩鍙橀噺“VPATH”灝辨槸瀹屾垚榪欎釜鍔熻兘鐨勶紝濡傛灉娌℃湁鎸囨槑榪欎釜鍙橀噺錛宮ake鍙細鍦ㄥ綋鍓嶇殑鐩綍涓幓鎵懼渚濊禆鏂囦歡鍜岀洰鏍囨枃浠躲傚鏋滃畾涔変簡榪欎釜鍙橀噺錛岄偅涔堬紝make灝變細鍦ㄥ綋褰撳墠鐩綍鎵句笉鍒扮殑鎯呭喌涓嬶紝鍒版墍鎸囧畾鐨勭洰褰曚腑鍘繪壘瀵繪枃浠朵簡銆? 鍙︿竴涓緗枃浠舵悳绱㈣礬寰勭殑鏂規硶鏄嬌鐢╩ake鐨?#8220;vpath”鍏抽敭瀛楋紙娉ㄦ剰錛屽畠鏄叏灝忓啓鐨勶級錛岃繖涓嶆槸鍙橀噺錛岃繖鏄竴涓猰ake鐨勫叧閿瓧錛岃繖鍜屼笂闈㈡彁鍒扮殑閭d釜VPATH鍙橀噺寰堢被浼鹼紝浣嗘槸瀹冩洿涓虹伒媧匯傚畠鍙互鎸囧畾涓嶅悓鐨勬枃浠跺湪涓嶅悓鐨勬悳绱㈢洰褰曚腑銆傝繖鏄竴涓緢鐏墊椿鐨勫姛鑳姐傚畠鐨勪嬌鐢ㄦ柟娉曟湁涓夌錛?
vapth浣跨敤鏂規硶涓殑< pattern>闇瑕佸寘鍚?#8220;%”瀛楃銆?#8220;%”鐨勬剰鎬濇槸鍖歸厤闆舵垨鑻ュ共瀛楃錛屼緥濡傦紝“%.h”琛ㄧず鎵鏈変互“.h”緇撳熬鐨勬枃浠躲?lt; pattern>鎸囧畾浜嗚鎼滅儲鐨勬枃浠墮泦錛岃?lt; directories>鍒欐寚瀹氫簡
鎴戜滑鍙互榪炵畫鍦頒嬌鐢╲path璇彞錛屼互鎸囧畾涓嶅悓鎼滅儲絳栫暐銆傚鏋滆繛緇殑vpath璇彞涓嚭鐜頒簡鐩稿悓鐨?lt; pattern>錛屾垨鏄閲嶅浜嗙殑< pattern>錛岄偅涔堬紝make浼氭寜鐓path璇彞鐨勫厛鍚庨『搴忔潵鎵ц鎼滅儲銆傚錛? 鏈鏃╁厛鐨勪竴涓緥瀛愪腑錛屾垜浠彁鍒拌繃涓涓?#8220;clean”鐨勭洰鏍囷紝榪欐槸涓涓?#8220;浼洰鏍?#8221;錛? 鍥犱負錛屾垜浠茍涓嶇敓鎴?#8220;clean”榪欎釜鏂囦歡銆?#8220;浼洰鏍?#8221;騫朵笉鏄竴涓枃浠訛紝鍙槸涓涓爣絳撅紝鐢變簬“浼洰鏍?#8221;涓嶆槸鏂囦歡錛屾墍浠ake鏃犳硶鐢熸垚瀹冪殑渚濊禆鍏崇郴鍜屽喅瀹氬畠鏄惁瑕佹墽琛屻傛垜浠彧鏈夐氳繃鏄劇ず鍦版寚鏄庤繖涓?#8220;鐩爣”鎵嶈兘璁╁叾鐢熸晥銆傚綋鐒訛紝“浼洰鏍?#8221;鐨勫彇鍚嶄笉鑳藉拰鏂囦歡鍚嶉噸鍚嶏紝涓嶇劧鍏跺氨澶卞幓浜?#8220;浼洰鏍?#8221;鐨勬剰涔変簡銆?
褰撶劧錛屼負浜嗛伩鍏嶅拰鏂囦歡閲嶅悕鐨勮繖縐嶆儏鍐碉紝鎴戜滑鍙互浣跨敤涓涓壒孌婄殑鏍囪“.PHONY”鏉ユ樉紺哄湴鎸囨槑涓涓洰鏍囨槸“浼洰鏍?#8221;錛屽悜make璇存槑錛屼笉綆℃槸鍚︽湁榪欎釜鏂囦歡錛岃繖涓洰鏍囧氨鏄?#8220;浼洰鏍?#8221;銆? 闅忎究鎻愪竴鍙ワ紝浠庝笂闈㈢殑渚嬪瓙鎴戜滑鍙互鐪嬪嚭錛岀洰鏍囦篃鍙互鎴愪負渚濊禆銆傛墍浠ワ紝浼洰鏍囧悓鏍蜂篃鍙垚涓轟緷璧栥傜湅涓嬮潰鐨勪緥瀛愶細
Makefile鐨勮鍒欎腑鐨勭洰鏍囧彲浠ヤ笉姝竴涓紝鍏舵敮鎸佸鐩爣錛屾湁鍙兘鎴戜滑鐨勫涓洰鏍囧悓鏃朵緷璧栦簬涓涓枃浠訛紝騫朵笖鍏剁敓鎴愮殑鍛戒護澶т綋綾諱技銆備簬鏄垜浠氨鑳芥妸鍏跺悎騫惰搗鏉ャ傚綋鐒訛紝澶氫釜鐩爣鐨勭敓鎴愯鍒欑殑鎵ц鍛戒護鏄悓涓涓紝榪欏彲鑳戒細鍙垜浠甫鏉ラ夯鐑︼紝涓嶈繃濂藉湪鎴戜滑鐨勫彲浠ヤ嬌鐢ㄤ竴涓嚜鍔ㄥ寲鍙橀噺“$@”錛堝叧浜庤嚜鍔ㄥ寲鍙橀噺錛屽皢鍦ㄥ悗闈㈣榪幫級錛岃繖涓彉閲忚〃紺虹潃鐩墠瑙勫垯涓墍鏈夌殑鐩爣鐨勯泦鍚堬紝榪欐牱璇村彲鑳藉緢鎶借薄錛岃繕鏄湅涓涓緥瀛愬惂銆?
闈欐佹ā寮忓彲浠ユ洿鍔犲鏄撳湴瀹氫箟澶氱洰鏍囩殑瑙勫垯錛屽彲浠ヨ鎴戜滑鐨勮鍒欏彉寰楁洿鍔犵殑鏈夊脊鎬у拰鐏墊椿銆傛垜浠繕鏄厛鏉ョ湅涓涓嬭娉曪細
targets瀹氫箟浜嗕竴緋誨垪鐨勭洰鏍囨枃浠訛紝鍙互鏈夐氶厤絎︺傛槸鐩爣鐨勪竴涓泦鍚堛?
target-parrtern鏄寚鏄庝簡targets鐨勬ā寮忥紝涔熷氨鏄殑鐩爣闆嗘ā寮忋?
prereq-parrterns鏄洰鏍囩殑渚濊禆妯″紡錛屽畠瀵箃arget-parrtern褰㈡垚鐨勬ā寮忓啀榪涜涓嬈′緷璧栫洰鏍囩殑瀹氫箟銆?
榪欐牱鎻忚堪榪欎笁涓笢瑗匡紝鍙兘榪樻槸娌℃湁璇存竻妤氾紝榪樻槸涓句釜渚嬪瓙鏉ヨ鏄庝竴涓嬪惂銆傚鏋滄垜浠殑<target-parrtern>瀹氫箟鎴?#8220;%.o”錛屾剰鎬濇槸鎴戜滑鐨?target>闆嗗悎涓兘鏄互“.o”緇撳熬鐨勶紝鑰屽鏋滄垜浠殑<prereq-parrterns>瀹氫箟鎴?#8220;%.c”錛屾剰鎬濇槸瀵?lt;target-parrtern>鎵褰㈡垚鐨勭洰鏍囬泦榪涜浜屾瀹氫箟錛屽叾璁$畻鏂規硶鏄紝鍙?lt;target-parrtern>妯″紡涓殑“%”錛堜篃灝辨槸鍘繪帀浜哰.o]榪欎釜緇撳熬錛夛紝騫朵負鍏跺姞涓奫.c]榪欎釜緇撳熬錛屽艦鎴愮殑鏂伴泦鍚堛?
鎵浠ワ紝鎴戜滑鐨?#8220;鐩爣妯″紡”鎴栨槸“渚濊禆妯″紡”涓兘搴旇鏈?#8220;%”榪欎釜瀛楃錛屽鏋滀綘鐨勬枃浠跺悕涓湁“%”閭d箞浣犲彲浠ヤ嬌鐢ㄥ弽鏂滄潬“\”榪涜杞箟錛屾潵鏍囨槑鐪熷疄鐨?#8220;%”瀛楃銆?
鐪嬩竴涓緥瀛愶細 $(filter %.o,$(files))琛ㄧず璋冪敤Makefile鐨刦ilter鍑芥暟錛岃繃婊?#8220;$filter”闆嗭紝鍙鍏朵腑妯″紡涓?#8220;%.o”鐨勫唴瀹廣傚叾鐨勫畠鍐呭錛屾垜灝變笉鐢ㄥ璇翠簡鍚с傝繖涓緥瀛楀睍紺轟簡Makefile涓洿澶х殑寮規с?
鍦∕akefile涓紝鎴戜滑鐨勪緷璧栧叧緋誨彲鑳戒細闇瑕佸寘鍚竴緋誨垪鐨勫ご鏂囦歡錛屾瘮濡傦紝濡傛灉鎴戜滑鐨刴ain.c涓湁涓鍙?#8220;#include "defs.h"”錛岄偅涔堟垜浠殑渚濊禆鍏崇郴搴旇鏄細 gcc -M main.c鐨勮緭鍑烘槸錛? 浜庢槸錛屾垜浠彲浠ュ啓鍑篬.c]鏂囦歡鍜孾.d]鏂囦歡鐨勪緷璧栧叧緋伙紝騫惰make鑷姩鏇存柊鎴栬嚜鎴怺.d]鏂囦歡錛屽茍鎶婂叾鍖呭惈鍦ㄦ垜浠殑涓籑akefile涓紝榪欐牱錛屾垜浠氨鍙互鑷姩鍖栧湴鐢熸垚姣忎釜鏂囦歡鐨勪緷璧栧叧緋諱簡銆?
榪欓噷錛屾垜浠粰鍑轟簡涓涓ā寮忚鍒欐潵浜х敓[.d]鏂囦歡錛? 榪欎釜瑙勫垯鐨勬剰鎬濇槸錛屾墍鏈夌殑[.d]鏂囦歡渚濊禆浜嶽.c]鏂囦歡錛?#8220;rm -f $@”鐨勬剰鎬濇槸鍒犻櫎鎵鏈夌殑鐩爣錛屼篃灝辨槸[.d]鏂囦歡錛岀浜岃鐨勬剰鎬濇槸錛屼負姣忎釜渚濊禆鏂囦歡“$<”錛屼篃灝辨槸[.c]鏂囦歡鐢熸垚渚濊禆鏂囦歡錛?#8220;$@”琛ㄧず妯″紡“%.d”鏂囦歡錛屽鏋滄湁涓涓狢鏂囦歡鏄痭ame.c錛岄偅涔?#8220;%”灝辨槸“name”錛?#8220;$$$$”鎰忎負涓涓殢鏈虹紪鍙鳳紝絎簩琛岀敓鎴愮殑鏂囦歡鏈夊彲鑳芥槸“name.d.12345”錛岀涓夎浣跨敤sed鍛戒護鍋氫簡涓涓浛鎹紝鍏充簬sed鍛戒護鐨勭敤娉曡鍙傜湅鐩稿叧鐨勪嬌鐢ㄦ枃妗c傜鍥涜灝辨槸鍒犻櫎涓存椂鏂囦歡銆?
鎬昏岃█涔嬶紝榪欎釜妯″紡瑕佸仛鐨勪簨灝辨槸鍦ㄧ紪璇戝櫒鐢熸垚鐨勪緷璧栧叧緋諱腑鍔犲叆[.d]鏂囦歡鐨勪緷璧栵紝鍗蟲妸渚濊禆鍏崇郴錛? 姣忔潯瑙勫垯涓殑鍛戒護鍜屾搷浣滅郴緇烻hell鐨勫懡浠よ鏄竴鑷寸殑銆俶ake浼氫竴鎸夐『搴忎竴鏉′竴鏉$殑鎵ц鍛戒護錛屾瘡鏉″懡浠ょ殑寮澶村繀欏諱互[Tab]閿紑澶達紝闄ら潪錛屽懡浠ゆ槸绱ц窡鍦ㄤ緷璧栬鍒欏悗闈㈢殑鍒嗗彿鍚庣殑銆傚湪鍛戒護琛屼箣闂翠腑鐨勭┖鏍兼垨鏄┖琛屼細琚拷鐣ワ紝浣嗘槸濡傛灉璇ョ┖鏍兼垨絀鴻鏄互Tab閿紑澶寸殑錛岄偅涔坢ake浼氳涓哄叾鏄竴涓┖鍛戒護銆?
鎴戜滑鍦║NIX涓嬪彲鑳戒細浣跨敤涓嶅悓鐨凷hell錛屼絾鏄痬ake鐨勫懡浠ら粯璁ゆ槸琚?#8220;/bin/sh”鈥斺擴NIX鐨勬爣鍑哠hell瑙i噴鎵ц鐨勩傞櫎闈炰綘鐗瑰埆鎸囧畾涓涓叾瀹冪殑Shell銆侻akefile涓紝“#”鏄敞閲婄錛屽緢鍍廋/C++涓殑“//”錛屽叾鍚庣殑鏈瀛楃閮借娉ㄩ噴銆?
閫氬父錛宮ake浼氭妸鍏惰鎵ц鐨勫懡浠よ鍦ㄥ懡浠ゆ墽琛屽墠杈撳嚭鍒板睆騫曚笂銆傚綋鎴戜滑鐢?#8220;@”瀛楃鍦ㄥ懡浠よ鍓嶏紝閭d箞錛岃繖涓懡浠ゅ皢涓嶈make鏄劇ず鍑烘潵錛屾渶鍏蜂唬琛ㄦх殑渚嬪瓙鏄紝鎴戜滑鐢ㄨ繖涓姛鑳芥潵鍍忓睆騫曟樉紺轟竴浜涗俊鎭傚錛? 鑰宮ake鍙傛暟“-s”鎴?#8220;--slient”鍒欐槸鍏ㄩ潰紱佹鍛戒護鐨勬樉紺恒?
褰撲緷璧栫洰鏍囨柊浜庣洰鏍囨椂錛屼篃灝辨槸褰撹鍒欑殑鐩爣闇瑕佽鏇存柊鏃訛紝make浼氫竴鏉′竴鏉$殑鎵ц鍏跺悗鐨勫懡浠ゃ傞渶瑕佹敞鎰忕殑鏄紝濡傛灉浣犺璁╀笂涓鏉″懡浠ょ殑緇撴灉搴旂敤鍦ㄤ笅涓鏉″懡浠ゆ椂錛屼綘搴旇浣跨敤鍒嗗彿鍒嗛殧榪欎袱鏉″懡浠ゃ傛瘮濡備綘鐨勭涓鏉″懡浠ゆ槸cd鍛戒護錛屼綘甯屾湜絎簩鏉″懡浠ゅ緱鍦╟d涔嬪悗鐨勫熀紜涓婅繍琛岋紝閭d箞浣犲氨涓嶈兘鎶婅繖涓ゆ潯鍛戒護鍐欏湪涓よ涓婏紝鑰屽簲璇ユ妸榪欎袱鏉″懡浠ゅ啓鍦ㄤ竴琛屼笂錛岀敤鍒嗗彿鍒嗛殧銆傚錛? 褰撴垜浠墽琛?#8220;make exec”鏃訛紝絎竴涓緥瀛愪腑鐨刢d娌℃湁浣滅敤錛宲wd浼氭墦鍗板嚭褰撳墠鐨凪akefile鐩綍錛岃岀浜屼釜渚嬪瓙涓紝cd灝辮搗浣滅敤浜嗭紝pwd浼氭墦鍗板嚭“/home/hchen”銆?
make涓鑸槸浣跨敤鐜鍙橀噺SHELL涓墍瀹氫箟鐨勭郴緇烻hell鏉ユ墽琛屽懡浠わ紝榛樿鎯呭喌涓嬩嬌鐢║NIX鐨勬爣鍑哠hell鈥斺?bin/sh鏉ユ墽琛屽懡浠ゃ備絾鍦∕S-DOS涓嬫湁鐐圭壒孌婏紝鍥犱負MS-DOS涓嬫病鏈塖HELL鐜鍙橀噺錛屽綋鐒朵綘涔熷彲浠ユ寚瀹氥傚鏋滀綘鎸囧畾浜哢NIX椋庢牸鐨勭洰褰曞艦寮忥紝棣栧厛錛宮ake浼氬湪SHELL鎵鎸囧畾鐨勮礬寰勪腑鎵懼鍛戒護瑙i噴鍣紝濡傛灉鎵句笉鍒幫紝鍏朵細鍦ㄥ綋鍓嶇洏絎︿腑鐨勫綋鍓嶇洰褰曚腑瀵繪壘錛屽鏋滃啀鎵句笉鍒幫紝鍏朵細鍦≒ATH鐜鍙橀噺涓墍瀹氫箟鐨勬墍鏈夎礬寰勪腑瀵繪壘銆侻S-DOS涓紝濡傛灉浣犲畾涔夌殑鍛戒護瑙i噴鍣ㄦ病鏈夋壘鍒幫紝鍏朵細緇欎綘鐨勫懡浠よВ閲婂櫒鍔犱笂璇稿“.exe”銆?#8220;.com”銆?#8220;.bat”銆?#8220;.sh”絳夊悗緙銆?
姣忓綋鍛戒護榪愯瀹屽悗錛宮ake浼氭嫻嬫瘡涓懡浠ょ殑榪斿洖鐮侊紝濡傛灉鍛戒護榪斿洖鎴愬姛錛岄偅涔坢ake浼氭墽琛屼笅涓鏉″懡浠わ紝褰撹鍒欎腑鎵鏈夌殑鍛戒護鎴愬姛榪斿洖鍚庯紝榪欎釜瑙勫垯灝辯畻鏄垚鍔熷畬鎴愪簡銆傚鏋滀竴涓鍒欎腑鐨勬煇涓懡浠ゅ嚭閿欎簡錛堝懡浠ら鍑虹爜闈為浂錛夛紝閭d箞make灝變細緇堟鎵ц褰撳墠瑙勫垯錛岃繖灝嗘湁鍙兘緇堟鎵鏈夎鍒欑殑鎵ц銆?
鏈変簺鏃跺欙紝鍛戒護鐨勫嚭閿欏茍涓嶈〃紺哄氨鏄敊璇殑銆備緥濡俶kdir鍛戒護錛屾垜浠竴瀹氶渶瑕佸緩绔嬩竴涓洰褰曪紝濡傛灉鐩綍涓嶅瓨鍦紝閭d箞mkdir灝辨垚鍔熸墽琛岋紝涓囦簨澶у悏錛屽鏋滅洰褰曞瓨鍦紝閭d箞灝卞嚭閿欎簡銆傛垜浠箣鎵浠ヤ嬌鐢╩kdir鐨勬剰鎬濆氨鏄竴瀹氳鏈夎繖鏍風殑涓涓洰褰曪紝浜庢槸鎴戜滑灝變笉甯屾湜mkdir鍑洪敊鑰岀粓姝㈣鍒欑殑榪愯銆?
涓轟簡鍋氬埌榪欎竴鐐癸紝蹇界暐鍛戒護鐨勫嚭閿欙紝鎴戜滑鍙互鍦∕akefile鐨勫懡浠よ鍓嶅姞涓涓噺鍙?#8220;-”錛堝湪Tab閿箣鍚庯級錛屾爣璁頒負涓嶇鍛戒護鍑轟笉鍑洪敊閮借涓烘槸鎴愬姛鐨勩傚錛? 榪樻湁涓涓鎻愪竴涓嬬殑make鐨勫弬鏁扮殑鏄?#8220;-k”鎴栨槸“--keep-going”錛岃繖涓弬鏁扮殑鎰忔濇槸錛屽鏋滄煇瑙勫垯涓殑鍛戒護鍑洪敊浜嗭紝閭d箞灝辯粓鐩瑙勫垯鐨勬墽琛岋紝浣嗙戶緇墽琛屽叾瀹冭鍒欍?
鍦ㄤ竴浜涘ぇ鐨勫伐紼嬩腑錛屾垜浠細鎶婃垜浠笉鍚屾ā鍧楁垨鏄笉鍚屽姛鑳界殑婧愭枃浠舵斁鍦ㄤ笉鍚岀殑鐩綍涓紝鎴戜滑鍙互鍦ㄦ瘡涓洰褰曚腑閮戒功鍐欎竴涓鐩綍鐨凪akefile錛岃繖鏈夊埄浜庤鎴戜滑鐨凪akefile鍙樺緱鏇村姞鍦扮畝媧侊紝鑰屼笉鑷充簬鎶婃墍鏈夌殑涓滆タ鍏ㄩ儴鍐欏湪涓涓狹akefile涓紝榪欐牱浼氬緢闅劇淮鎶ゆ垜浠殑Makefile錛岃繖涓妧鏈浜庢垜浠ā鍧楃紪璇戝拰鍒嗘緙栬瘧鏈夌潃闈炲父澶х殑濂藉銆?
渚嬪錛屾垜浠湁涓涓瓙鐩綍鍙玸ubdir錛岃繖涓洰褰曚笅鏈変釜Makefile鏂囦歡錛屾潵鎸囨槑浜嗚繖涓洰褰曚笅鏂囦歡鐨勭紪璇戣鍒欍傞偅涔堟垜浠繪帶鐨凪akefile鍙互榪欐牱涔﹀啓錛? 鎴戜滑鎶婅繖涓狹akefile鍙仛“鎬繪帶Makefile”錛屾繪帶Makefile鐨勫彉閲忓彲浠ヤ紶閫掑埌涓嬬駭鐨凪akefile涓紙濡傛灉浣犳樉紺虹殑澹版槑錛夛紝浣嗘槸涓嶄細瑕嗙洊涓嬪眰鐨凪akefile涓墍瀹氫箟鐨勫彉閲忥紝闄ら潪鎸囧畾浜?#8220;-e”鍙傛暟銆?
濡傛灉浣犺浼犻掑彉閲忓埌涓嬬駭Makefile涓紝閭d箞浣犲彲浠ヤ嬌鐢ㄨ繖鏍風殑澹版槑錛?
闇瑕佹敞鎰忕殑鏄紝鏈変袱涓彉閲忥紝涓涓槸SHELL錛屼竴涓槸MAKEFLAGS錛岃繖涓や釜鍙橀噺涓嶇浣犳槸鍚xport錛屽叾鎬繪槸瑕佷紶閫掑埌涓嬪眰Makefile涓紝鐗瑰埆鏄疢AKEFILES鍙橀噺錛屽叾涓寘鍚簡make鐨勫弬鏁頒俊鎭紝濡傛灉鎴戜滑鎵ц“鎬繪帶Makefile”鏃舵湁make鍙傛暟鎴栨槸鍦ㄤ笂灞侻akefile涓畾涔変簡榪欎釜鍙橀噺錛岄偅涔圡AKEFILES鍙橀噺灝嗕細鏄繖浜涘弬鏁幫紝騫朵細浼犻掑埌涓嬪眰Makefile涓紝榪欐槸涓涓郴緇熺駭鐨勭幆澧冨彉閲忋?
浣嗘槸make鍛戒護涓殑鏈夊嚑涓弬鏁板茍涓嶅線涓嬩紶閫掞紝瀹冧滑鏄?#8220;-C”,“-f”,“-h”“-o”鍜?#8220;-W”錛堟湁鍏矼akefile鍙傛暟鐨勭粏鑺傚皢鍦ㄥ悗闈㈣鏄庯級錛屽鏋滀綘涓嶆兂寰涓嬪眰浼犻掑弬鏁幫紝閭d箞錛屼綘鍙互榪欐牱鏉ワ細 榪樻湁涓涓湪“宓屽鎵ц”涓瘮杈冩湁鐢ㄧ殑鍙傛暟錛?#8220;-w”鎴栨槸“--print-directory”浼氬湪make鐨勮繃紼嬩腑杈撳嚭涓浜涗俊鎭紝璁╀綘鐪嬪埌鐩墠鐨勫伐浣滅洰褰曘傛瘮濡傦紝濡傛灉鎴戜滑鐨勪笅綰ake鐩綍鏄?#8220;/home/hchen/gnu/make”錛屽鏋滄垜浠嬌鐢?#8220;make -w”鏉ユ墽琛岋紝閭d箞褰撹繘鍏ヨ鐩綍鏃訛紝鎴戜滑浼氱湅鍒幫細 濡傛灉Makefile涓嚭鐜頒竴浜涚浉鍚屽懡浠ゅ簭鍒楋紝閭d箞鎴戜滑鍙互涓鴻繖浜涚浉鍚岀殑鍛戒護搴忓垪瀹氫箟涓涓彉閲忋傚畾涔夎繖縐嶅懡浠ゅ簭鍒楃殑璇硶浠?#8220;define”寮濮嬶紝浠?#8220;endef”緇撴潫錛屽錛? 璁稿鎿嶇旱絎︿嬌鎴戜滑鑳藉鏀瑰彉杈撳嚭鐨勫瑙傘傛湁涓ゅぇ綾葷殑杈撳嚭鎺у埗錛氭帶鍒舵暟鍊肩殑琛ㄧず錛屼互鍙婃帶鍒跺~鍏呯鐨勬暟閲忓拰甯冨眬銆?/p>
鏀瑰彉瀵硅薄鏍煎紡鍖栫姸鎬佺殑鎿嶇旱絎︾殑涓涓緥瀛愭槸 boolalpha 鎿嶇旱絎︺傞粯璁ゆ儏鍐典笅錛屽皢 bool 鍊兼樉紺轟負 1 鎴?0錛?tt>true 鍊兼樉紺轟負 1錛岃?false 鍊兼樉紺轟負 0銆傚彲浠ラ氳繃嫻佺殑 boolalpha 鎿嶇旱絎﹁鐩栬繖涓牸寮忓寲錛?/p>
鎵ц鏃訛紝榪欐紼嬪簭浜х敓涓嬮潰鐨勮緭鍑猴細 涓鏃﹀皢 boolalpha “鍐?#8221;鑷?cout錛屼粠榪欎釜鐐硅搗灝辨敼鍙樹簡 cout 灝嗘庢牱鏄劇ず bool 鍊鹼紝鍚庣畫鏄劇ず bool 鍊肩殑鎿嶄綔灝嗙敤 true 鎴?false 榪涜鏄劇ず銆?/p>
瑕佸彇娑?cout 鐨勬牸寮忕姸鎬佹敼鍙橈紝蹇呴』搴旂敤 noboolalpha錛?/p>
鐜板湪鍙敼鍙?bool 鍊肩殑鏍煎紡鍖栨潵鏄劇ず bool_val錛屽茍涓旂珛鍗沖皢嫻侀噸緗負鍘熸潵鐨勭姸鎬併?/p>
榛樿鎯呭喌涓嬶紝鐢ㄥ崄榪涘埗璇誨啓鏁村瀷鍊箋傞氳繃浣跨敤鎿嶇旱絎?hex銆?tt>oct 鍜?dec錛岀▼搴忓憳鍙互灝嗚〃紺鴻繘鍒舵敼涓哄叓榪涘埗銆佸崄鍏繘鍒舵垨鎭㈠鍗佽繘鍒訛紙嫻偣鍊肩殑琛ㄧず涓嶅彈褰卞搷錛夛細 緙栬瘧鍜屾墽琛岀殑鏃跺欙紝紼嬪簭浜х敓涓嬮潰鐨勮緭鍑猴細 娉ㄦ剰錛屽儚 boolalpha 涓鏍鳳紝榪欎簺鎿嶇旱絎︽敼鍙樻牸寮忕姸鎬併傚畠浠獎鍝嶇揣鎺ュ湪鍚庨潰鐨勮緭鍑猴紝浠ュ強鎵鏈夊悗緇殑鏁村瀷杈撳嚭錛岀洿鍒伴氳繃璋冪敤鍙︿竴鎿嶇旱絎﹂噸鍥存牸寮忎負姝€?/p>
榛樿鎯呭喌涓嬶紝鏄劇ず鏁板肩殑鏃跺欙紝涓嶅瓨鍦ㄥ叧浜庢墍鐢ㄥ熀鏁扮殑鍙璁板彿銆備緥濡傦紝20 鏄?20,榪樻槸 16 鐨勫叓榪涘埗琛ㄧず錛熸寜鍗佽繘鍒舵ā寮忔樉紺烘暟鍊肩殑鏃跺欙紝浼氭寜鎴戜滑鏈熷緟鐨勬牸寮忔墦鍗版暟鍊箋傚鏋滈渶瑕佹墦鍗板叓榪涘埗鎴栧崄鍏繘鍒跺鹼紝鍙兘搴旇涔熶嬌鐢?showbase 鎿嶇旱絎︺?tt>showbase 鎿嶇旱絎﹀鑷磋緭鍑烘祦浣跨敤鐨勭害瀹氾紝涓庢寚瀹氭暣鍨嬪父閲忓熀鏁版墍鐢ㄧ殑鐩稿悓錛?/p>
浠?0x 涓哄墠瀵艱〃紺哄崄鍏繘鍒躲?/p>
浠?0 涓哄墠瀵艱〃紺哄叓榪涘埗銆?/p>
娌℃湁浠諱綍鍓嶅琛ㄧず鍗佽繘鍒躲?/p>
淇敼紼嬪簭浣跨敤 showbase 濡備笅錛?/p>
淇敼鍚庣殑杈撳嚭浣垮緱鍩虹鍊煎埌搴曟槸浠涔堝緢娓呮錛?/p>
noshowbase 鎿嶇旱絎﹂噸緗?cout錛屼互渚垮畠涓嶅啀鏄劇ず鏁村瀷鍊肩殑琛ㄧず鍩烘暟銆?/p>
榛樿鎯呭喌涓嬶紝鍗佸叚榪涘埗鍊肩敤甯﹀皬鍐?x 鐨勫皬鍐欏艦寮忔墦鍗般傚彲浠ュ簲鐢?uppercase 鎿嶇旱絎︽樉紺?X 騫跺皢鍗佸叚榪涘埗鏁板瓧 a - f 鏄劇ず涓哄ぇ鍐欏瓧姣嶃?/p>
鍓嶉潰鐨勭▼搴忎駭鐢熶笅闈㈢殑杈撳嚭錛?/p>
瑕佹仮澶嶅皬鍐欙紝灝卞簲鐢?nouppercase 鎿嶇旱絎︺?/p>
瀵逛簬嫻偣鍊肩殑鏍煎紡鍖栵紝鍙互鎺у埗涓嬮潰涓変釜鏂歸潰錛?/p>
綺懼害錛氭樉紺哄灝戜綅鏁板瓧銆?/p>
璁版暟娉曪細鐢ㄥ皬鏁拌繕鏄瀛﹁娉曟硶鏄劇ず銆?/p>
瀵規槸鏁存暟鐨勬誕鐐瑰肩殑灝忔暟鐐圭殑澶勭悊銆?/p>
榛樿鎯呭喌涓嬶紝浣跨敤鍏綅鏁板瓧鐨勭簿搴︽樉紺烘誕鐐瑰箋傚鏋滃兼病鏈夊皬鏁伴儴鍒嗭紝鍒欑渷鐣ュ皬鏁扮偣銆備嬌鐢ㄥ皬鏁板艦寮忚繕鏄瀛﹁鏁版硶鏄劇ず鏁板煎彇鍐充簬琚樉紺虹殑嫻偣鏁扮殑鍊鹼紝鏍囧噯搴撻夋嫨澧炲己鏁板煎彲璇繪х殑鏍煎紡錛岄潪甯稿ぇ鍜岄潪甯稿皬鐨勫間嬌鐢ㄧ瀛﹁鏁版硶鏄劇ず錛屽叾浠栧間嬌鐢ㄥ皬鏁板艦寮忋?/p>
榛樿鎯呭喌涓嬶紝綺懼害鎺у埗鏄劇ず鐨勬暟瀛楁諱綅鏁般傛樉紺虹殑鏃跺欙紝灝嗘誕鐐瑰煎洓鑸嶄簲鍏ュ埌褰撳墠綺懼害銆傚洜姝わ紝濡傛灉褰撳墠綺懼害鏄?4錛屽垯 3.14159 鎴愪負 3.142錛涘鏋滅簿搴︽槸 3錛屾墦鍗頒負 3.14銆?/p>
閫氳繃鍚嶄負 precision 鐨勬垚鍛樺嚱鏁幫紝鎴栬呴氳繃浣跨敤 setprecision 鎿嶇旱絎︼紝鍙互鏀瑰彉綺懼害銆?tt>precision 鎴愬憳鏄噸杞界殑錛?a >絎?7.8 鑺?/font>錛夛細涓涓増鏈帴鍙椾竴涓?int 鍊煎茍灝嗙簿搴﹁緗負閭d釜鏂板鹼紝瀹冭繑鍥?span>鍏堝墠鐨勭簿搴﹀鹼紱鍙︿竴涓増鏈笉鎺ュ彈瀹炲弬騫惰繑鍥炲綋鍓嶇簿搴﹀箋?tt>setprecision 鎿嶇旱絎︽帴鍙椾竴涓疄鍙傦紝鐢ㄦ潵璁劇疆綺懼害銆?/p>
涓嬮潰鐨勭▼搴忚鏄庢帶鍒舵樉紺烘誕鐐瑰兼墍鐢ㄧ簿搴︾殑涓嶅悓鏂規硶錛?/p>
緙栬瘧騫舵墽琛屽悗錛岀▼搴忎駭鐢熶笅闈㈢殑杈撳嚭錛?/p>
榪欎釜紼嬪簭璋冪敤鏍囧噯搴撲腑鐨?sqrt 鍑芥暟錛屽彲浠ュ湪澶存枃浠?cmath 涓壘鍒板畠銆?tt>sqrt 鍑芥暟閲忛噸杞界殑錛屽彲浠ョ敤 float銆?tt>double 鎴?long double 瀹炲弬璋冪敤錛屽畠榪斿洖瀹炲弬鐨勫鉤鏂規牴銆?/p>
鎿嶇旱絎﹀拰鍏朵粬鎺ュ彈瀹炲弬鐨勬搷綰電瀹氫箟鍦ㄥご鏂囦歡 iomanip 涓?/p>
榛樿鎯呭喌涓嬶紝鐢ㄤ簬鏄劇ず嫻偣鍊肩殑璁版暟娉曞彇鍐充簬鏁扮殑澶у皬錛氬鏋滄暟寰堝ぇ鎴栧緢灝忥紝灝嗘寜縐戝璁版暟娉曟樉紺猴紝鍚﹀垯錛屼嬌鐢ㄥ浐瀹氫綅鏁扮殑灝忔暟銆傛爣鍑嗗簱閫夋嫨浣垮緱鏁板鏄撻槄璇葷殑璁版暟娉曘?/p>
灝嗘誕鐐規暟鏄劇ず涓烘櫘閫氭暟錛堢浉瀵逛簬鏄劇ず璐у竵銆佺櫨鍒嗘瘮錛岄偅鏃舵垜浠笇鏈涙帶鍒跺肩殑澶栬錛夌殑鏃跺欙紝閫氬父鏈濂借鏍囧噯搴撴潵閫夋嫨浣跨敤鐨勮鏁版硶銆傝寮哄埗縐戝璁版暟娉曟垨鍥哄畾浣嶆暟灝忔暟鐨勪竴縐嶆儏鍐墊槸鍦ㄦ樉紺鴻〃鐨勬椂鍊欙紝琛ㄤ腑鐨勫皬鏁扮偣搴旇瀵歸綈銆?/p>
濡傛灉甯屾湜寮哄埗縐戝璁版暟娉曟垨鍥哄畾浣嶆暟灝忔暟琛ㄧず錛屽彲浠ラ氳繃浣跨敤閫傚綋鐨勬搷綰電鍋氬埌榪欎竴鐐癸細scientific 鎿嶇旱絎﹀皢嫻佸彉涓轟嬌鐢ㄧ瀛﹁鏁版硶銆傚儚鍦ㄥ崄鍏繘鍒跺間笂鏄劇ず x 涓鏍鳳紝涔熷彲浠ラ氳繃 uppercase 鎿嶇旱絎︽帶鍒剁瀛﹁鏁版硶涓殑 e銆?tt>fixed 鎿嶇旱絎﹀皢嫻佷負浣跨敤鍥哄畾浣嶆暟灝忔暟琛ㄧず銆?/p>
榪欎簺鎿嶇旱絎︽敼鍙樻祦綺懼害鐨勯粯璁ゅ惈涔夈傛墽琛?scientific 鎴?fixed 涔嬪悗錛岀簿搴﹀兼帶鍒跺皬鏁扮偣涔嬪悗鐨勬暟浣嶃傞粯璁ゆ儏鍐典笅錛岀簿搴︽寚瀹氭暟瀛楃殑鎬諱綅鏁扳斺斿皬鏁扮偣涔嬪墠鍜屼箣鍚庛備嬌鐢?fixed 鎴?scientific 鍛藉悕鎴戜滑鑳藉鎸夊垪瀵歸綈鏉ユ樉紺烘暟錛岃繖涓絳栫暐淇濊瘉灝忔暟鐐規繪槸鍦ㄧ浉瀵逛簬琚樉紺虹殑灝忔暟閮ㄥ垎鍥哄畾鐨勪綅緗?/p>
涓庡叾浠栨搷綰電涓嶅悓錛屼笉瀛樺湪灝嗘祦鎭㈠涓烘牴鎹鏄劇ず鍊奸夋嫨璁版暟娉曠殑榛樿鐘舵佺殑鎿嶇旱絎︼紝鐩稿弽錛屾垜浠繀欏昏皟鐢?unsetf 鎴愬憳鏉ュ彇娑?scientific 鎴?fixed 鎵鍋氱殑鏀瑰彉銆傝灝嗘祦鎭㈠涓烘誕鐐瑰肩殑榛樿澶勭悊錛屽皢鍚嶄負 floatfield 鐨勬爣鍑嗗簱瀹氫箟鍊間紶緇?unsetf 鍑芥暟錛?/p>
闄や簡鍙栨秷瀹冧滑鐨勬晥鏋滀箣澶栵紝浣跨敤榪欎簺鎿嶇旱絎﹀儚浣跨敤浠繪剰鍏朵粬鎿嶇旱絎︿竴鏍鳳細 浜х敓濡備笅杈撳嚭錛?/p>
榛樿鎯呭喌涓嬶紝褰撴誕鐐瑰肩殑灝忔暟閮ㄥ垎涓?0 鐨勬椂鍊欙紝涓嶆樉紺哄皬鏁扮偣銆?tt>showpoint 鎿嶇旱絎﹀己鍒舵樉紺哄皬鏁扮偣錛?/p>
noshowpoint 鎿嶇旱絎︽仮澶嶉粯璁よ涓恒備笅涓涓緭鍑鴻〃杈懼紡灝嗗叿鏈夐粯璁よ涓猴紝鍗籌紝濡傛灉嫻偣鍊煎皬鏁伴儴鍒嗕負 0,灝卞彇娑堝皬鏁扮偣銆?/p>
鎸夋爮鏄劇ず鏁版嵁鐨勬椂鍊欙紝緇忓父寰堝笇鏈涘緢濂藉湴鎺у埗鏁版嵁鐨勬牸寮忓寲銆傛爣鍑嗗簱鎻愪緵涓嬮潰鍑犱釜鎿嶇旱甯姪鎴戜滑瀹炵幇闇瑕佺殑鎺у埗錛?/p>
setw錛屾寚瀹氫笅涓涓暟鍊兼垨瀛楃涓茬殑鏈灝忛棿闅斻?/p>
left錛屽乏瀵歸綈杈撳嚭銆?/p>
right錛屽彸瀵歸綈杈撳嚭銆傝緭鍑洪粯璁や負鍙沖榻愩?/p>
internal錛屾帶鍒惰礋鍊肩殑絎﹀彿浣嶇疆銆?tt>internal 宸﹀榻愮鍙蜂笖鍙沖榻愬鹼紝鐢ㄧ┖鏍煎~鍏呬粙浜庡叾闂寸殑絀洪棿銆?/p>
setfill錛屼嬌鎴戜滑鑳藉鎸囧畾濉厖杈撳嚭鏃朵嬌鐢ㄧ殑鍙︿竴涓瓧絎︺傞粯璁ゆ儏鍐典笅錛屽兼槸絀烘牸銆?/p>
鍍?endl 涓鏍鳳紝setw 涓嶆敼鍙樿緭鍑烘祦鐨勫唴閮ㄧ姸鎬侊紝瀹冨彧鍐沖畾涓嬩竴涓緭鍑虹殑闀垮害銆?/p>
涓嬮潰紼嬪簭孌佃鏄庝簡榪欎簺鎿嶇旱絎︼細 鎵ц鏃訛紝璇ョ▼搴忔浜х敓濡備笅杈撳嚭錛?/p>
榛樿鎯呭喌涓嬶紝杈撳叆鎿嶄綔絎﹀拷鐣ョ┖鐧斤紙絀烘牸銆佸埗琛ㄧ銆佹崲琛岀銆佽繘綰稿拰鍥炶濺錛夈傚涓嬮潰鐨勫驚鐜細 緇欏畾杈撳叆搴忓垪 寰幆鎵ц鍥涙浠庡瓧絎?a 璇誨埌 d錛岃煩榪囦粙浜庡叾闂寸殑絀烘牸銆佸彲鑳界殑鍒惰〃絎﹀拰鎹㈣絎︺傝紼嬪簭孌電殑杈撳嚭鏄細 noskipws 鎿嶇旱絎﹀鑷磋緭鍏ユ搷浣滅璇伙紙鑰屼笉鏄煩榪囷級絀虹櫧銆傝榪斿洖榛樿琛屼負錛屽簲鐢?skipws 鎿嶇旱絎︼細 緇欏畾涓庡墠闈㈢浉鍚岀殑杈撳叆錛岃寰幆榪涜 7 嬈¤凱浠o紝璇昏緭鍏ヤ腑鐨勭┖鐧戒互鍙婂瓧絎︺傝寰幆浜х敓濡備笅杈撳嚭錛?/p>
榪勪粖涓烘錛岀ず渚嬬▼搴忎腑鍙嬌鐢ㄨ繃鏍煎紡鍖栫殑 IO 鎿嶄綔銆傝緭鍏ュ拰杈撳嚭鎿嶄綔絎︼紙<< 鍜?>>錛夋牴鎹澶勭悊鏁版嵁鐨勭被鍨嬫牸寮忓寲鎵璇誨啓鐨勬暟鎹傝緭鍏ユ搷浣滅蹇界暐絀虹櫧錛岃緭鍑烘搷浣滅搴旂敤濉厖銆佺簿搴︾瓑銆?/p>
鏍囧噯搴撹繕鎻愪緵浜嗕赴瀵岀殑鏀寔鏈牸寮忓寲 IO 鐨勪綆綰ф搷浣滐紝榪欎簺鎿嶄綔浣挎垜浠兘澶熷皢嫻佷綔涓烘湭瑙i噴鐨勫瓧鑺傚簭鍒楀鐞嗭紝鑰屼笉鏄綔涓烘暟鎹被鍨嬶紙濡?char銆?tt>int銆?tt>string 絳夛級鐨勫簭鍒楀鐞嗐?/p>
鎵浠ヨВ鍐蟲柟娉曟湁涓変釜鍗?
1.鐢∣nEraseBkGnd瀹炵幇,涓嶈璋冪敤鍘熸潵鐨凮nEraseBkGnd鍑芥暟.
2.鐢∣nPaint瀹炵幇,鍚屾椂閲嶈澆OnEraseBkGnd,鍏朵腑鐩存帴榪斿洖.
3.鐢∣nPaint瀹炵幇,鍒涘緩紿楀彛鏃惰緗儗鏅埛涓虹┖
4.鐢∣nPaint瀹炵幇,浣嗘槸瑕佹眰鍒鋒柊鏃剁敤Invalidate(FALSE)榪欐牱
鐨勫嚱鏁?(涓嶈繃榪欑鎯呭喌涓?紿楀彛瑕嗙洊絳夐犳垚鐨勫埛鏂拌繕鏄闂竴
涓?鎵浠ヤ笉鏄交搴曠殑瑙e喅鏂規硶)
閮芥尯綆鍗曠殑.
鍓嘜nEraseBkgnd()鎵鍋氱殑浜嬪氨鏄妸鎸夐垥鐣垚鐏拌壊
鑰孫nPaint()鎵鍋氱殑浜?灝辨槸鐣笂鏂囧瓧
鏃㈢劧閫欏叐鍊媘ember function閮芥槸鐢ㄤ締鐣嚭鍏冧歡鐨?br>閭g偤浣曢倓瑕佸垎OnPaint() 鑸?OnEraseBkgnd() 鍛?br>鍏跺OnPaint() 鑸?OnEraseBkgnd() 鐗規ф槸鏈夊樊鐨?br>1.
2.
3.
濡傛灉鎴戝戞槸涓鍊嬪湪鍋氬湒褰㈠寲浣跨敤鑰呬粙闈㈢殑浜?br>甯告渻闇瑕佹妸涓寮電編緹庣殑鍦栫墖璦偤鎴戝慸ialog鐨勫簳鍦?br>鎶婄躬鍦栫殑紼嬪紡紕兼斁鍦∣nPaint() 涔嬩腑 鍙兘鏈冨父紕板埌涓浜涘晱欏?br>姣旀柟瑾嫋鏇充竴鍊嬭紿楀湪鎴戝戝仛鐨刣ialog涓婇潰涓鐩寸Щ鍕?br>鍓嘾ialog鏈冭畩鎴愮伆鑹?鐩村埌鍕曚綔鍋滄鎵嶆仮寰?br>閫欐槸鍥犵偤姣忔闇瑕侀噸綣殑鏅傚?紼嬪紡閮芥渻棣笂鍛煎彨OnEraseBkgnd()
OnEraseBkgnd()灝辨妸dialog鐣垚鐏拌壊
鑰屽彧鏈夊嫊浣滃仠姝箣寰?紼嬪紡鎵嶆渻鍛煎彨OnPaint() 閫欐檪鎵嶆渻鎶婃垜鍊戣鐣殑搴曞湒璨間笂鍘?br>
閫欏嬪晱欏岀殑瑙f硶 姣旇純宸粸鐨勬柟娉曟槸鎶奜nEraseBkgnd() 鏀瑰鎴愪笉鍋氫簨鐨刦unction
濡備笅鎵紺?/font>
{
}
紼嬪紡渚夸笉鏈冪暙涓婄伆鑹茬殑搴曡壊浜?/font>
姣旇純濂界殑鍋氭硶鏄洿鎺ュ皣綣湒鐨勭▼寮忓緸OnPaint()縐誨埌OnEraseBkgnd()渚嗗仛
濡備笅鎵紺?/font>
// m_bmpBKGND 鐐轟竴CBitmap鐗╀歡 涓斾簨鍏堟棭宸茶級鍏ユ垜鍊戠殑搴曞湒
// 搴曞湒鐨勫ぇ灝忚垏鎴戝戠殑瑕栫獥client澶у皬涓鑷?br>
BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
}
鐗瑰垾瑕佹敞鎰忕殑鏄?鍙栧緱閲嶇暙澶у皬鏄嬌鐢℅etUpdateRect() 鑰屼笉鏄疓etClientRect()
濡傛灉浣跨敤GetClientRect() 鏈冩妸涓嶈┎閲嶇暙鐨勫湴鏂歸噸鐣?/font>
The WM_PAINT message is sent when the UpdateWindow or RedrawWindow member function is called.
2) OnPaint()璋冪敤OnDraw()錛孫nPrint涔熶細璋冪敤OnDraw()錛屾墍浠nDraw()鏄樉紺哄拰鎵撳嵃鐨勫叡鍚屾搷浣溿?br>
OnPaint鏄疻M_PAINT娑堟伅寮曞彂鐨勯噸緇樻秷鎭鐞嗗嚱鏁幫紝鍦∣nPaint涓細璋冪敤OnDraw鏉ヨ繘琛岀粯鍥俱侽nPaint涓鍏堟瀯閫犱竴涓狢PaintDC綾誨緱瀹炰緥錛岀劧鍚庝竴榪欎釜瀹炰緥涓哄弬鏁版潵璋冪敤铏氬嚱鏁癘nPrepareDC鏉ヨ繘琛屼竴浜涚粯鍒跺墠鐨勪竴浜涘鐞嗭紝姣旇緗槧灝勬ā寮忥紝鏈鍚庤皟鐢∣nDraw銆傝?/font>OnDraw鍜?/strong>OnPrepareDC涓嶆槸娑堟伅澶勭悊鍑芥暟銆傛墍浠ュ湪涓嶆槸鍥犱負閲嶇粯娑堟伅鎵寮曞彂鐨凮nPaint瀵艱嚧OnDraw琚皟鐢ㄦ椂錛屾瘮濡傚湪OnLButtonDown絳夋秷鎭鐞嗗嚱鏁頒腑緇樺浘鏃訛紝瑕佸厛鑷繁璋冪敤OnPrepareDC銆?br>鑷充簬CPaintDC鍜孋ClientDC鏍規湰鏄袱鍥炰簨鎯?CPaintDC鏄竴涓澶囩幆澧冪被錛屽湪OnPaint涓綔涓哄弬鏁頒紶閫掔粰OnPrepareDC鏉ヤ綔璁懼鐜鐨勮緗傜湡姝e拰CClientDC鍏鋒湁鍙瘮鎬х殑鏄疌WindowDC錛屼粬浠竴涓槸鎻忚堪瀹㈡埛鍖哄煙錛屼竴涓槸鎻忚堪鏁翠釜灞忓箷銆?br>濡傛灉鏄CVIEW鎴栦粠CVIEW綾繪淳鐢熺殑紿楀彛緇樺浘鏃跺簲璇ョ敤OnDraw銆?/font>
void CView::OnPaint() //瑙乂IEWCORE.CPP
{
OnPrepareDC(&dc)錛?br>OnDraw(&dc);
}
///CView榛樿鐨勬爣鍑嗙殑OnPrint鍑芥暟
void CView::OnPrint(CDC* pDC, CPrintInfo*)
{
ASSERT_VALID(pDC);
OnDraw(pDC);
}
{
CString s = pDoc->GetData();
GetClientRect( &rect ); // Returns a CString CRect rect;
pDC->SetTextAlign( TA_BASELINE | TA_CENTER );
pDC->TextOut( rect.right / 2, rect.bottom / 2, s, s.GetLength() );
}
鏈鍚庯細鐜板湪澶у鏄庣櫧榪欏摜淇╀箣闂寸殑鍏崇郴浜嗗惂銆傚洜姝ゆ垜浠竴鑸敤OnPaint緇存姢紿楀彛鐨勫鎴峰尯錛堜緥濡傛垜浠殑紿楀彛瀹㈡埛鍖哄姞涓涓儗鏅浘鐗囷級錛岀敤OnDraw緇存姢瑙嗗浘鐨勫鎴峰尯錛堜緥濡傛垜浠氳繃榧犳爣鍦ㄨ鍥句腑鐢誨浘錛夈傚綋鐒朵綘涔熷彲浠ヤ笉鎸夌収涓婇潰瑙勫緥鏉ワ紝鍙杈懼埌鐩殑騫朵笖娌℃湁闂錛屾庝箞騫查兘鎴愩傝ˉ鍏咃細鎴戜滑榪樺彲浠ュ埄鐢↖nvalidate(),ValidateRgn(),ValidateRect()鍑芥暟寮哄埗鐨勯噸鐢葷獥鍙o紝鍏蜂綋鐨勮鍙傝僊SDN鍚с?/font>
OnDraw 閲嶅啓錛?br>閫氳繃璋冪敤鎮ㄦ彁渚涚殑鏂囨。鎴愬憳鍑芥暟鑾峰彇鏁版嵁銆?br>閫氳繃璋冪敤妗嗘灦浼犻掔粰 OnDraw 鐨勮澶囦笂涓嬫枃瀵硅薄鐨勬垚鍛樺嚱鏁版潵鏄劇ず鏁版嵁銆?br>褰撴枃妗g殑鏁版嵁浠ユ煇縐嶆柟寮忔洿鏀瑰悗錛屽繀欏婚噸緇樿鍥句互鍙嶆槧璇ユ洿鏀廣傞粯璁ょ殑 OnUpdate 瀹炵幇浣胯鍥劇殑鏁翠釜宸ヤ綔鍖烘棤鏁堛傚綋瑙嗗浘鍙樺緱鏃犳晥鏃訛紝Windows 灝?WM_PAINT 娑堟伅鍙戦佺粰瀹冦傝瑙嗗浘鐨?OnPaint 澶勭悊鍑芥暟閫氳繃鍒涘緩 CPaintDC 綾葷殑璁懼涓婁笅鏂囧璞℃潵鍝嶅簲璇ユ秷鎭茍璋冪敤瑙嗗浘鐨?OnDraw 鎴愬憳鍑芥暟銆?br>
褰撴病鏈夋坊鍔燱M_PAINT娑堟伅澶勭悊鏃?紿楀彛閲嶇粯鏃?鐢監nDraw鏉ヨ繘琛屾秷鎭搷搴?..褰撴坊鍔燱M_PAINT娑堟伅澶勭悊鏃?紿楀彛閲嶇粯鏃?WM_PAINT娑堟伅琚姇閫?鐢監nPaint鏉ヨ繘琛屾秷鎭搷搴?榪欐椂灝變笉鑳介殣寮忚皟鐢∣nDraw浜?蹇呴』鏄懼紡璋冪敤(
闅愬紡璋冪敤:褰撶敱OnPaint鏉ヨ繘琛屾秷鎭搷搴旀椂,緋葷粺鑷姩璋冪敤CView::OnDraw(&pDC).
鎯寵薄涓涓嬶紝紿楀彛鏄劇ず鐨勫唴瀹瑰拰鎵撳嵃鐨勫唴瀹規槸宸笉澶氱殑錛屾墍浠ワ紝涓鑸儏鍐典笅錛岀粺涓鐢監nDraw鏉ョ敾銆傜獥鍙e墠鏅渶瑕佸埛鏂版椂錛岀郴緇熶細浼氳皟鐢ㄥ埌OnPaint錛岃孫nPaint涓鑸儏鍐典笅鏄DC浣滀竴浜涘垵濮嬪寲鎿嶄綔鍚庯紝璋冪敤OnDraw()銆?/font>
OnEraseBkGnd()錛屾槸紿楀彛鑳屾櫙闇瑕佸埛鏂版椂鐢辯郴緇熻皟鐢ㄧ殑銆傛槑鏄劇殑涓涓緥瀛愭槸璁劇疆紿楀彛鐨勮儗鏅鑹詫紙浣犲彲浠ユ妸榪欐斁鍦∣nPaint涓幓鍋氾紝浣嗘槸浼氫嬌浜х敓闂儊鐨勭幇璞★級銆?
鑷充簬鎬庝箞鐣屽畾鑳屾櫙鍜屽墠鏅紝閭h鍏蜂綋闂鍏蜂綋鍒嗘瀽浜嗭紝涓鑸儏鍐典笅錛屼綘榪樻槸寰堝鏄撳尯鍒殑鍚с?/font>
鍙﹀OnInitialUpdate
]]>
]]>0 Makefile姒傝堪
浠涔堟槸makefile錛熸垨璁稿緢澶歐inodws鐨勭▼搴忓憳閮戒笉鐭ラ亾榪欎釜涓滆タ錛屽洜涓洪偅浜沇indows鐨処DE閮戒負浣犲仛浜嗚繖涓伐浣滐紝浣嗘垜瑙夊緱瑕佷綔涓涓ソ鐨勫拰professional鐨勭▼搴忓憳錛宮akefile榪樻槸瑕佹噦銆傝繖灝卞ソ鍍忕幇鍦ㄦ湁榪欎箞澶氱殑HTML鐨勭紪杈戝櫒錛屼絾濡傛灉浣犳兂鎴愪負涓涓笓涓氫漢澹紝浣犺繕鏄浜嗚ВHTML鐨勬爣璇嗙殑鍚箟銆傜壒鍒湪Unix涓嬬殑杞歡緙栬瘧錛屼綘灝變笉鑳戒笉鑷繁鍐檓akefile浜嗭紝浼氫笉浼氬啓makefile錛屼粠涓涓晶闈㈣鏄庝簡涓涓漢鏄惁鍏峰瀹屾垚澶у瀷宸ョ▼鐨勮兘鍔涖?
0.1 鍏充簬紼嬪簭鐨勭紪璇戝拰閾炬帴
鍦ㄦ錛屾垜鎯沖璇村叧浜庣▼搴忕紪璇戠殑涓浜涜鑼冨拰鏂規硶錛屼竴鑸潵璇達紝鏃犺鏄疌銆丆++銆佽繕鏄痯as錛岄鍏堣鎶婃簮鏂囦歡緙栬瘧鎴愪腑闂翠唬鐮佹枃浠訛紝鍦╓indows涓嬩篃灝辨槸 .obj 鏂囦歡錛孶NIX涓嬫槸 .o 鏂囦歡錛屽嵆 Object File錛岃繖涓姩浣滃彨鍋氱紪璇戯紙compile錛夈傜劧鍚庡啀鎶婂ぇ閲忕殑Object File鍚堟垚鎵ц鏂囦歡錛岃繖涓姩浣滃彨浣滈摼鎺ワ紙link錛夈?
1 Makefile 浠嬬粛
make鍛戒護鎵ц鏃訛紝闇瑕佷竴涓?Makefile 鏂囦歡錛屼互鍛婅瘔make鍛戒護闇瑕佹庝箞鏍風殑鍘葷紪璇戝拰閾炬帴紼嬪簭銆?
1.1 Makefile鐨勮鍒?
鍦ㄨ榪拌繖涓狹akefile涔嬪墠錛岃繕鏄鎴戜滑鍏堟潵綺楃暐鍦扮湅涓鐪婱akefile鐨勮鍒欍?
target ... : prerequisites ...
command
...
...
target涔熷氨鏄竴涓洰鏍囨枃浠訛紝鍙互鏄疧bject File錛屼篃鍙互鏄墽琛屾枃浠躲傝繕鍙互鏄竴涓爣絳撅紙Label錛夛紝瀵逛簬鏍囩榪欑鐗規э紝鍦ㄥ悗緇殑“浼洰鏍?#8221;绔犺妭涓細鏈夊彊榪般?
1.2 涓涓ず渚?
姝e鍓嶉潰鎵璇寸殑錛屽鏋滀竴涓伐紼嬫湁3涓ご鏂囦歡錛屽拰8涓狢鏂囦歡錛屾垜浠負浜嗗畬鎴愬墠闈㈡墍榪扮殑閭d笁涓鍒欙紝鎴戜滑鐨凪akefile搴旇鏄笅闈㈢殑榪欎釜鏍峰瓙鐨勩?
edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
鍙嶆枩鏉狅紙\錛夋槸鎹㈣絎︾殑鎰忔濄傝繖鏍鋒瘮杈冧究浜嶮akefile鐨勬槗璇匯傛垜浠彲浠ユ妸榪欎釜鍐呭淇濆瓨鍦ㄦ枃浠朵負“Makefile”鎴?#8220;makefile”鐨勬枃浠朵腑錛岀劧鍚庡湪璇ョ洰褰曚笅鐩存帴杈撳叆鍛戒護“make”灝卞彲浠ョ敓鎴愭墽琛屾枃浠秂dit銆傚鏋滆鍒犻櫎鎵ц鏂囦歡鍜屾墍鏈夌殑涓棿鐩爣鏂囦歡錛岄偅涔堬紝鍙綆鍗曞湴鎵ц涓涓?#8220;make clean”灝卞彲浠ヤ簡銆?
1.3 make鏄浣曞伐浣滅殑
鍦ㄩ粯璁ょ殑鏂瑰紡涓嬶紝涔熷氨鏄垜浠彧杈撳叆make鍛戒護銆傞偅涔堬紝
1.4 makefile涓嬌鐢ㄥ彉閲?
鍦ㄤ笂闈㈢殑渚嬪瓙涓紝鍏堣鎴戜滑鐪嬬湅edit鐨勮鍒欙細
edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
鎴戜滑鍙互鐪嬪埌[.o]鏂囦歡鐨勫瓧絎︿覆琚噸澶嶄簡涓ゆ錛屽鏋滄垜浠殑宸ョ▼闇瑕佸姞鍏ヤ竴涓柊鐨刐.o]鏂囦歡錛岄偅涔堟垜浠渶瑕佸湪涓や釜鍦版柟鍔狅紙搴旇鏄笁涓湴鏂癸紝榪樻湁涓涓湴鏂瑰湪clean涓級銆傚綋鐒訛紝鎴戜滑鐨刴akefile騫朵笉澶嶆潅錛屾墍浠ュ湪涓や釜鍦版柟鍔犱篃涓嶇瘡錛屼絾濡傛灉makefile鍙樺緱澶嶆潅錛岄偅涔堟垜浠氨鏈夊彲鑳戒細蹇樻帀涓涓渶瑕佸姞鍏ョ殑鍦版柟錛岃屽鑷寸紪璇戝け璐ャ傛墍浠ワ紝涓轟簡makefile鐨勬槗緇存姢錛屽湪makefile涓垜浠彲浠ヤ嬌鐢ㄥ彉閲忋俶akefile鐨勫彉閲忎篃灝辨槸涓涓瓧絎︿覆錛岀悊瑙f垚C璇█涓殑瀹忓彲鑳戒細鏇村ソ銆?
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
浜庢槸錛屾垜浠氨鍙互寰堟柟渚垮湴鍦ㄦ垜浠殑makefile涓互“$(objects)”鐨勬柟寮忔潵浣跨敤榪欎釜鍙橀噺浜嗭紝浜庢槸鎴戜滑鐨勬敼鑹増makefile灝卞彉鎴愪笅闈㈣繖涓牱瀛愶細
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit $(objects)
1.5 璁﹎ake鑷姩鎺ㄥ
GNU鐨刴ake寰堝己澶э紝瀹冨彲浠ヨ嚜鍔ㄦ帹瀵兼枃浠朵互鍙婃枃浠朵緷璧栧叧緋誨悗闈㈢殑鍛戒護錛屼簬鏄垜浠氨娌″繀瑕佸幓鍦ㄦ瘡涓涓猍.o]鏂囦歡鍚庨兘鍐欎笂綾諱技鐨勫懡浠わ紝鍥犱負錛屾垜浠殑make浼氳嚜鍔ㄨ瘑鍒紝騫惰嚜宸辨帹瀵煎懡浠ゃ?
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
.PHONY : clean
clean :
rm edit $(objects)
榪欑鏂規硶錛屼篃灝辨槸make鐨?#8220;闅愭櫐瑙勫垯”銆備笂闈㈡枃浠跺唴瀹逛腑錛?#8220;.PHONY”琛ㄧず錛宑lean鏄釜浼洰鏍囨枃浠躲?
1.6 鍙︾被椋庢牸鐨刴akefile
鍗崇劧鎴戜滑鐨刴ake鍙互鑷姩鎺ㄥ鍛戒護錛岄偅涔堟垜鐪嬪埌閭e爢[.o]鍜孾.h]鐨勪緷璧栧氨鏈夌偣涓嶇埥錛岄偅涔堝鐨勯噸澶嶇殑[.h]錛岃兘涓嶈兘鎶婂叾鏀舵嫝璧鋒潵錛屽ソ鍚э紝娌℃湁闂錛岃繖涓浜巑ake鏉ヨ寰堝鏄擄紝璋佸彨瀹冩彁渚涗簡鑷姩鎺ㄥ鍛戒護鍜屾枃浠剁殑鍔熻兘鍛紵鏉ョ湅鐪嬫渶鏂伴鏍肩殑makefile鍚с?
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
$(objects) : defs.h
kbd.o command.o files.o : command.h
display.o insert.o search.o files.o : buffer.h
.PHONY : clean
clean :
rm edit $(objects)
榪欑椋庢牸錛岃鎴戜滑鐨刴akefile鍙樺緱寰堢畝鍗曪紝浣嗘垜浠殑鏂囦歡渚濊禆鍏崇郴灝辨樉寰楁湁鐐瑰噷涔變簡銆傞奔鍜岀唺鎺屼笉鍙吋寰椼傝繕鐪嬩綘鐨勫枩濂戒簡銆傛垜鏄笉鍠滄榪欑椋庢牸鐨勶紝涓鏄枃浠剁殑渚濊禆鍏崇郴鐪嬩笉娓呮錛屼簩鏄鏋滄枃浠朵竴澶氾紝瑕佸姞鍏ュ嚑涓柊鐨?o鏂囦歡錛岄偅灝辯悊涓嶆竻妤氫簡銆?
1.7 娓呯┖鐩爣鏂囦歡鐨勮鍒?
姣忎釜Makefile涓兘搴旇鍐欎竴涓竻絀虹洰鏍囨枃浠訛紙.o鍜屾墽琛屾枃浠訛級鐨勮鍒欙紝榪欎笉浠呬究浜庨噸緙栬瘧錛屼篃寰堝埄浜庝繚鎸佹枃浠剁殑娓呮磥銆傝繖鏄竴涓?#8220;淇吇”錛堝懙鍛碉紝榪樿寰楁垜鐨勩婄紪紼嬩慨鍏匯嬪悧錛夈備竴鑸殑椋庢牸閮芥槸錛?
clean:
rm edit $(objects)
鏇翠負紼沖仴鐨勫仛娉曟槸錛?
.PHONY : clean
clean :
-rm edit $(objects)
鍓嶉潰璇磋繃錛?PHONY鎰忔濊〃紺篶lean鏄竴涓?#8220;浼洰鏍?#8221;錛屻傝屽湪rm鍛戒護鍓嶉潰鍔犱簡涓涓皬鍑忓彿鐨勬剰鎬濆氨鏄紝涔熻鏌愪簺鏂囦歡鍑虹幇闂錛屼絾涓嶈綆★紝緇х畫鍋氬悗闈㈢殑浜嬨傚綋鐒訛紝clean鐨勮鍒欎笉瑕佹斁鍦ㄦ枃浠剁殑寮澶達紝涓嶇劧錛岃繖灝變細鍙樻垚make鐨勯粯璁ょ洰鏍囷紝鐩鎬俊璋佷篃涓嶆効鎰忚繖鏍楓備笉鎴愭枃鐨勮鐭╂槸鈥斺?#8220;clean浠庢潵閮芥槸鏀懼湪鏂囦歡鐨勬渶鍚?#8221;銆?
2 Makefile 鎬昏堪
2.1 Makefile閲屾湁浠涔堬紵
Makefile閲屼富瑕佸寘鍚簡浜斾釜涓滆タ錛氭樉寮忚鍒欍侀殣鏅﹁鍒欍佸彉閲忓畾涔夈佹枃浠舵寚紺哄拰娉ㄩ噴銆?
2.2Makefile鐨勬枃浠跺悕
榛樿鐨勬儏鍐典笅錛宮ake鍛戒護浼氬湪褰撳墠鐩綍涓嬫寜欏哄簭鎵懼鏂囦歡鍚嶄負“GNUmakefile”銆?#8220;makefile”銆?#8220;Makefile”鐨勬枃浠訛紝鎵懼埌浜嗚В閲婅繖涓枃浠躲傚湪榪欎笁涓枃浠跺悕涓紝鏈濂戒嬌鐢?#8220;Makefile”榪欎釜鏂囦歡鍚嶏紝鍥犱負錛岃繖涓枃浠跺悕絎竴涓瓧絎︿負澶у啓錛岃繖鏍鋒湁涓縐嶆樉鐩殑鎰熻銆傛渶濂戒笉瑕佺敤“GNUmakefile”錛岃繖涓枃浠舵槸GNU鐨刴ake璇嗗埆鐨勩傛湁鍙﹀涓浜沵ake鍙鍏ㄥ皬鍐欑殑“makefile”鏂囦歡鍚嶆晱鎰燂紝浣嗘槸鍩烘湰涓婃潵璇達紝澶у鏁扮殑make閮芥敮鎸?#8220;makefile”鍜?#8220;Makefile”榪欎袱縐嶉粯璁ゆ枃浠跺悕銆?
2.3 寮曠敤鍏跺畠鐨凪akefile
鍦∕akefile浣跨敤include鍏抽敭瀛楀彲浠ユ妸鍒殑Makefile鍖呭惈榪涙潵錛岃繖寰堝儚C璇█鐨?include錛岃鍖呭惈鐨勬枃浠朵細鍘熸ā鍘熸牱鐨勬斁鍦ㄥ綋鍓嶆枃浠剁殑鍖呭惈浣嶇疆銆俰nclude鐨勮娉曟槸錛?
include <filename>
include foo.make *.mk $(bar)
絳変環浜庯細
include foo.make a.mk b.mk c.mk e.mk f.mk
make鍛戒護寮濮嬫椂錛屼細鎶婃壘瀵籭nclude鎵鎸囧嚭鐨勫叾瀹僊akefile錛屽茍鎶婂叾鍐呭瀹夌疆鍦ㄥ綋鍓嶇殑浣嶇疆銆傚氨濂藉儚C/C++鐨?include鎸囦護涓鏍楓傚鏋滄枃浠墮兘娌℃湁鎸囧畾緇濆璺緞鎴栨槸鐩稿璺緞鐨勮瘽錛宮ake浼氬湪褰撳墠鐩綍涓嬮鍏堝鎵撅紝濡傛灉褰撳墠鐩綍涓嬫病鏈夋壘鍒幫紝閭d箞錛宮ake榪樹細鍦ㄤ笅闈㈢殑鍑犱釜鐩綍涓嬫壘錛?
-include <filename>
2.4 鐜鍙橀噺 MAKEFILES
濡傛灉浣犵殑褰撳墠鐜涓畾涔変簡鐜鍙橀噺MAKEFILES錛岄偅涔堬紝make浼氭妸榪欎釜鍙橀噺涓殑鍊煎仛涓涓被浼間簬include鐨勫姩浣溿傝繖涓彉閲忎腑鐨勫兼槸鍏跺畠鐨凪akefile錛岀敤絀烘牸鍒嗛殧銆傚彧鏄紝瀹冨拰include涓嶅悓鐨勬槸錛屼粠榪欎釜鐜鍙樹腑寮曞叆鐨凪akefile鐨?#8220;鐩爣”涓嶄細璧蜂綔鐢紝濡傛灉鐜鍙橀噺涓畾涔夌殑鏂囦歡鍙戠幇閿欒錛宮ake涔熶細涓嶇悊銆?
2.5 make鐨勫伐浣滄柟寮?
GNU鐨刴ake宸ヤ綔鏃剁殑鎵ц姝ラ鍏ヤ笅錛氾紙鎯蟲潵鍏跺畠鐨刴ake涔熸槸綾諱技錛?
3 Makefile涔﹀啓瑙勫垯
瑙勫垯鍖呭惈涓や釜閮ㄥ垎錛屼竴涓槸渚濊禆鍏崇郴錛屼竴涓槸鐢熸垚鐩爣鐨勬柟娉曘?
3.1 瑙勫垯涓句緥
foo.o : foo.c defs.h # foo妯″潡
cc -c -g foo.c
鐪嬪埌榪欎釜渚嬪瓙錛屽悇浣嶅簲璇ヤ笉鏄緢闄岀敓浜嗭紝鍓嶉潰涔熷凡璇磋繃錛宖oo.o鏄垜浠殑鐩爣錛宖oo.c鍜宒efs.h鏄洰鏍囨墍渚濊禆鐨勬簮鏂囦歡錛岃屽彧鏈変竴涓懡浠?#8220;cc -c -g foo.c”錛堜互Tab閿紑澶達級銆傝繖涓鍒欏憡璇夋垜浠袱浠朵簨錛?
3.2 瑙勫垯鐨勮娉?
targets : prerequisites
command
...
鎴栨槸榪欐牱錛?
targets : prerequisites ; command
command
...
targets鏄枃浠跺悕錛屼互絀烘牸鍒嗗紑錛屽彲浠ヤ嬌鐢ㄩ氶厤絎︺備竴鑸潵璇達紝鎴戜滑鐨勭洰鏍囧熀鏈笂鏄竴涓枃浠訛紝浣嗕篃鏈夊彲鑳芥槸澶氫釜鏂囦歡銆?
3.3 鍦ㄨ鍒欎腑浣跨敤閫氶厤絎?
clean:
rm -f *.o
涓婇潰榪欎釜渚嬪瓙鎴戜笉涓嶅璇翠簡錛岃繖鏄搷浣滅郴緇烻hell鎵鏀寔鐨勯氶厤絎︺傝繖鏄湪鍛戒護涓殑閫氶厤絎︺?
print: *.c
lpr -p $?
touch print
涓婇潰榪欎釜渚嬪瓙璇存槑浜嗛氶厤絎︿篃鍙互鍦ㄦ垜浠殑瑙勫垯涓紝鐩爣print渚濊禆浜庢墍鏈夌殑[.c]鏂囦歡銆傚叾涓殑“$?”鏄竴涓嚜鍔ㄥ寲鍙橀噺錛屾垜浼氬湪鍚庨潰緇欎綘璁茶堪銆?
objects = *.o
涓婇潰榪欎釜渚嬪瓙錛岃〃紺轟簡錛岄氱鍚屾牱鍙互鐢ㄥ湪鍙橀噺涓傚茍涓嶆槸璇碵*.o]浼氬睍寮錛屼笉錛乷bjects鐨勫煎氨鏄?#8220;*.o”銆侻akefile涓殑鍙橀噺鍏跺疄灝辨槸C/C++涓殑瀹忋傚鏋滀綘瑕佽閫氶厤絎﹀湪鍙橀噺涓睍寮錛屼篃灝辨槸璁﹐bjects鐨勫兼槸鎵鏈塠.o]鐨勬枃浠跺悕鐨勯泦鍚堬紝閭d箞錛屼綘鍙互榪欐牱錛?
objects := $(wildcard *.o)
榪欑鐢ㄦ硶鐢卞叧閿瓧“wildcard”鎸囧嚭錛屽叧浜嶮akefile鐨勫叧閿瓧錛屾垜浠皢鍦ㄥ悗闈㈣璁恒?
3.4 鏂囦歡鎼滃
VPATH = src:../headers
涓婇潰鐨勭殑瀹氫箟鎸囧畾涓や釜鐩綍錛?#8220;src”鍜?#8220;../headers”錛宮ake浼氭寜鐓ц繖涓『搴忚繘琛屾悳绱€傜洰褰曠敱“鍐掑彿”鍒嗛殧銆傦紙褰撶劧錛屽綋鍓嶇洰褰曟案榪滄槸鏈楂樹紭鍏堟悳绱㈢殑鍦版柟錛?
涓虹鍚堟ā寮?lt; pattern>鐨勬枃浠舵寚瀹氭悳绱㈢洰褰?lt; directories>銆?
娓呴櫎絎﹀悎妯″紡< pattern>鐨勬枃浠剁殑鎼滅儲鐩綍銆?
娓呴櫎鎵鏈夊凡琚緗ソ浜嗙殑鏂囦歡鎼滅儲鐩綍銆? vpath %.h ../headers
璇ヨ鍙ヨ〃紺猴紝瑕佹眰make鍦?#8220;../headers”鐩綍涓嬫悳绱㈡墍鏈変互“.h”緇撳熬鐨勬枃浠躲傦紙濡傛灉鏌愭枃浠跺湪褰撳墠鐩綍娌℃湁鎵懼埌鐨勮瘽錛?
vpath %.c foo
vpath % blish
vpath %.c bar
鍏惰〃紺?#8220;.c”緇撳熬鐨勬枃浠訛紝鍏堝湪“foo”鐩綍錛岀劧鍚庢槸“blish”錛屾渶鍚庢槸“bar”鐩綍銆?
vpath %.c foo:bar
vpath % blish
鑰屼笂闈㈢殑璇彞鍒欒〃紺?#8220;.c”緇撳熬鐨勬枃浠訛紝鍏堝湪“foo”鐩綍錛岀劧鍚庢槸“bar”鐩綍錛屾渶鍚庢墠鏄?#8220;blish”鐩綍銆?
3.5 浼洰鏍?
clean:
rm *.o temp
姝e儚鎴戜滑鍓嶉潰渚嬪瓙涓殑“clean”涓鏍鳳紝鍗崇劧鎴戜滑鐢熸垚浜嗚澶氭枃浠剁紪璇戞枃浠訛紝鎴戜滑涔熷簲璇ユ彁渚涗竴涓竻闄ゅ畠浠殑“鐩爣”浠ュ瀹屾暣鍦伴噸緙栬瘧鑰岀敤銆?錛堜互“make clean”鏉ヤ嬌鐢ㄨ鐩爣錛?
.PHONY : clean
鍙鏈夎繖涓0鏄庯紝涓嶇鏄惁鏈?#8220;clean”鏂囦歡錛岃榪愯“clean”榪欎釜鐩爣錛屽彧鏈?#8220;make clean”榪欐牱銆備簬鏄暣涓繃紼嬪彲浠ヨ繖鏍峰啓錛?
.PHONY: clean
clean:
rm *.o temp
浼洰鏍囦竴鑸病鏈変緷璧栫殑鏂囦歡銆備絾鏄紝鎴戜滑涔熷彲浠ヤ負浼洰鏍囨寚瀹氭墍渚濊禆鐨勬枃浠躲備吉鐩爣鍚屾牱鍙互浣滀負“榛樿鐩爣”錛屽彧瑕佸皢鍏舵斁鍦ㄧ涓涓備竴涓ず渚嬪氨鏄紝濡傛灉浣犵殑Makefile闇瑕佷竴鍙f皵鐢熸垚鑻ュ共涓彲鎵ц鏂囦歡錛屼絾浣犲彧鎯崇畝鍗曞湴鏁蹭竴涓猰ake瀹屼簨錛屽茍涓旓紝鎵鏈夌殑鐩爣鏂囦歡閮藉啓鍦ㄤ竴涓狹akefile涓紝閭d箞浣犲彲浠ヤ嬌鐢?#8220;浼洰鏍?#8221;榪欎釜鐗規э細
all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2 : prog2.o
cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o
鎴戜滑鐭ラ亾錛孧akefile涓殑絎竴涓洰鏍囦細琚綔涓哄叾榛樿鐩爣銆傛垜浠0鏄庝簡涓涓?#8220;all”鐨勪吉鐩爣錛屽叾渚濊禆浜庡叾瀹冧笁涓洰鏍囥傜敱浜庝吉鐩爣鐨勭壒鎬ф槸錛屾繪槸琚墽琛岀殑錛屾墍浠ュ叾渚濊禆鐨勯偅涓変釜鐩爣灝辨繪槸涓嶅“all”榪欎釜鐩爣鏂般傛墍浠ワ紝鍏跺畠涓変釜鐩爣鐨勮鍒欐繪槸浼氳鍐寵銆備篃灝辮揪鍒頒簡鎴戜滑涓鍙f皵鐢熸垚澶氫釜鐩爣鐨勭洰鐨勩?#8220;.PHONY : all”澹版槑浜?#8220;all”榪欎釜鐩爣涓?#8220;浼洰鏍?#8221;銆?
.PHONY: cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
rm program
cleanobj :
rm *.o
cleandiff :
rm *.diff
“make clean”灝嗘竻闄ゆ墍鏈夎琚竻闄ょ殑鏂囦歡銆?#8220;cleanobj”鍜?#8220;cleandiff”榪欎袱涓吉鐩爣鏈夌偣鍍?#8220;瀛愮▼搴?#8221;鐨勬剰鎬濄傛垜浠彲浠ヨ緭鍏?#8220;make cleanall”鍜?#8220;make cleanobj”鍜?#8220;make cleandiff”鍛戒護鏉ヨ揪鍒版竻闄や笉鍚岀綾繪枃浠剁殑鐩殑
3.6 澶氱洰鏍?
bigoutput littleoutput : text.g
generate text.g -$(subst output,,$@) > $@
鍏朵腑錛?$(subst output,,$@)涓殑“$”琛ㄧず鎵ц涓涓狹akefile鐨勫嚱鏁幫紝鍑芥暟鍚嶄負subst錛屽悗闈㈢殑涓哄弬鏁般傚叧浜庡嚱鏁幫紝灝嗗湪鍚庨潰璁茶堪銆傝繖閲岀殑榪欎釜鍑芥暟鏄埅鍙栧瓧絎︿覆鐨勬剰鎬濓紝“$@”琛ㄧず鐩爣鐨勯泦鍚堬紝灝卞儚涓涓暟緇勶紝“$@”渚濇鍙栧嚭鐩爣錛屽茍鎵т簬鍛戒護銆?
涓婅堪瑙勫垯絳変環浜庯細
bigoutput : text.g
generate text.g -big > bigoutput
littleoutput : text.g
generate text.g -little > littleoutput
3.7 闈欐佹ā寮?
<targets ...>: <target-pattern>: <prereq-patterns ...>
銆銆銆<commands>
...
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
涓婇潰鐨勪緥瀛愪腑錛屾寚鏄庝簡鎴戜滑鐨勭洰鏍囦粠$object涓幏鍙栵紝“%.o”琛ㄦ槑瑕佹墍鏈変互“.o”緇撳熬鐨勭洰鏍囷紝涔熷氨鏄?#8220;foo.o bar.o”錛屼篃灝辨槸鍙橀噺$object闆嗗悎鐨勬ā寮忥紝鑰屼緷璧栨ā寮?#8220;%.c”鍒欏彇妯″紡“%.o”鐨?#8220;%”錛屼篃灝辨槸“foo bar”錛屽茍涓哄叾鍔犱笅“.c”鐨勫悗緙錛屼簬鏄紝鎴戜滑鐨勪緷璧栫洰鏍囧氨鏄?#8220;foo.c bar.c”銆傝屽懡浠や腑鐨?#8220;$<”鍜?#8220;$@”鍒欐槸鑷姩鍖栧彉閲忥紝“$<”琛ㄧず鎵鏈夌殑渚濊禆鐩爣闆嗭紙涔熷氨鏄?#8220;foo.c bar.c”錛夛紝“$@”琛ㄧず鐩爣闆嗭紙涔熻お鎭扮櫞oo.o bar.o”錛夈備簬鏄紝涓婇潰鐨勮鍒欏睍寮鍚庣瓑浠蜂簬涓嬮潰鐨勮鍒欙細
foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o
璇曟兂錛屽鏋滄垜浠殑“%.o”鏈夊嚑鐧句釜錛岄偅縐嶆垜浠彧瑕佺敤榪欑寰堢畝鍗曠殑“闈欐佹ā寮忚鍒?#8221;灝卞彲浠ュ啓瀹屼竴鍫嗚鍒欙紝瀹炲湪鏄お鏈夋晥鐜囦簡銆?#8220;闈欐佹ā寮忚鍒?#8221;鐨勭敤娉曞緢鐏墊椿錛屽鏋滅敤寰楀ソ錛岄偅浼氫竴涓緢寮哄ぇ鐨勫姛鑳姐傚啀鐪嬩竴涓緥瀛愶細
files = foo.elc bar.o lose.o
$(filter %.o,$(files)): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
$(filter %.elc,$(files)): %.elc: %.el
emacs -f batch-byte-compile $<
3.8 鑷姩鐢熸垚渚濊禆鎬?
main.o : main.c defs.h
浣嗘槸錛屽鏋滄槸涓涓瘮杈冨ぇ鍨嬬殑宸ョ▼錛屼綘蹇呴渶娓呮鍝簺C鏂囦歡鍖呭惈浜嗗摢浜涘ご鏂囦歡錛屽茍涓旓紝浣犲湪鍔犲叆鎴栧垹闄ゅご鏂囦歡鏃訛紝涔熼渶瑕佸皬蹇冨湴淇敼Makefile錛岃繖鏄竴涓緢娌℃湁緇存姢鎬х殑宸ヤ綔銆備負浜嗛伩鍏嶈繖縐嶇箒閲嶈屽張瀹規槗鍑洪敊鐨勪簨鎯咃紝鎴戜滑鍙互浣跨敤C/C++緙栬瘧鐨勪竴涓姛鑳姐傚ぇ澶氭暟鐨凜/C++緙栬瘧鍣ㄩ兘鏀寔涓涓?#8220;-M”鐨勯夐」錛屽嵆鑷姩鎵懼婧愭枃浠朵腑鍖呭惈鐨勫ご鏂囦歡錛屽茍鐢熸垚涓涓緷璧栧叧緋匯備緥濡傦紝濡傛灉鎴戜滑鎵ц涓嬮潰鐨勫懡浠わ細
cc -M main.c
鍏惰緭鍑烘槸錛?
main.o : main.c defs.h
浜庢槸鐢辯紪璇戝櫒鑷姩鐢熸垚鐨勪緷璧栧叧緋伙紝榪欐牱涓鏉ワ紝浣犲氨涓嶅繀鍐嶆墜鍔ㄤ功鍐欒嫢騫叉枃浠剁殑渚濊禆鍏崇郴錛岃岀敱緙栬瘧鍣ㄨ嚜鍔ㄧ敓鎴愪簡銆傞渶瑕佹彁閱掍竴鍙ョ殑鏄紝濡傛灉浣犱嬌鐢℅NU鐨凜/C++緙栬瘧鍣紝浣犲緱鐢?#8220;-MM”鍙傛暟錛屼笉鐒訛紝“-M”鍙傛暟浼氭妸涓浜涙爣鍑嗗簱鐨勫ご鏂囦歡涔熷寘鍚繘鏉ャ?
main.o: main.c defs.h /usr/include/stdio.h /usr/include/features.h \
/usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \
/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stddef.h \
/usr/include/bits/types.h /usr/include/bits/pthreadtypes.h \
/usr/include/bits/sched.h /usr/include/libio.h \
/usr/include/_G_config.h /usr/include/wchar.h \
/usr/include/bits/wchar.h /usr/include/gconv.h \
/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stdarg.h \
/usr/include/bits/stdio_lim.h
gcc -MM main.c鐨勮緭鍑哄垯鏄細
main.o: main.c defs.h
閭d箞錛岀紪璇戝櫒鐨勮繖涓姛鑳藉浣曚笌鎴戜滑鐨凪akefile鑱旂郴鍦ㄤ竴璧峰憿銆傚洜涓鴻繖鏍蜂竴鏉ワ紝鎴戜滑鐨凪akefile涔熻鏍規嵁榪欎簺婧愭枃浠墮噸鏂扮敓鎴愶紝璁㎝akefile鑷凡渚濊禆浜庢簮鏂囦歡錛熻繖涓姛鑳藉茍涓嶇幇瀹烇紝涓嶈繃鎴戜滑鍙互鏈夊叾瀹冩墜孌墊潵榪傚洖鍦板疄鐜拌繖涓鍔熻兘銆侴NU緇勭粐寤鴻鎶婄紪璇戝櫒涓烘瘡涓涓簮鏂囦歡鐨勮嚜鍔ㄧ敓鎴愮殑渚濊禆鍏崇郴鏀懼埌涓涓枃浠朵腑錛屼負姣忎竴涓?#8220;name.c”鐨勬枃浠墮兘鐢熸垚涓涓?#8220;name.d”鐨凪akefile鏂囦歡錛孾.d]鏂囦歡涓氨瀛樻斁瀵瑰簲[.c]鏂囦歡鐨勪緷璧栧叧緋匯?
%.d: %.c
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
main.o : main.c defs.h
杞垚錛?
main.o main.d : main.c defs.h
浜庢槸錛屾垜浠殑[.d]鏂囦歡涔熶細鑷姩鏇存柊浜嗭紝騫朵細鑷姩鐢熸垚浜嗭紝褰撶劧錛屼綘榪樺彲浠ュ湪榪欎釜[.d]鏂囦歡涓姞鍏ョ殑涓嶅彧鏄緷璧栧叧緋伙紝鍖呮嫭鐢熸垚鐨勫懡浠や篃鍙竴騫跺姞鍏ワ紝璁╂瘡涓猍.d]鏂囦歡閮藉寘鍚竴涓畬璧栫殑瑙勫垯銆備竴鏃︽垜浠畬鎴愯繖涓伐浣滐紝鎺ヤ笅鏉ワ紝鎴戜滑灝辮鎶婅繖浜涜嚜鍔ㄧ敓鎴愮殑瑙勫垯鏀捐繘鎴戜滑鐨勪富Makefile涓傛垜浠彲浠ヤ嬌鐢∕akefile鐨?#8220;include”鍛戒護錛屾潵寮曞叆鍒殑Makefile鏂囦歡錛堝墠闈㈣榪囷級錛屼緥濡傦細
sources = foo.c bar.c
include $(sources:.c=.d)
涓婅堪璇彞涓殑“$(sources:.c=.d)”涓殑“.c=.d”鐨勬剰鎬濇槸鍋氫竴涓浛鎹紝鎶婂彉閲?(sources)鎵鏈塠.c]鐨勫瓧涓查兘鏇挎崲鎴怺.d]錛屽叧浜庤繖涓?#8220;鏇挎崲”鐨勫唴瀹癸紝鍦ㄥ悗闈㈡垜浼氭湁鏇翠負璇︾粏鐨勮榪般傚綋鐒訛紝浣犲緱娉ㄦ剰嬈″簭錛屽洜涓篿nclude鏄寜嬈℃潵杞藉叆鏂囦歡錛屾渶鍏堣澆鍏ョ殑[4 Makefile 涔﹀啓鍛戒護
4.1 鏄劇ず鍛戒護
@echo 姝e湪緙栬瘧XXX妯″潡......
褰搈ake鎵ц鏃訛紝浼氳緭鍑?#8220;姝e湪緙栬瘧XXX妯″潡......”瀛椾覆錛屼絾涓嶄細杈撳嚭鍛戒護錛屽鏋滄病鏈?#8220;@”錛岄偅涔堬紝make灝嗚緭鍑猴細
echo 姝e湪緙栬瘧XXX妯″潡......
姝e湪緙栬瘧XXX妯″潡......
濡傛灉make鎵ц鏃訛紝甯﹀叆make鍙傛暟“-n”鎴?#8220;--just-print”錛岄偅涔堝叾鍙槸鏄劇ず鍛戒護錛屼絾涓嶄細鎵ц鍛戒護錛岃繖涓姛鑳藉緢鏈夊埄浜庢垜浠皟璇曟垜浠殑Makefile錛岀湅鐪嬫垜浠功鍐欑殑鍛戒護鏄墽琛岃搗鏉ユ槸浠涔堟牱瀛愮殑鎴栨槸浠涔堥『搴忕殑銆?
4.2 鍛戒護鎵ц
紺轟緥涓錛?
exec:
cd /home/hchen
pwd
紺轟緥浜岋細
exec:
cd /home/hchen; pwd
4.3 鍛戒護鍑洪敊
clean:
-rm -f *.o
榪樻湁涓涓叏灞鐨勫姙娉曟槸錛岀粰make鍔犱笂“-i”鎴栨槸“--ignore-errors”鍙傛暟錛岄偅涔堬紝Makefile涓墍鏈夊懡浠ら兘浼氬拷鐣ラ敊璇傝屽鏋滀竴涓鍒欐槸浠?#8220;.IGNORE”浣滀負鐩爣鐨勶紝閭d箞榪欎釜瑙勫垯涓殑鎵鏈夊懡浠ゅ皢浼氬拷鐣ラ敊璇傝繖浜涙槸涓嶅悓綰у埆鐨勯槻姝㈠懡浠ゅ嚭閿欑殑鏂規硶錛屼綘鍙互鏍規嵁浣犵殑涓嶅悓鍠滄璁劇疆銆?
4.4 宓屽鎵цmake
subsystem:
cd subdir && $(MAKE)
鍏剁瓑浠蜂簬錛?
subsystem:
$(MAKE) -C subdir
瀹氫箟$(MAKE)瀹忓彉閲忕殑鎰忔濇槸錛屼篃璁告垜浠殑make闇瑕佷竴浜涘弬鏁幫紝鎵浠ュ畾涔夋垚涓涓彉閲忔瘮杈冨埄浜庣淮鎶ゃ傝繖涓や釜渚嬪瓙鐨勬剰鎬濋兘鏄厛榪涘叆“subdir”鐩綍錛岀劧鍚庢墽琛宮ake鍛戒護銆?
export <variable ...>
unexport <variable ...>
紺轟緥涓錛?
export variable = value
鍏剁瓑浠蜂簬錛?
variable = value
export variable
鍏剁瓑浠蜂簬錛?
export variable := value
鍏剁瓑浠蜂簬錛?
variable := value
export variable
紺轟緥浜岋細
export variable += value
鍏剁瓑浠蜂簬錛?
variable += value
export variable
濡傛灉浣犺浼犻掓墍鏈夌殑鍙橀噺錛岄偅涔堬紝鍙涓涓猠xport灝辮浜嗐傚悗闈粈涔堜篃涓嶇敤璺燂紝琛ㄧず浼犻掓墍鏈夌殑鍙橀噺銆?
subsystem:
cd subdir && $(MAKE) MAKEFLAGS=
濡傛灉浣犲畾涔変簡鐜鍙橀噺MAKEFLAGS錛岄偅涔堜綘寰楃‘淇″叾涓殑閫夐」鏄ぇ瀹墮兘浼氱敤鍒扮殑錛屽鏋滃叾涓湁“-t”,“-n”,鍜?#8220;-q”鍙傛暟錛岄偅涔堝皢浼氭湁璁╀綘鎰忔兂涓嶅埌鐨勭粨鏋滐紝鎴栬浼氳浣犲紓甯稿湴鎭愭厡銆?
make: Entering directory `/home/hchen/gnu/make'.
鑰屽湪瀹屾垚涓嬪眰make鍚庣寮鐩綍鏃訛紝鎴戜滑浼氱湅鍒幫細
make: Leaving directory `/home/hchen/gnu/make'
褰撲綘浣跨敤“-C”鍙傛暟鏉ユ寚瀹歮ake涓嬪眰Makefile鏃訛紝“-w”浼氳鑷姩鎵撳紑鐨勩傚鏋滃弬鏁頒腑鏈?#8220;-s”錛?#8220;--slient”錛夋垨鏄?#8220;--no-print-directory”錛岄偅涔堬紝“-w”鎬繪槸澶辨晥鐨勩?
4.5 瀹氫箟鍛戒護鍖?
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
榪欓噷錛?#8220;run-yacc”鏄繖涓懡浠ゅ寘鐨勫悕瀛楋紝鍏朵笉瑕佸拰Makefile涓殑鍙橀噺閲嶅悕銆傚湪“define”鍜?#8220;endef”涓殑涓よ灝辨槸鍛戒護搴忓垪銆傝繖涓懡浠ゅ寘涓殑絎竴涓懡浠ゆ槸榪愯Yacc紼嬪簭錛屽洜涓篩acc紼嬪簭鎬繪槸鐢熸垚“y.tab.c”鐨勬枃浠訛紝鎵浠ョ浜岃鐨勫懡浠ゅ氨鏄妸榪欎釜鏂囦歡鏀規敼鍚嶅瓧銆傝繕鏄妸榪欎釜鍛戒護鍖呮斁鍒頒竴涓ず渚嬩腑鏉ョ湅鐪嬪惂銆?
foo.c : foo.y
$(run-yacc)
鎴戜滑鍙互鐪嬭錛岃浣跨敤榪欎釜鍛戒護鍖咃紝鎴戜滑灝卞ソ鍍忎嬌鐢ㄥ彉閲忎竴鏍楓傚湪榪欎釜鍛戒護鍖呯殑浣跨敤涓紝鍛戒護鍖?#8220;run-yacc”涓殑“$^”灝辨槸“foo.y”錛?#8220;$@”灝辨槸“foo.c”錛堟湁鍏寵繖縐嶄互“$”寮澶寸殑鐗規畩鍙橀噺錛屾垜浠細鍦ㄥ悗闈粙緇嶏級錛宮ake鍦ㄦ墽琛屽懡浠ゅ寘鏃訛紝鍛戒護鍖呬腑鐨勬瘡涓懡浠や細琚緷嬈$嫭绔嬫墽琛屻?
]]>A.3.3. 鎺у埗杈撳嚭鏍煎紡
鎺у埗甯冨皵鍊煎拰鏍煎紡
cout << "default bool values: "
<< true << " " << false
<< "\nalpha bool values: "
<< boolalpha
<< true << " " << false
<< endl;default bool values: 1 0
alpha bool values: true falsebool bool_val;
cout << boolalpha // sets internal state of cout
<< bool_val
<< noboolalpha; // resets internal state to default formatting鎸囧畾鏁村瀷鍊肩殑鍩烘暟
const int ival = 15, jval = 1024; // const, so values never change
cout << "default: ival = " << ival
<< " jval = " << jval << endl;
cout << "printed in octal: ival = " << oct << ival
<< " jval = " << jval << endl;
cout << "printed in hexadecimal: ival = " << hex << ival
<< " jval = " << jval << endl;
cout << "printed in decimal: ival = " << dec << ival
<< " jval = " << jval << endl;default: ival = 15 jval = 1024
printed in octal: ival = 17 jval = 2000
printed in hexadecimal: ival = f jval = 400
printed in decimal: ival = 15 jval = 1024鎸囧嚭杈撳嚭鐨勫熀鏁?/h5>
const int ival = 15, jval = 1024; // const so values never change
cout << showbase; // show base when printing integral values
cout << "default: ival = " << ival
<< " jval = " << jval << endl;
cout << "printed in octal: ival = " << oct << ival
<< " jval = " << jval << endl;
cout << "printed in hexadecimal: ival = " << hex << ival
<< " jval = " << jval << endl;
cout << "printed in decimal: ival = " << dec << ival
<< " jval = " << jval << endl;
cout << noshowbase; // reset state of the streamdefault: ival = 15 jval = 1024
printed in octal: ival = 017 jval = 02000
printed in hexadecimal: ival = 0xf jval = 0x400
printed in decimal: ival = 15 jval = 1024cout << uppercase << showbase << hex
<< "printed in hexadecimal: ival = " << ival
<< " jval = " << jval << endl
<< nouppercase << endl;printed in hexadecimal: ival = 0XF jval = 0X400
鎺у埗嫻偣鍊肩殑鏍煎紡
鎸囧畾鏄劇ず綺懼害
// cout.precision reports current precision value
cout << "Precision: " << cout.precision()
<< ", Value: " << sqrt(2.0) << endl;
// cout.precision(12) asks that 12 digits of precision to be printed
cout.precision(12);
cout << "Precision: " << cout.precision()
<< ", Value: " << sqrt(2.0) << endl;
// alternative way to set precision using setprecision manipulator
cout << setprecision(3);
cout << "Precision: " << cout.precision()
<< ", Value: " << sqrt(2.0) << endl;Precision: 6, Value: 1.41421
Precision: 12, Value: 1.41421356237
Precision: 3, Value: 1.41
鎺у埗璁版暟娉?/h5>
鎭㈠嫻偣鍊肩殑榛樿璁版暟娉?/h5>
// reset to default handling for notation
cout.unsetf(ostream::floatfield);cout << sqrt(2.0) << '\n' << endl;
cout << "scientific: " << scientific << sqrt(2.0) << '\n'
<< "fixed decimal: " << fixed << sqrt(2.0) << "\n\n";
cout << uppercase
<< "scientific: " << scientific << sqrt(2.0) << '\n'
<< "fixed decimal: " << fixed << sqrt(2.0) << endl
<< nouppercase;
// reset to default handling for notation
cout.unsetf(ostream::floatfield);
cout << '\n' << sqrt(2.0) << endl;1.41421
scientific: 1.414214e+00
fixed decimal: 1.414214
scientific: 1.414214E+00
fixed decimal: 1.414214
1.41421鏄劇ず灝忔暟鐐?/h5>
cout << 10.0 << endl; // prints 10
cout << showpoint << 10.0 // prints 10.0000
<< noshowpoint << endl; // revert to default handling of decimal point濉厖杈撳嚭
int i = -16;
double d = 3.14159;
// pad first column to use minimum of 12 positions in the output
cout << "i: " << setw(12) << i << "next col" << '\n'
<< "d: " << setw(12) << d << "next col" << '\n';
// pad first column and left-justify all columns
cout << left
<< "i: " << setw(12) << i << "next col" << '\n'
<< "d: " << setw(12) << d << "next col" << '\n'
<< right; // restore normal justification
// pad first column and right-justify all columns
cout << right
<< "i: " << setw(12) << i << "next col" << '\n'
<< "d: " << setw(12) << d << "next col" << '\n';
// pad first column but put the padding internal to the field
cout << internal
<< "i: " << setw(12) << i << "next col" << '\n'
<< "d: " << setw(12) << d << "next col" << '\n';
// pad first column, using # as the pad character
cout << setfill('#')
<< "i: " << setw(12) << i << "next col" << '\n'
<< "d: " << setw(12) << d << "next col" << '\n'
<< setfill(' '); // restore normal pad characteri: -16next col
d: 3.14159next col
i: -16 next col
d: 3.14159 next col
i: -16next col
d: 3.14159next col
i: - 16next col
d: 3.14159next col
i: -#########16next col
d: #####3.14159next colA.3.4. 鎺у埗杈撳叆鏍煎紡鍖?/h4>
while (cin >> ch)
cout << ch;a b c
dabcd
cin >> noskipws; // set cin so that it reads whitespace
while (cin >> ch)
cout << ch;
cin >> skipws; // reset cin to default state so that it discards whitespacea b c
dA.3.5. 鏈牸寮忓寲鐨勮緭鍏ワ紡杈撳嚭鎿嶄綔
銆銆姣斿錛屽綋浣犺繘琛屽熀浜庝簨浠剁殑緙栫▼鐨勬椂鍊欙紝浣犲彲浠ュ垱寤哄嚱鏁版潵鍝嶅簲鐢ㄦ埛瀹氫箟鐨勪簨浠訛紙姣斿OnClick浜嬩歡錛夈傚湪鍒╃敤SAX榪涜緙栫▼鐨勬椂鍊欙紝闇瑕佹敞鎰忕殑鏄紝鏄В鏋愬櫒鑰屼笉鏄敤鎴蜂駭鐢熶簨浠躲?br>
銆銆姣斿鑰冭檻涓嬮潰涓涓畝鍗曠殑鏂囨。銆?br>
銆銆錛?xml version="1.0"?錛?br>銆銆錛減arts錛?br>銆銆錛減art錛濼urboWidget錛?part錛?br>銆銆錛?parts錛?br>
銆銆褰揝AX2鍦ㄥ鐞嗚繖涓枃妗g殑鏃跺欙紝瀹冧駭鐢熷涓嬬殑涓緋誨垪鐨勪簨浠訛細
銆銆StartDocument( )
銆銆StartElement( "parts" )
銆銆StartElement( "part" )
銆銆Characters( "TurboWidget" )
銆銆EndElement( "part" )
銆銆EndElement( "parts" )
銆銆EndDocument( )
銆銆鍙互鎶奡AX2鐪嬫垚鏄竴涓湁鎷夌壒鐐癸紙PUSH錛夌殑瑙f瀽鍣紝SAX2浜х敓浜嬩歡錛岀劧鍚庝綘鍙互鑷繁鍘誨鐞嗕簺浜嬩歡銆傚疄闄呬笂錛屽綋SAX2鍦ㄨВ鏋愪竴涓枃妗g殑鏃跺欙紝SAXXMLReader璇昏鏂囨。騫朵駭鐢熶竴緋誨垪鐨勪簨浠訛紝浣犲彲浠ラ夋嫨涓浜涗簨浠惰繘琛屽鐞嗐?br>
銆銆鍒涘緩涓涓簲鐢⊿AX鐨勫簲鐢ㄧ▼搴忔鏋?br>
銆銆SAX2浜х敓鐨勪簨浠跺寘鎷涓嬬殑縐嶇被錛?br>
銆銆¨ 鍜孹ML鏂囨。鍐呭鐩稿叧鐨勪簨浠?ISAXContentHandler)
銆銆¨ 鍜孌TD鐩稿叧鐨勪簨浠?ISAXDTDHandler)
銆銆¨ 鍑虹幇閿欒鏃跺彂鐢熺殑浜嬩歡(ISAXErrorHandler)
銆銆涓轟簡澶勭悊榪欎簺浜嬩歡錛屼綘闇瑕佸疄鐜頒竴涓浉鍏崇殑澶勭悊綾伙紝璇ュ鐞嗙被闇瑕佸寘鍚竴浜涙柟娉曟潵澶勭悊鐩稿叧鐨勪簨浠躲備綘蹇呴』瀵逛綘鎯寵澶勭悊鐨勪簨浠跺疄鐜扮浉鍏崇殑澶勭悊銆傚鏋滀綘涓嶆兂澶勭悊鏌愪竴涓簨浠剁殑璇濓紝鍙渶瑕佺畝鍗曠殑蹇界暐瀹冨氨鍙互銆傚湪瀹為檯搴旂敤涓紝鎴戜滑棣栧厛瑕佺戶鎵胯繖浜涙帴鍙o紝鐢–++鎴戜滑鍙互鍒涘緩涓涓被錛屽湪榪欎釜綾葷殑鏂規硶涓紝鎴戜滑鍙互鍛婅瘔搴旂敤紼嬪簭鍦ㄦ帴鏀跺埌涓涓簨浠剁殑鏃跺欏浣曡繘琛屽鐞嗐備笅闈㈡槸寤虹珛涓涓熀浜嶴AX鐨勫簲鐢ㄧ殑鍩烘湰姝ラ錛?br>
銆銆1錛?鍒涘緩澶存枃浠跺綋浣跨敤SAX2鐨勬椂鍊欙紝鎴戜滑闇瑕佺敤鍒板姩鎬佽繛鎺ュ簱MSXML.DLL,涓轟簡浣跨敤MSXML涓寘鍚殑SAX2鎺ュ彛錛屼綘蹇呴』鍦ㄧ▼搴忕殑澶存枃浠訛紙涓鑸湪stdafx.h涓級涓寘鍚笅鍒楃殑浠g爜錛?br>
銆銆#import
銆銆using namespace MSXML2;
銆銆2錛?寤虹珛鍏蜂綋鐨勬搷浣滐紙handler錛夌被錛孲AX2涓昏瀹氫箟浜嗕笁涓熀鏈殑鎿嶄綔綾伙紝瀹冧滑鍒嗗埆鏄疘SAXContentHandler錛孖SAXDTDHandler鍜孖SAXErrorHandler銆?br>
銆銆ISAXContentHandler鏄敤鏉ュ鐞哠AX2瑙f瀽鍣ㄥ鏂囨。鍐呭榪涜瑙f瀽鏃舵墍浜х敓鐨勬秷鎭殑錛孖SAXXMLReader閫氳繃鏂規硶putContentHandler鏉ユ敞鍐岃繖涓疄渚嬨傝孖SAXDTDHandler鏄敤鏉ュ鐞嗗拰DTD鐩稿叧鐨勫熀鏈殑娑堟伅鐨勶紝ISAXXMLReader閫氳繃鏂規硶putDTDHandler鏉ユ敞鍐岃繖涓疄渚嬨侷SAXErrorHandler鎻愪緵浜嗗鍦ㄨВ鏋愯繃紼嬩腑閬囧埌閿欒鏃朵駭鐢熺殑閿欒浜嬩歡鐨勫鐞嗭紝ISAXXMLReader閫氳繃鏂規硶putErrorHandler鏉ユ敞鍐岃繖涓疄渚?br>
銆銆鍥犱負榪欎笁涓被閮芥槸鐢ㄦ潵瀵逛簨浠惰繘琛屽鐞嗙殑錛屽茍涓旈渶瑕佸湪鎺ュ彛ISAXXMLReader涓繘琛屾敞鍐屻備絾鏄畠浠殑鍩烘湰浣跨敤鏂規硶綾諱技錛屾墍浠ユ垜浠繖閲屽彧璇︾粏鎻忚堪瀵規帴鍙SAXContentHandler 鐨勬搷浣溿?br>
銆銆ISAXContentHandler鎺ュ彛鎺ユ敹鍏充簬鏂囨。鐨勫唴瀹瑰彉鍖栫殑浜嬩歡錛岃繖鏄疄鐜癝AX搴旂敤鎵闇瑕佺殑鏈閲嶈鐨勬帴鍙o紝濡傛灉搴旂敤鍦ㄩ亣鍒板熀鏈殑瑙f瀽浜嬩歡鐨勬椂鍊欓渶瑕佽閫氱煡鐨勮瘽錛孖SAXXMLReader閫氳繃鏂規硶putContentHandler鏉ユ敞鍐岃繖涓疄渚嬶紝鐒跺悗ISAXXMLReader灝變嬌鐢ㄨ繖涓疄渚嬫潵鎶ュ憡鍩轟簬鏂囨。鐨勪簨浠訛紝姣斿鍏冪礌鐨勫紑濮嬶紝鍏冪礌鐨勭粨鏉熷拰鐩稿叧鐨勫瓧絎︿覆鏁版嵁絳夌瓑銆侷SAXContentHandler 鍖呮嫭浜嗗緢澶氱殑鏂規硶錛氭瘮濡俿tartDocument錛宔ndDocument錛宻tartElement錛宔ndElement絳夌瓑銆傚疄闄呬笂瀹冨寘鍚簡濂芥帴涓猻tartXXX鍜宔ndXXX瀵規潵寤虹珛涓嶅悓鐨勪俊鎭泦鍚堢殑鎶借薄銆傛瘮濡俿tartDocument鏂規硶鍦ㄦ枃妗d俊鎭紑濮嬬殑鏃跺欒璋冪敤錛岃屽湪startDocument浠ュ悗琚皟鐢ㄧ殑鏂規硶灝辮璁や負鏄枃妗d俊鎭」錛坕tem錛夌殑瀛愰」銆傚湪鏂囨。淇℃伅鍐呭緇撴潫鐨勬椂鍊檈ndDocument灝辮璋冪敤錛岃〃紺烘枃妗d俊鎭殑緇撴潫銆?瀹為檯涓婃槸SAX2鍦ㄨВ鏋愭枃妗g殑鏃跺欙紝褰撳浜庢枃妗f煇涓浣嶇疆鐨勬椂鍊欙紝浼氭縺鍙戠浉搴旂殑鏂規硶錛屾瘮濡傚綋涓涓枃妗e紑濮嬬殑鏃跺欙紝灝變細嬋鍙憇tartDocument鏂規硶錛屽湪瀹為檯瀹炵幇鐨勬椂鍊欙紝鎴戜滑鍙互鍦ㄦ垜浠戶鎵縄SAXContentHandler綾葷殑瀹炵幇綾諱腑錛岄噸杞借鏂規硶錛屽疄鐜版垜浠嚜宸辨兂瑕佺殑澶勭悊銆傛垜浠彲浠ユ妸榪欎簺鏂規硶鐪嬫垚鏄疘SAXContentHandler鎺ュ彛鎻愪緵緇欐垜浠殑銆傞渶瑕佹敞鎰忕殑鏄簨浠惰澶勭悊鐨勯『搴忓拰淇℃伅鍦ㄦ枃妗d腑鐨勪綅緗槸涓鑷寸殑銆?br>
銆銆鍚屾椂闇瑕佹敞鎰忕殑鏄紝濡傛灉鎴戜滑闇瑕佸湪鎴戜滑鐨勫簲鐢ㄤ腑瀵硅繖浜涙秷鎭繘琛屽鐞嗙殑璇濓紝鎴戜滑灝辮緇ф壙澶勭悊榪欎簺娑堟伅鐨勭被錛屾瘮濡傛垜浠彧闇瑕佸鏂囨。鍐呭榪涜澶勭悊錛岃屽拷鐣ュDTD鍜岃В鏋愯繃紼嬩腑閿欒(Error)鐨勫鐞嗭紝閭d箞鎴戜滑鍙渶瑕佸垱寤轟竴涓柊鐨勭被錛岃綾葷戶鎵縄SAXContentHandler鎺ュ彛錛屽洜涓篒SAXContentHandler涓畾涔変簡寰堝鐨勪簨浠跺鐞嗘柟娉曪紝鑰屼簨瀹炰笂鎴戜滑鍙渶瑕佸鎴戜滑鎵鍏沖績浜嬩歡鐨勫鐞嗘柟娉曡繘琛岄噸杞斤紝瀵規垜浠笉鍏沖績鐨勪簨浠跺彲浠ョ畝鍗曠殑蹇界暐瀹冦?br>
銆銆姣斿鎴戜滑鍙叧蹇僺tartElement鍜宔ndElement浜嬩歡錛岃屼笖鎴戜滑鍋囪鎴戜滑寤虹珛鐨勭被鐨勫悕縐頒負CXMLContentDeal錛屾垜浠殑綾誨氨鍙互濡備笅闈㈡墍紺猴細
銆銆class CXMLContentDeal : public ISAXContentHandler
銆銆銆{
銆銆銆銆public:
銆銆銆銆銆CXMLContentDeal();
銆銆銆銆銆virtual CXMLContentDeal ();
銆銆銆銆銆 virtual HRESULT STDMETHODCALLTYPE startElement(
銆銆銆銆銆銆銆/* [in] */ wchar_t __RPC_FAR *pwchNamespaceUri,
銆銆銆銆銆銆銆/* [in] */ int cchNamespaceUri,
銆銆銆銆銆銆銆/* [in] */ wchar_t __RPC_FAR *pwchLocalName,
銆銆銆銆銆銆銆/* [in] */ int cchLocalName,
銆銆銆銆銆銆銆/* [in] */ wchar_t __RPC_FAR *pwchRawName,
銆銆銆銆銆銆銆/* [in] */ int cchRawName,
銆銆銆銆銆銆銆/* [in] */ ISAXAttributes __RPC_FAR *pAttributes);
銆銆銆銆銆銆virtual HRESULT STDMETHODCALLTYPE endElement(
銆銆銆銆銆銆銆/* [in] */ wchar_t __RPC_FAR *pwchNamespaceUri,
銆銆銆銆銆銆銆/* [in] */ int cchNamespaceUri,
銆銆銆銆銆銆銆/* [in] */ wchar_t __RPC_FAR *pwchLocalName,
銆銆銆銆銆銆銆/* [in] */ int cchLocalName,
銆銆銆銆銆銆銆/* [in] */ wchar_t __RPC_FAR *pwchRawName,
銆銆銆銆銆銆銆/* [in] */ int cchRawName);
銆銆銆銆}
銆銆鐒跺悗鎴戜滑鍙互閲嶈澆鏂規硶startElement鍜宔ndElement鏉ヨ繘琛屽拰搴旂敤鐩稿叧鐨勭壒孌婄殑澶勭悊銆?br>
銆銆3錛?閫氳繃鎺ュ彛ISAXXMLReader鍒涘緩涓涓В鏋愬櫒銆俋MLReader鏄疭AX搴旂敤瀹炵幇鐨勪富瑕佺殑鎺ュ彛錛孹MLReader鐨勪綔鐢ㄦ槸榪欐牱鐨勩?棣栧厛錛孹ML鐨勫紑鍙戜漢鍛樹嬌鐢ㄨ繖涓帴鍙f潵娉ㄥ唽浠栦滑瀵瑰叾浠朣AX鎺ュ彛鐨勫疄鐜幫紙姣斿ContentHandler,DTDHandler,ErrorHandler絳夌瓑錛夛紝鍙﹀錛孹MLREADER閫氳繃setFeature鍜宻etProperty涓や釜鏂規硶鏉ラ厤緗甋AX瑙f瀽鍣ㄧ殑琛屼負錛屾渶鍚庯紝XMLReader灝佽浜嗚В鏋愮殑鍔熻兘銆傜ず渚嬩唬鐮佸涓嬶細
銆銆銆ISAXXMLReader* pRdr = NULL;
銆銆銆HRESULT hr = CoCreateInstance(
銆銆銆銆銆銆__uuidof(SAXXMLReader),
銆銆銆銆銆銆NULL,
銆銆銆銆銆銆CLSCTX_ALL,
銆銆銆銆銆銆__uuidof(ISAXXMLReader),
銆銆銆銆銆銆(void **)&pRdr);
銆銆4錛?鍒涘緩鐩稿簲鐨勪簨浠訛紙handler錛夊鐞嗙被錛岃繖閲屼笉濡ㄥ亣璁炬垜浠彧澶勭悊鍜屾枃妗e唴瀹圭浉鍏崇殑浜嬩歡銆傜ず渚嬩唬鐮佸涓嬶細
銆銆CXMLContentDeal * pMc = new CXMLContentDeal();
銆銆娉ㄦ剰榪欓噷CXMLContentDeal鏄戶鎵挎帴鍙SAXContentHandler鐨勭被銆?br>
銆銆5錛庡湪瑙f瀽鍣ㄤ腑娉ㄥ唽浜嬩歡澶勭悊綾伙紝紺轟緥浠g爜濡備笅錛?br>
銆銆銆hr = pRdr->putContentHandler(pMc);
銆銆6錛庡紑濮嬭繘琛屾枃妗g殑瑙f瀽錛岀ず渚嬩唬鐮佸涓?br>
銆銆銆hr = pRdr->parseURL(URL); file://榪欓噷鐨刄RL鏄寚涓涓叿浣揦ML鏂囨。鐨勪綅緗?br>
銆銆7錛庨噴鏀捐В鏋愬櫒瀵硅薄
銆銆銆pRdr->Release();
銆銆浠ヤ笂灝辨槸鍩轟簬SAX鐨勫簲鐢ㄧ▼搴忕殑妗嗘灦緇撴瀯錛屾垜浠彲浠ョ湅鍒幫紝瀹為檯鐨勪簨浠跺鐞嗘槸鍦ㄦ垜浠殑緇ф壙綾籆XMLContentDeal涓疄鐜扮殑錛屽湪鎴戜滑榪欎釜紺轟緥浠g爜涓紝姣忓綋鏂囨。涓竴涓柊鐨勫厓绱犲紑濮嬬殑鏃跺欙紝閮戒細嬋媧繪柟娉晄tartElement錛屾瘡褰撲竴涓厓绱犵粨鏉熺殑鏃跺欙紝閮戒細嬋媧繪柟娉昬ndElement銆傛垜浠彲浠ュ湪startElement鍜宔ndElement涓啓鍏ュ拰搴旂敤鐩稿叧鐨勭壒瀹氱殑浠g爜銆?
]]>
STL涓湁澶氱鎺掑簭綆楁硶錛屽悇鏈夊悇鐨勯傜敤鑼冨洿錛屼笅闈㈠惉鎴戜竴涓閬撴潵錛?br>
I銆佸畬鍏ㄦ帓搴?/span>
sort()
棣栧厛瑕侀殕閲嶆帹鍑虹殑褰撶劧鏄渶鏈甯哥敤鐨剆ort浜嗭紝sort鏈変袱縐嶅艦寮忥紝絎竴縐嶅艦寮忔湁涓や釜榪唬鍣ㄥ弬鏁幫紝鏋勬垚涓涓墠寮鍚庨棴鐨勫尯闂達紝鎸夌収鍏冪礌鐨?less 鍏崇郴鎺掑簭錛涚浜岀褰㈠紡澶氬姞涓涓寚瀹氭帓搴忓噯鍒欑殑璋撹瘝銆俿ort鍩烘湰鏄渶閫氱敤鐨勬帓搴忓嚱鏁幫紝瀹冧嬌鐢ㄥ揩閫熸帓搴忕畻娉曪紝騫朵笖鍦ㄩ掑綊榪囩▼涓紝褰撳厓绱犳暟鐩皬浜庝竴涓槇鍊鹼紙涓鑸槸16錛屾垜鐨勮瘯楠屾槸24錛夋椂錛岃漿鎴愮洿鎺ユ彃鍏ユ帓搴忋備紵澶х殑鏁板瀹禟nuth宸茬粡璇佹槑錛屽湪騫沖潎鎰忎箟涓婏紝蹇熸帓搴忔槸鏈蹇殑浜嗭紱褰撶劧錛屾渶鍧忓鏉傛ф瘮杈冨樊銆俿ort瑕佹眰闅忔満榪唬鍣紝鍥犳瀵逛簬寰堝緙栬瘧鍣ㄦ潵璇達紝瀵逛簬鍓嶅悜榪唬鍣紙濡俵ist錛変嬌鐢╯ort鏄竴涓紪璇戦敊璇?涓嶈繃錛屽湪vc2005閲岄潰錛岃繖涓敊璇俊鎭疄鍦ㄥ緢緋熺硶)
sort鐨勫熀鏈嬌鐢ㄦ柟寮忓涓嬶細
緇忓父鏈変漢闂浣曚粠澶у埌灝忛嗘帓搴忥紝榪欎釜鍏跺疄鏈夊緢澶氫腑鏂瑰紡瀹炵幇錛屽涓嬮潰鐨勪緥瀛愶細
鏈鍚庝竴縐嶆柟娉曟槸鎴戞瘮杈冩璧忕殑錛屽彲浠ヤ笉鑳界洿鎺ュ鍘熺敓鏁扮粍浣跨敤錛屼篃灝辨槸璇達紝濡傛灉ar鐨勫畾涔夋槸int ar[MAXN]錛屼笂闈㈠叾浠栫殑鎺掑簭綆楁硶閮藉彲浠ョ畝鍗曠殑鏀規垚sort(ar, ar+MAXN, ...錛夛紝浣嗘渶鍚庝竴涓笉琛岋紝瑕佺敤鍙﹀涓縐嶆瘮杈冧笐闄嬬殑鏂瑰紡錛?br>
stable_sort
sort浼樼偣涓澶у爢錛屼竴涓己鐐瑰氨鏄畠涓嶆槸涓縐嶇ǔ瀹氱殑鎺掑簭銆備粈涔堟槸鎺掑簭鐨勭ǔ瀹氭э紝灝辨槸濡傛灉鍑虹幇涓や釜鍏冪礌鐩哥瓑鏃訛紝瑕佹眰鎺掑簭涔嬪悗浠栦滑涔嬮棿淇濇寔鍘熸潵鐨勬搴忥紙姣斿鎴戜滑鍏堟寜瀛﹀彿鎺掑簭錛岀劧鍚庢寜鎴愮嘩鎺掑簭錛岃繖鏃跺氨甯屾湜鎴愮嘩鐩稿悓鐨勮繕鏄寜鐓у鍙風殑嬈″簭鎺掞級銆傚緢鍙儨錛屽揩閫熸帓搴忕畻娉曞氨涓嶆槸紼沖畾鐨勶紝瑕佽拷姹傝繖涓紝鍙ソ鐢╯table_sort浜嗐?br>
鍦ㄥ悇縐嶆帓搴忕畻娉曚腑錛屽悎騫舵帓搴忔槸紼沖畾鐨勶紝浣嗕竴鑸殑鍚堝茍鎺掑簭闇瑕侀澶栫殑O(N)鐨勫瓨鍌ㄧ┖闂達紝鑰岃繖涓潯浠朵笉鏄竴瀹氳兘澶熸弧瓚崇殑錛堝彲鑳芥槸姣旇緝濂緢鐨勶級銆傛墍浠ュ湪stable_sort鍐呴儴錛岄鍏堝垽鏂槸鍚︽湁瓚沖鐨勯澶栫┖闂達紙濡倂ecotr涓殑cap-size()閮ㄥ垎錛夛紝鏈夌殑璇濆氨浣跨敤鏅氬悎騫跺嚱鏁幫紝鎬葷殑鏃墮棿澶嶆潅鎬у拰蹇熸帓搴忎竴涓暟閲忕駭錛岄兘鏄疧(N*logN)銆傚鏋滄病鏈夐澶栫┖闂達紝浣跨敤浜嗕竴涓猰erge_without_buffer鐨勫叧閿嚱鏁拌繘琛屽氨鍦板悎騫訛紙濡備綍瀹炵幇鏄瘮杈冩湁鎶宸х殑錛屽畬鍏ㄥ彲浠ヤ笓闂ㄨ皥涓璋堬級錛岃繖涓悎騫惰繃紼嬩笉闇瑕侀澶栫殑瀛樺偍絀洪棿錛屼絾鏃墮棿澶嶆潅搴﹀彉鎴怬(N*logN)錛岃繖縐嶆儏鍐典笅錛屾葷殑stable_sort鏃墮棿澶嶆潅搴︽槸O(N*logN*logN)銆?br>
鎬諱箣錛宻table_sort紼嶅井鎱竴鐐瑰効錛屼絾鑳藉淇濊瘉紼沖畾錛屼嬌鐢ㄦ柟娉曞拰sort涓鏍楓備絾寰堝鏃跺欏彲浠ヤ笉鐢ㄨ繖縐嶆柟寮忓拰榪欎釜鍑芥暟錛屾瘮濡備笂闈㈢殑渚嬪瓙錛屽畬鍏ㄥ彲浠ュ湪鎺掑簭姣旇緝鍑嗗垯涓啓鍏ユ垚緇╁拰瀛﹀彿涓や釜鏉′歡灝監K浜?br>
sort_heap
鍫嗘帓搴忎篃鏄竴縐嶅揩閫熺殑鎺掑簭綆楁硶錛屽鏉傚害涔熸槸O(N*logN)銆係TL涓湁涓浜涘拰鍫嗙浉鍏崇殑鍑芥暟錛岃兘澶熸瀯閫犲爢錛屽鏋滃湪鏋勯犲ソ鐨勫爢涓婃瘡嬈″彇鍑烘潵鏍硅妭鐐規斁鍦ㄥ熬閮紝鎵鏈夊厓绱犲驚鐜竴閬嶏紝鏈鍚庣殑緇撴灉涔熷氨鏈夊簭浜嗐傝繖灝辨槸sort_heap浜嗐傚畠鐨勪嬌鐢ㄨ姹傚尯闂村墠闈㈠凡緇忔瀯閫犳垚鍫嗭紝濡傦細
list.sort
瀵逛簬list瀹瑰櫒錛屾槸涓嶈兘鐩存帴浣跨敤sort鐨勶紙鍖呮嫭stable_sort錛夛紝浠庢妧鏈殑瑙掑害鏉ヨ鏄敱浜巗ort瑕佹眰闅忔満榪唬鍣紱浠庣畻娉曠殑瑙掑害鏉ヨ錛宭ist榪欑閾捐〃緇撴瀯灝變笉閫傚悎鐢ㄥ揩閫熸帓搴忋傚洜姝わ紝list瀹瑰櫒鍐呴儴瀹炵幇浜嗕笓闂ㄧ殑sort綆楁硶錛岃繖涓畻娉曢噰鐢ㄧ殑鏄悎騫舵帓搴忥紝搴旇鏄ǔ瀹氱殑錛堜笉紜畾錛夈?br>
鍏朵粬
浼樺厛闃熷垪錛坧riority_queue錛夋瘡嬈″脊鍑虹殑閮芥槸max鍊箋傚疄闄呬笂灝辨槸heap鐨勪竴涓鍣ㄦ柟寮忕殑鍖呰銆?
鍏寵仈寮忓鍣ㄨ嚜韜氨蹇呴』鏄湁搴忕殑錛堥拡瀵筴ey錛夛紝瀵瑰叾榪唬鏃訛紝key鏄掑鐨勩?
II銆侀儴鍒嗘帓搴?/span>
榪欎簺閮ㄥ垎鎺掑簭鍔熻兘鑳藉瀹屾垚涓孌墊暟鎹紙鑰屼笉鏄墍鏈夛級鐨勬帓搴忥紝鍦ㄩ傚綋鐨勯傚悎浣跨敤鍙互鑺傜渷璁$畻閲忋備笉榪囩敤鐨勪漢涓嶅銆?br>
partial_sort(), partial_sort_copy()
榪欎袱涓嚱鏁拌兘澶熷皢鏁翠釜鍖洪棿涓粰瀹氭暟鐩殑鍏冪礌榪涜鎺掑簭錛屼篃灝辨槸璇達紝緇撴灉涓彧鏈夋渶灝忕殑M涓厓绱犳槸鏈夊簭鐨勩備綘褰撶劧涔熷彲浠ヤ嬌鐢╯ort錛屽尯鍒氨鍦ㄤ簬鏁堢巼銆傚鏋淢鏄捐憲鍦板皬浜嶯錛屾椂闂村氨姣旇緝鐭紱褰撶劧M澶皬浜嗕篃涓嶅ソ錛岄偅榪樹笉濡傛尐涓壘鏈灝忓間簡銆?br>
partial_sort鎺ュ彈涓変釜鍙傛暟錛屽垎鍒槸鍖洪棿鐨勫ご錛屼腑闂村拰緇撳熬銆傛墽琛屽悗錛屽皢鍓嶉潰M錛圡=涓棿錛嶅ご錛変釜鍏冪礌鏈夊簭鍦版斁鍦ㄥ墠闈紝鍚庨潰鐨勫厓绱犺偗瀹氭槸姣斿墠闈㈢殑澶э紝浣嗕粬浠唴閮ㄧ殑嬈″簭娌℃湁淇濊瘉銆俻artial_sort_copy鐨勫尯鍒湪浜庢妸緇撴灉鏀懼埌鍙﹀鎸囧畾鐨勮凱浠e櫒鍖洪棿涓細
榪欎袱涓嚱鏁扮殑瀹炵幇浣跨敤鐨勬槸鍫嗙殑鏂規硶錛屽厛灝嗗墠M涓厓绱犳瀯閫犳垚鍫嗭紝鐒跺悗鎸ㄤ釜媯鏌ュ悗闈㈢殑鍏冪礌錛岀湅鐪嬫槸鍚﹀皬浜庡爢鐨勬渶澶у鹼紝鏄殑璇濆氨褰兼浜ゆ崲錛岀劧鍚庨噸鎺掑爢錛涙渶鍚庡皢鍓嶉潰宸茬粡鏄渶灝忕殑M涓厓绱犳瀯鎴愮殑鍫嗕綔涓嬈ort_heap灝卞彲浠ヤ簡銆傜畻娉曠殑澶嶆潅搴﹀樊涓嶅鏄疧(N*logM)
nth_element
榪欎釜鍑芥暟鍙湡姝f帓搴忓嚭涓涓厓绱犳潵錛屽氨鏄n涓傚嚱鏁版湁涓変釜榪唬鍣ㄧ殑杈撳叆錛堝綋鐒惰繕鍙互鍔犱笂涓涓皳璇嶏級錛屾墽琛屽畬姣曞悗錛屼腑闂翠綅緗寚鍚戠殑鍏冪礌淇濊瘉鍜屽畬鍏ㄦ帓搴忓悗榪欎釜浣嶇疆鐨勫厓绱犱竴鑷達紝鍓嶉潰鍖洪棿鐨勫厓绱犻兘灝忎簬錛堢簿紜湴璇達紝鏄笉澶т簬錛夊悗闈㈠尯闂寸殑鍏冪礌銆?br>
鐔熸倝蹇熸帓搴忕殑椹笂灝辮兘鍙戠幇錛岃繖瀹為檯涓婃槸涓涓寜浣嶇疆鍒掑垎鐨勭畻娉曘係TL鐨勮鑼冧腑瑕佹眰姝ゅ嚱鏁扮殑騫沖潎澶嶆潅搴︽槸綰挎х殑錛屽拰蹇熸帓搴忎竴鏍鳳紝榪欑綆楁硶鐨勬渶鍧忓鏉傚害姣旇緝宸傚湪涓鑸殑瀹炵幇錛堝SGI錛変腑錛岄噰鐢ㄤ笁縐嶅彇1鐨勬柟娉曞鎵懼垝鍒嗗厓绱狅紝鏈鍧忓鏉傚害鏄疧(N^N)銆傝櫧鐒剁悊璁轟笂鏈変竴浜涚畻娉曞彲浠ヤ繚璇佹渶鍧忕嚎鎬у鏉傚害錛屼絾綆楁硶榪囦簬澶嶆潅錛孲TL涓鑸篃涓嶉噰鐢ㄣ?
III銆佹帓搴忚緟鍔╁姛鑳?/span>
partition, stable_partition
merge, inplace_merge
IV銆佹湁搴忓尯闂存搷浣?/span>
榪欎釜鍑嗗鍗曠嫭鍐欎竴綃?br>
璁╂垜浠戶緇湡寰呴儹鑰佸笀鐨勮ˉ鍏咃紒
閮佸笀鐨刡oke鍦板潃 www.skywind.name/blog
]]>
緙栬瘧閫氳繃浜嗭紝鍙繛鎺ユ庝箞涔熶笉鑳芥垚鍔熴傘?/font>
鏌ヤ簡涓浜涗功鎵嶇煡閬擄紝妯℃澘綾葷殑瀹氫箟鍜屽疄鐜板繀欏繪斁鍦ㄥ悓涓鏂囦歡錛?/font>
銆奵++緙栫▼鎬濇兂銆嬩腑璇達細妯℃澘綾誨畾涔夊緢鐗規畩錛岀敱template<...>瀹氫箟鐨勪換浣曚笢瑗塊兘鎰忓懗鐫緙栬瘧鍣ㄥ湪褰撴椂涓嶄負瀹冨垎閰嶅唴瀛樼┖闂達紝瀹冧竴鐩村浜庣瓑寰呯姸鎬侊紝鐩村埌琚竴涓ā鏉垮疄渚嬪憡鐭ワ紝鍗蟲ā鏉垮弬鏁版槸鐢辯紪璇戝櫒鏉ユ浛鎹㈢殑銆?nbsp;
涓轟簡瀹規槗浣跨敤錛屽嚑涔庢繪槸鍦ㄥご鏂囦歡涓斁緗叏閮ㄧ殑妯℃澘澹版槑鍜屽畾涔夈傛湁鏃訛紝涔熷彲鑳戒負浜嗘弧瓚崇壒孌婇渶瑕佽岃鍦ㄧ嫭绔嬬殑cpp涓斁緗ā鏉跨殑瀹炵幇銆備絾澶ч儴鍒嗙幇鍦ㄧ殑緙栬瘧鍣ㄨ繕涓嶆敮鎸佹ā鏉跨被鐨勫畾涔夊拰瀹炵幇鍒嗗紑
浠ヤ笅鐨?/span>鍑芥暟鐢熸垚涓涓暱搴︿負0x500錛堝悎10榪涘埗鏁幫細1280錛夌殑cryptTable[0x500]
void prepareCryptTable()
{
unsigned long seed = 0x00100001, index1 = 0, index2 = 0, i;
for( index1 = 0; index1 < 0x100; index1++ )
{
for( index2 = index1, i = 0; i < 5; i++, index2 += 0x100 )
{
unsigned long temp1, temp2;
seed = (seed * 125 + 3) % 0x2AAAAB;
temp1 = (seed & 0xFFFF) << 0x10;
seed = (seed * 125 + 3) % 0x2AAAAB;
temp2 = (seed & 0xFFFF);
cryptTable[index2] = ( temp1 | temp2 );
}
}
}浠ヤ笅鍑芥暟璁$畻lpszFileName 瀛楃涓茬殑hash鍊鹼紝鍏朵腑dwHashType 涓?/span>hash鐨勭被鍨嬶紝鍦ㄤ笅闈?/span>GetHashTablePos鍑芥暟閲岄潰璋冪敤鏈嚱鏁幫紝鍏跺彲浠ュ彇鐨勫間負0銆?/span>1銆?/span>2錛涜鍑芥暟榪斿洖lpszFileName 瀛楃涓茬殑hash鍊鹼紱
unsigned long HashString( char *lpszFileName, unsigned long dwHashType )
{
unsigned char *key = (unsigned char *)lpszFileName;
unsigned long seed1 = 0x7FED7FED;
unsigned long seed2 = 0xEEEEEEEE;
int ch;
while( *key != 0 )
{
ch = toupper(*key++);
seed1 = cryptTable[(dwHashType << 8) + ch] ^ (seed1 + seed2);
seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3;
}
return seed1;
}typedef struct
{
int nHashA;
int nHashB;
char bExists;
......
} SOMESTRUCTRUE;
涓縐嶅彲鑳界殑緇撴瀯浣撳畾涔夛紵lpszString 涓鴻鍦?/span>hash琛ㄤ腑鏌ユ壘鐨勫瓧絎︿覆錛?/span>lpTable 涓哄瓨鍌ㄥ瓧絎︿覆hash鍊肩殑hash琛?/span>
int GetHashTablePos( har *lpszString, SOMESTRUCTURE *lpTable )
{
int nHash = HashString(lpszString);
int nHashPos = nHash % nTableSize;
if ( lpTable[nHashPos].bExists && !strcmp( lpTable[nHashPos].pString, lpszString ) )
{
return nHashPos;
}
else
{
return -1;
}鐪嬪埌姝わ紝鎴戞兂澶у閮藉湪鎯充竴涓緢涓ラ噸鐨勯棶棰橈細“濡傛灉涓や釜瀛楃涓插湪鍝堝笇琛ㄤ腑瀵瑰簲鐨勪綅緗浉鍚屾庝箞鍔烇紵”,姣曠珶涓涓暟緇勫閲忔槸鏈夐檺鐨勶紝榪欑鍙兘鎬у緢澶с傝В鍐寵闂鐨勬柟娉曞緢澶氾紝鎴戦鍏堟兂鍒扮殑灝辨槸鐢?#8220;閾捐〃”,鎰熻阿澶у閲屽鐨勬暟鎹粨鏋勬暀浼氫簡榪欎釜鐧捐瘯鐧劇伒鐨勬硶瀹濓紝鎴戦亣鍒扮殑寰堝綆楁硶閮藉彲浠ヨ漿鍖栨垚閾捐〃鏉ヨВ鍐籌紝鍙鍦ㄥ搱甯岃〃鐨勬瘡涓叆鍙f寕涓涓摼琛紝淇濆瓨鎵鏈夊搴旂殑瀛楃涓插氨OK浜嗐備簨鎯呭埌姝や技涔庢湁浜嗗畬緹庣殑緇撳眬錛屽鏋滄槸鎶婇棶棰樼嫭鑷氦緇欐垜瑙e喅錛屾鏃舵垜鍙兘灝辮寮濮嬪畾涔夋暟鎹粨鏋勭劧鍚庡啓浠g爜浜嗐傜劧鑰?/span>Blizzard鐨勭▼搴忓憳浣跨敤鐨勬柟娉曞垯鏄洿綺懼鐨勬柟娉曘傚熀鏈師鐞嗗氨鏄細浠栦滑鍦ㄥ搱甯岃〃涓笉鏄敤涓涓搱甯屽艱屾槸鐢ㄤ笁涓搱甯屽兼潵鏍¢獙瀛楃涓層?/span>
MPQ浣跨敤鏂囦歡鍚嶅搱甯岃〃鏉ヨ窡韙唴閮ㄧ殑鎵鏈夋枃浠躲備絾鏄繖涓〃鐨勬牸寮忎笌姝e父鐨勫搱甯岃〃鏈変竴浜涗笉鍚屻傞鍏堬紝瀹冩病鏈変嬌鐢ㄥ搱甯屼綔涓轟笅鏍囷紝鎶婂疄闄呯殑鏂囦歡鍚嶅瓨鍌ㄥ湪琛ㄤ腑鐢ㄤ簬楠岃瘉錛屽疄闄呬笂瀹冩牴鏈氨娌℃湁瀛樺偍鏂囦歡鍚嶃傝屾槸浣跨敤浜?/span>3縐嶄笉鍚岀殑鍝堝笇錛氫竴涓敤浜庡搱甯岃〃鐨勪笅鏍囷紝涓や釜鐢ㄤ簬楠岃瘉銆傝繖涓や釜楠岃瘉鍝堝笇鏇夸唬浜嗗疄闄呮枃浠跺悕銆?/span>
褰撶劧浜嗭紝榪欐牱浠嶇劧浼氬嚭鐜?/span>2涓笉鍚岀殑鏂囦歡鍚嶅搱甯屽埌3涓悓鏍風殑鍝堝笇銆備絾鏄繖縐嶆儏鍐靛彂鐢熺殑姒傜巼騫沖潎鏄?/span>1:18889465931478580854784錛岃繖涓鐜囧浜庝換浣曚漢鏉ヨ搴旇閮芥槸瓚沖灝忕殑銆傜幇鍦ㄥ啀鍥炲埌鏁版嵁緇撴瀯涓婏紝Blizzard浣跨敤鐨勫搱甯岃〃娌℃湁浣跨敤閾捐〃錛岃岄噰鐢?/span>"欏哄歡"鐨勬柟寮忔潵瑙e喅闂錛岀湅鐪嬭繖涓畻娉曪細lpszString 涓鴻鍦?/span>hash琛ㄤ腑鏌ユ壘鐨勫瓧絎︿覆錛?/span>lpTable 涓哄瓨鍌ㄥ瓧絎︿覆hash鍊肩殑hash琛紱nTableSize 涓?/span>hash琛ㄧ殑闀垮害錛?/span>
int GetHashTablePos( char *lpszString, MPQHASHTABLE *lpTable, int nTableSize )
{
const int HASH_OFFSET = 0, HASH_A = 1, HASH_B = 2;
int nHash = HashString( lpszString, HASH_OFFSET );
int nHashA = HashString( lpszString, HASH_A );
int nHashB = HashString( lpszString, HASH_B );
int nHashStart = nHash % nTableSize;
int nHashPos = nHashStart;
while ( lpTable[nHashPos].bExists )
{
/*濡傛灉浠呬粎鏄垽鏂湪璇ヨ〃涓椂鍊欏瓨鍦ㄨ繖涓瓧絎︿覆錛屽氨姣旇緝榪欎袱涓?/span>hash鍊煎氨鍙互浜嗭紝涓嶇敤瀵?/span>
*緇撴瀯浣撲腑鐨勫瓧絎︿覆榪涜姣旇緝銆傝繖鏍蜂細鍔犲揩榪愯鐨勯熷害錛熷噺灝?/span>hash琛ㄥ崰鐢ㄧ殑絀洪棿錛熻繖縐?/span>
*鏂規硶涓鑸簲鐢ㄥ湪浠涔堝満鍚堬紵*/
if ( 銆 lpTable[nHashPos].nHashA == nHashA
&& lpTable[nHashPos].nHashB == nHashB )
{
return nHashPos;
}
else
{
nHashPos = (nHashPos + 1) % nTableSize;
}
if (nHashPos == nHashStart)
break;
}
return -1;
}/*key涓轟竴涓瓧絎︿覆錛?/span>nTableLength涓哄搱甯岃〃鐨勯暱搴?/span>
*璇ュ嚱鏁板緱鍒扮殑hash鍊煎垎甯冩瘮杈冨潎鍖*/
unsigned long getHashIndex( const char *key, int nTableLength )
{
unsigned long nHash = 0;
while (*key)
{
nHash = (nHash<<5) + nHash + *key++;
}
return ( nHash % nTableLength );
}琛ュ厖2錛?/span>
鍝?甯岃〃鐨勬暟緇勬槸瀹氶暱鐨勶紝濡傛灉澶ぇ錛屽垯嫻垂錛屽鏋滃お灝忥紝浣撶幇涓嶅嚭鏁堢巼銆傚悎閫傜殑鏁扮粍澶у皬鏄搱甯岃〃鐨勬ц兘鐨勫叧閿傚搱甯岃〃鐨勫昂瀵告渶濂芥槸涓涓川鏁般傚綋鐒訛紝鏍規嵁涓嶅悓鐨勬暟 鎹噺錛屼細鏈変笉鍚岀殑鍝堝笇琛ㄧ殑澶у皬銆傚浜庢暟鎹噺鏃跺鏃跺皯鐨勫簲鐢紝鏈濂界殑璁捐鏄嬌鐢ㄥ姩鎬佸彲鍙樺昂瀵哥殑鍝堝笇琛紝閭d箞濡傛灉浣犲彂鐜板搱甯岃〃灝哄澶皬浜嗭紝姣斿鍏朵腑鐨勫厓绱犳槸鍝?甯岃〃灝哄鐨?/font>2鍊嶆椂錛屾垜浠氨闇瑕佹墿澶у搱甯岃〃灝哄錛屼竴鑸槸鎵╁ぇ涓鍊嶃備笅闈㈡槸鍝堝笇琛ㄥ昂瀵稿ぇ灝忕殑鍙兘鍙栧鹼細17, 37, 79, 163, 331,
673, 1361, 2729, 471, 10949,
21911, 43853, 87719, 175447, 350899,
701819, 1403641, 2807303, 5614657, 11229331,
22458671, 44917381, 89834777, 179669557, 359339171,
718678369, 1437356741, 2147483647涓銆?/span>C涓?/span>const鐨勭敤娉曟葷粨璧鋒潵涓昏鍒嗕負浠ヤ笅涓ょ錛?/span>
鍦ㄥ畾涔夊彉閲忔椂浣跨敤錛堟敞鎰忥細鍦ㄥ畾涔夊彉閲忔椂浣跨敤const錛屼竴瀹氳榪涜鍒濆鍖栨搷浣滐級錛?/span>
鏈綆鍗曠殑鐢ㄦ硶錛岃鏄庡彉閲忎負涓涓父鍙橀噺錛?/span>
const int a=100;
int const b=100;
璇存槑鎸囬拡涓烘寚鍚戝父鏁扮殑鎸囬拡錛屽嵆鎸囬拡鏈韓鐨勫兼槸鍙互鏀瑰彉鐨勶細
const int *a=&b錛?/span>
int const *a=&b錛?/span>
璇存槑鎸囬拡鏈韓鐨勫間笉鍙敼鍙橈紝浣嗘寚鍚戠殑鍐呭鍙敼鍙?/span>錛?/span>
int * const a = &b錛?/span>
璇存槑鎸囬拡涓烘寚鍚戝父鏁扮殑甯告寚閽?/span>,鍗蟲寚閽堟湰韜笌鎸囬拡鎸囧悜鐨勫唴瀹歸兘涓嶅彲鏀瑰彉錛?/span>
const int * const a = &b錛?/span>
璇存槑寮曠敤涓哄父鏁板紩鐢?/span>,鍗充笉鑳芥敼鍙樺紩鐢ㄧ殑鍊鹼細
const int &a=100銆?/span>
鍦ㄥ畾涔夊嚱鏁版椂浣跨敤錛?/span>
鍋氫負鍙傛暟浣跨敤錛岃鏄庡嚱鏁頒綋鍐呮槸涓嶈兘淇敼璇ュ弬鏁扮殑錛?/span>
void func(const int a)錛?/span>
void func(int const a)錛?/span>
鍋氫負榪斿洖鍊間嬌鐢紝璇存槑鍑芥暟鐨勮繑鍥炲兼槸涓嶈兘琚慨鏀圭殑錛?/span>
const int func()錛?/span>
鍦ㄥ嚱鏁頒腑浣跨敤const,鎯呭喌涓庡畾涔夊彉閲忕殑鎯呭喌鍩烘湰涓鑷達細
int func()
{
Const int a=10錛?/span>
…
}
浜屻?/span>C++涓尯鍒簬C鐨?/span>const鐢ㄦ硶涓昏鍒嗕負浠ヤ笅涓ょ
const綾繪垚鍛?/span>
const綾繪垚鍛樺湪瀵硅薄鏋勯犳湡闂村厑璁歌鍒濆鍖栧茍涓斿湪浠ュ悗涓嶅厑璁歌鏀瑰彉銆?/span>const綾繪垚鍛樺拰涓鑸殑const 鍙橀噺鏈夋墍涓嶅悓銆?/span>const綾繪垚鍛樻槸瀵瑰簲浜庢瘡涓璞¤岃█錛屽畠鍦ㄥ璞℃瀯閫犳湡闂磋鍒濆鍖栵紝鍦ㄨ繖涓璞$殑鐢熷瓨鍛ㄦ湡涓笉鍏佽琚敼鍙樸?/span>
const 鎴愬憳鍑芥暟
const 鎴愬憳鍑芥暟涓嶅厑璁稿湪姝ゅ嚱鏁頒綋鍐呭姝ゅ嚱鏁板搴旂殑綾葷殑鎵鏈夋垚鍛樺彉閲忚繘琛屼慨鏀癸紝榪欐牱鍙互鎻愰珮紼嬪簭鐨勫仴澹с?/span>Const涓鑸斁鍦ㄥ嚱鏁頒綋鍚庯細
void fun() const銆?/span>
鎴戞繪槸榧撳姳 C/C++ 鐨勫涔犺咃紝鍦ㄥ垰鎺ヨЕ榪欎釜紼嬪紡璇█鐨勬椂鍊欙紝鍏堜互 console mode錛圖OS-like錛夌▼寮忎負鐩爣銆傛崲璦涔嬶紝涓嶈涓寮濮嬪氨鎯沖啓 GUI 紼嬪紡銆佹兂寮瑙嗙獥銆佹兂鏈夌湬鐩寒涓界殑鐢婚潰 -- 閭e彧鏄湭璧板厛椋烇紝鎻犺嫍鍔╅暱緗簡銆?br>鎵璋?console 紼嬪紡錛屽氨鏄枃瀛楁ā寮忕殑紼嬪紡錛屾垜浠彲浠ュ湪鍏朵腑濂藉ソ鎶?C/C++ 鐨勮璦鏍瑰熀緇冨ソ錛岃屼笉浼氬垎蹇冩柤鍏朵粬鏆傛棤蹇呰鐨?GUI 鏋濊妭涓娿?br>鎴戜竴鐩翠互涓猴紝榪欐槸鐞嗘墍褰撶劧鐨勪簨鎯咃紝鍗翠篃涓鐩村彂鐜幫紝鏈変笉灝戝ぇ涓撻櫌鏍$殑澶т竴 C/C++ 璇劇▼錛屽悓瀛︿滑蹇呴』鍐欎釜灝忎綔瀹躲佸皬鐢誨銆佸皬綆楃洏鈹呭仛涓烘湡涓垨鏈熸湯浣滀笟銆?br>鏋滅劧涓栫晫涓嶈兘澶у悓錛屽悇浜虹湅娉曟畩寮?:)
鎴戜笉浣嗚涓?C/C++ 紼嬪紡寮鍙戝璞″垵鏈熻浠?console mode 涓轟富錛屾垜涔熻涓猴紝C/C++ 鐨勭▼寮忓紑鍙戠幆澧冿紝鍒濇湡涔熻浠?console mode 涓轟富銆傛崲璦涔嬶紝涓嶈涓寮濮嬪氨榪涘叆鏁村悎鐜錛圛DE錛夈傛暣鍚堢幆澧冧腑閭i航澶氳紿椼侀偅楹藉鍔熻兘銆侀偅楹藉棰勮鍊鹼紝浼氳紼嬪紡鏂版墜鐪艱姳鎾╀貢錛屾棤娉曟帉鎻$▼寮忕紪璇戣繃紼嬩腑涓浜涙湁浠峰肩殑鐭ヨ瘑涓庣粡楠屻?br>絳夋垜浠緙栬瘧紼嬪簭鏈変簡璧風爜鐨勪簡瑙o紝鍐嶆潵浣跨敤鏁村悎鐜錛屾垜璁や負榪欐墠鏈濂姐?br>鎵浠ヤ笉璁哄湪 <娣卞叆嫻呭嚭 MFC> 鎴?<澶氬瀷涓庤櫄鎷?gt; 涔︾睄涓紝鎴戦兘浼氱畝榪癱onsole mode 涓嬬殑浣滀笟鏂瑰紡銆?lt;娣卞叆嫻呭嚭 MFC> 鍦?p.224 鍒楀嚭錛?lt;澶氬瀷涓庤櫄鎷?gt; 鍦?p.233 鍒楀嚭銆?br>浣嗕粛鐒跺伓鑰屼細鏀跺埌緗戝弸錛堜笉璁烘槸鍚︿笂涓ゆ湰涔︾殑璇昏咃級鐨勮闂紝璇㈤棶console mode 鐨勭紪璇戞柟寮忥紝鎴栬闂粬浠墍閬亣鐨勯棶棰樸?br>鎴戝啀嬈℃暣鐞嗚繖涓鐩傚啀鏈夌被浼奸棶棰橈紝鎴戝氨鍙互鏁寸瘒 mail 緇欏彂闂呬簡銆?br>鈽呪槄 娉ㄦ剰錛氫互涓嬮傚悎 PC 鐜 鈽呪槄
鈼廋/C++ 緙栬瘧鍣ㄩ渶瑕佺殑鐜鍙樻暟璁懼畾
鍙ゆ棭浠ユ潵錛孭C 涓婄殑 C 緙栬瘧鍣紝灝遍渶瑕佷袱涓幆澧冨彉鏁幫細
LIB錛氳繖涓幆澧冨彉鏁板憡璇夌紪璇戝櫒璇達紝蹇呰鐨?libraries 鍦ㄥ摢閲岋紙鍝釜紓佺鐩綍涓嬶級
INCLUDE錛氬憡璇夌紪璇戝櫒璇達紝蹇呰鐨?header files 鍦ㄥ摢閲岋紙鍝釜紓佺鐩綍涓嬶級
鍙﹀錛屼負浜嗚鎴戜滑鑳藉鍦ㄤ換浣?working directory 閮藉彨寰楀埌緙栬瘧鍣紝褰撶劧鎴戜滑蹇呴』璁懼畾 PATH銆?br>浠庡彜鏃╀互鏉ワ紝涓鐩村埌鐜板湪錛孋/C++ 緙栬瘧鍣ㄩ兘闇瑕佽繖涓変釜鐜鍙樻暟銆?br>鈼忎互 Visual C++ 涓轟緥
浠?Visual C++ 涓轟緥錛屽鏋滃畨瑁呭緦鐨勬。妗堝竷灞濡備笅錛?br>C:\MSDEV\VC98\BIN : 榪欓噷鏀炬湁緙栬瘧鍣?CL.EXE
C:\MSDEV\VC98\INCLUDE : 榪欓噷鏀炬湁 C/C++ header files
C:\MSDEV\VC98\LIB : 榪欓噷鏀炬湁 C/C++ standard libraries
閭i航浣犲彲浠ュ啓涓涓壒嬈℃。濡備笅錛?br>set PATH=C:\MSDEV\VC98\BIN;C:\MSDEV\COMMON\MSDEV98\BIN
set INCLUDE=C:\MSDEV\VC98\INCLUDE
set LIB=C:\MSDEV\VC98\LIB
涔嬫墍浠ラ渶瑕佸彟澶栬瀹?PATH=C:\MSDEV\COMMON\MSDEV98\BIN錛屾槸鍥犱負緙栬瘧鍣?CL.EXE 鎵ц鏃墮渶瑕?MSPDB60.DLL錛岃屽畠琚畨瑁呮柤 C:\MSDEV\COMMON\MSDEV98\BIN 涔嬩腑銆?br>濡傛灉浣犲啓鐨勭▼寮忎笉鍙槸鍗曠函鐨?C/C++ 紼嬪紡錛岃繕鐢ㄥ埌浜?MFC錛屼竴鏍峰彲浠ュ湪 console mode 涓嬬紪璇戯紝榪欐椂鍊欎綘鐨勭幆澧冨彉鏁板簲璇ュ姝よ瀹氾細
set PATH=C:\MSDEV\VC98\BIN;C:\MSDEV\COMMON\MSDEV98\BIN
set INCLUDE=C:\MSDEV\VC98\INCLUDE;C:\MSDEV\VC98\MFC\INCLUDE
set LIB=C:\MSDEV\VC98\LIB;C:\MSDEV\VC98\MFC\LIB
澶氭寚瀹氫簡 MFC\INCLUDE 鍜?MFC\LIB錛屽氨鍙互璁╃紪璇戝櫒鍜岃仈緇撳櫒鎵懼埌 MFC 鐨?header files 鍜?libraries銆傚鏋滀綘榪橀渶瑕佺敤鍒?ATL錛屽氨寰楀湪 INCLUDE 鐜鍙樻暟涓啀鍔犱笂 C:\MSDEV\VC98\ATL\INCLUDE銆?br>鈼忎互 Borland C++Builder 涓轟緥
浠?Borland C++Builder 涓轟緥錛屽鏋滃畨瑁呭緦鐨勬。妗堝竷灞濡備笅錛?br>C:\BORLAND\CBuilder3\BIN : 榪欓噷鏀炬湁緙栬瘧鍣?BCC32.EXE
C:\BORLAND\CBuilder3\INCLUDE : 榪欓噷鏀炬湁 C/C++ header files
C:\BORLAND\CBuilder3\LIB : 榪欓噷鏀炬湁 C/C++ standard libraries
閭i航浣犲彲浠ュ啓涓涓壒嬈℃。濡備笅錛?br>set PATH=C:\BORLAND\CBuilder3\BIN
set INCLUDE=C:\BORLAND\CBuilder3\INCLUDE
set LIB=C:\BORLAND\CBuilder3\LIB
鈼忓浣曞湪 console 涓紪璇?C/C++ 紼嬪紡
棣栧厛錛屽紑鍚竴涓?DOS Box錛圖OS Prompt, DOS VM錛夛紝鐒跺緦鍦ㄨ DOS box 涓墽琛屼笂榪板啓濂界殑鎵規妗o紝瀹屾垚鐜鍙樻暟鐨勮瀹氥備綘鍙互鍐嶅湪 DOS 鎻愮ず鍙蜂笅閿叆 set 鍛戒護錛岀湅鐪嬬幆澧冨彉鏁扮殑璁懼畾鍐呭姝g‘涓庡惁銆?br>鐒跺緦灝卞彲浠ョ洿鎺ュ湪 DOS 鎻愮ず鍙蜂笅閿叆緙栬瘧鍣ㄥ悕縐幫紝寮濮嬬紪璇戜簡銆傚鏋滀綘浣跨敤 Visual C++錛屽氨榪欓航鍋氾細
C:\> CL test.cpp
濡傛灉浣犱嬌鐢?C++Builder錛屽氨榪欓航鍋氾細
C:\> BCC32 test.cpp
鑷蟲柤鐗規畩鎯呭喌涓嬮渶瑕佷粈楹界壒孌婄殑 options錛屽氨蹇呴』鑷繁鏌ヤ竴涓嬪暒銆傚彧瑕佹墽琛?CL /? 鎴?BCC32錛堝叾寰屼笉鍔犱換浣曞紩鏁幫級錛屼究鍙湅鍒版墍鏈夌殑 compile options銆?br>鈼忕紪璇戝櫒涓庤仈緇撳櫒鐨勫叧緋?br>鏃╂湡鐨勭紪璇戣繃紼嬩笌鑱旂粨榪囩▼鏄垎寮鐨勩傛崲鍙ヨ瘽璇存垜浠繀欏誨仛涓や釜鍔ㄤ綔錛?br>C:\> Cl test.cpp
C:\> LINK test.obj xxx 錛坸xx 浠h〃鍚勪釜蹇呰鐨?libraries錛?/small>
鎴栨槸錛?br>C:\> BCC32 test.cpp
C:\> TLINK32 test.obj xxx 錛坸xx 浠h〃鍚勪釜蹇呰鐨?libraries錛?br>
濡備粖鐨勭紪璇戣繃紼嬩笌鑱旂粨榪囩▼褰撶劧榪樻槸鍒嗗紑鐨勶紝浣嗘槸鎴戜滑鐨勫姩浣滃彧闇涓涓細
C:\> CL test.cpp
鎴栨槸錛?br>C:\> BCC32 test.cpp
榪欐槸鍥犱負緙栬瘧鍣ㄥ彉鑱槑浜嗭紝闄ら潪浣犳寚瀹?/c option錛堣〃紺哄彧緙栬瘧涓嶈仈緇擄級錛屽惁鍒欏畠渚胯嚜鍔ㄤ負浣犲懠鍙仈緇撳櫒榪涜鑱旂粨鍔ㄤ綔銆傝繃鍘諱互鏉ラ浠?programmer鐑︽伡鐨勩岃浣跨敤鍝簺 libraries銆嶇殑闂錛岀紪璇戝櫒涔熸湁浜嗚仾鏄庣殑瑙e喅鏂規錛氬畠灝嗙▼寮忎腑鐢ㄥ埌鐨?library functions 璁板綍璧鋒潵錛屽悓鏃朵篃褰曚笅瀹冧滑鎵灞炵殑library 鍚嶇О錛屾柤鏄仈緇撳櫒灝卞彲浠ヤ粠榪欎釜琛ㄦ牸涓煡閬撹鑱旂粨鍝簺 libraries 浜嗐?br>鈼忕幆澧冨彉鏁頒笌 DOS VM錛圴irtual Machine錛夌殑鍏崇郴
浣犲彲浠ュ悓鏃跺紑璧峰涓?DOS Box錛屼絾鏄綘涓嶈兘澶熷湪鏌愪釜 DOS Box 涓墽琛屼笂榪版壒嬈℃。鑰屽湪鍙︿竴涓?DOS VM 涓韓鍙楀叾鐜璁懼畾銆?br>榪欐槸鍥犱負姣忎釜 DOS Box 閮芥槸涓涓?Virtual Machine錛屽郊姝よ皝涔熺湅涓嶅埌璋侊紝浜掍笉鐩稿共銆?br>闄ら潪浣犲湪 autoexec.bat 涓氨璁懼畾濂戒笂榪伴偅浜涚幆澧冨彉鏁般傝繖楹戒竴鏉ワ紝浠諱綍涓涓柊寮鍚殑 DOS VM 渚夸細鍥犱負緇ф壙鏈鍘熷鐨?DOS VM 鐜錛岃岀戶鎵夸簡閭d簺鍙樻暟璁懼畾銆?br>鈼忕幆澧冪┖闂達紙environment space錛変笉瓚?br>鏈鏄撻犳垚澶у鍥版壈鐨勶紝灝辨槸鐜絀洪棿錛坋nvironment space錛変笉瓚崇殑闂銆?br>褰撲綘瀹夎濂?Visual C++錛屼細鍦ㄥ叾 BIN 瀛愮洰褰曚腑鍙戠幇涓涓悕涓?VCVARS32.BAT 鐨勬。妗堛傝繖涓。妗堝叾瀹炲氨鏄仛涓婅堪鐨勭幆澧冨彉鏁拌瀹氬姩浣滐紙榪欏湪 Visual C++ 瀹夎榪囩▼鐨勬渶寰屼竴涓楠ゆ湁璇存槑銆傚搸錛屾湁澶氬皯浜哄畨瑁呰蔣浣撲笉鐪嬭鏄庯紒錛夈傛墍浠ワ紝浣犲彲浠ュ湪浠諱綍 DOS Box 涓墽琛屾妗o紝鍙栦唬鍓嶈堪鎴戜滑鑷繁鐨勬壒嬈℃。銆?br>浣嗘槸閫氬父澶у閮芥湁澶辮觸鐨勭粡楠岋紝寰楀埌 "Out of environment space" 鐨勯敊璇鎭傝繖鏄洜涓?VCVARS32.BAT 浣跨敤浠ヤ笅鍙ユ硶錛?br>set INCLUDE=%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%INCLUDE%
set LIB=%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB%
鎰忔濇槸鎶?INCLUDE 鐨勫師濮嬭瀹氾紙%INCLUDE%錛夊啀闄勫姞鍏朵粬璁懼畾錛屽茍鎶奓IB 鐨勫師濮嬭瀹氾紙%LIB%錛夊啀闄勫姞鍏朵粬璁懼畾銆傚鏋滃師濮嬭瀹氬凡緇忓緢闀匡紝澶氭潵榪欓航鍑犳錛屼究 "Out of environment space" 鍟︼紒
鍋氭硶涔嬩竴鏄皟楂樼幆澧冪┖闂寸殑澶у皬銆傝鍦?c:\config.sys 妗d腑鍔犱笂榪欒錛?br>shell=C:\COMMAND.COM C:\ /E:1024 /P
鍏朵腑 /E:1024 渚挎槸琛ㄧず灝嗙幆澧冪┖闂磋皟涓?1024 bytes銆傦紙涓嶅錛熷啀璋冿級
鍋氭硶涔嬩簩鏄笉瑕佷嬌鐢?VCVARS32.BAT 鐨勯偅縐嶃岄檮鍔犮嶅彞鍨嬶紝鏀圭敤鍓嶈堪鎴戜滑鑷繁鐨勬壒嬈℃。銆傝鐭ラ亾錛屾垜浠彲鑳芥湁濂藉嚑涓紪璇戝櫒鐜錛圴C銆丅CB銆丟++ 鈹咃級錛岄渶瑕佽疆鐣祴璇曟垜浠殑紼嬪紡錛涘鏋滀嬌鐢ㄣ岄檮鍔犮嶅彞鍨嬶紝澶氭潵鍑犳錛屽啀澶х殑鐜絀洪棿涔熶細娑堢(孌嗗敖銆?br>鏂規硶涓鍜屾柟娉曚簩瑕佸弻綆¢綈涓嬪敺銆?br>鈼忔湁浠諱綍瑙勬ā涓婄殑闄愬埗鍚楋紵
浣跨敤 console 妯″紡錛堟垨縐?command line 妯″紡錛夋潵緙栬瘧鑱旂粨紼嬪紡錛岀▼寮忕殑澶у皬鍙惁鏈変換浣曡妯′笂鐨勯檺鍒訛紵絳旀鏄病鏈夛紒
瀹冪殑緙虹偣鏄病鏈夊伐鍏峰府浣犵鐞嗘。妗堛佹病鏈夐璁懼艱浣犲皯鎵撳嚑涓瓧銆佹病鏈夊垎鏋愬伐鍏峰府浣犳暣鐞?objects錛岃浣犳祻瑙?objects銆乻ymbols鈹呫傛墍浠ヤ竴鏃︿綘鍩烘湰鍔熷浼氫簡錛岃寮濮嬩腑澶у瀷紼嬪紡鐨勮璁★紝褰撶劧浠ユ暣鍚堢幆澧冿紙IDE錛変負浣熾?br>鈼忎笉瑕佽浼?br>鎴戣繖涓嶆槸寮鍊掕濺錛岃澶у鍥炲埌鑼規瘺楗鐨勬椂浠o紝閮藉洖澶村幓鍋氬北欏舵礊浜恒傝屾槸鎴戣寰楋紝瀵規柤涓浣?C/C++ 鍒濆鑰咃紝鏁村悎鐜錛圛DE錛夌殑榪愮敤鎭愭曞甫鏉ヤ竴澶撮浘姘達紝涓嶅鍏堝湪 console mode 涓嬩綔涓氥備竴鏂歸潰澶氳璇嗕竴浜涚幆澧冭瀹氭柟闈㈢殑甯歌瘑錛屾弧濂界殑錛屼竴鏂歸潰姣旇緝鏂逛究濂界敤錛屼篃涓嶅繀鍐欎釜 1000 琛岀殑灝忓皬緇冧範榪樺緱鍚姩 浜斾簲鍔犲啘鐐紝涓鏂歸潰姹傜煡鐨勫姏閲忓彲浠ュ叏閮ㄦ斁鍦ㄨ璦鐨勭粌涔犱笂澶淬?br>絳夋湁浜嗕竴瀹氱殑紼嬪害錛屽啀浣跨敤鏁村悎鐜錛屽氨涓嶄細濡傚潬浜旈噷闆句簡銆?/p>
]]>
POSIX鏄疨ortable Operating System Interface of Unix鐨勭緝鍐欍傜敱IEEE錛圛nstitute of Electrical and Electronic Engineering錛夊紑鍙戯紝鐢盇NSI鍜孖SO鏍囧噯鍖栥?br> POSIX鐨勮癁鐢熷拰Unix鐨勫彂灞曟槸瀵嗕笉鍙垎鐨勶紝Unix浜?0騫翠唬璇炵敓浜嶣ell lab錛屽茍浜?0騫翠唬鍚戠編鍚勫ぇ楂樻牎鍒嗗彂V7鐗堢殑婧愮爜浠ュ仛鐮旂┒銆俇C Berkeley鍦╒7鐨勫熀紜涓婂紑鍙戜簡BSD Unix銆傚悗鏉ュ緢澶氬晢涓氬巶瀹舵剰璇嗗埌Unix鐨勪環鍊間篃綰風悍浠ell Lab鐨凷ystem V鎴朆SD涓哄熀紜鏉ュ紑鍙戣嚜宸辯殑Unix錛岃緝钁楀悕鐨勬湁Sun OS錛孉IX錛孷MS銆傜敱浜庡悇鍘傚瀵筓nix鐨勫紑鍙戝悇鑷負鏀匡紝閫犳垚浜哢nix鐨勭増鏈浉褰撴販涔憋紝緇欒蔣浠剁殑鍙Щ妞嶆у甫鏉ュ緢澶у洶闅撅紝瀵筓nix鐨勫彂灞曟瀬涓轟笉鍒┿備負緇撴潫榪欑灞闈紝IEEE寮鍙戜簡POSIX錛孭OSIX鍦ㄦ簮浠g爜綰у埆涓婂畾涔変簡涓緇勬渶灝忕殑Unix(綾籙nix)鎿嶄綔緋葷粺鎺ュ彛銆?br> POSIX 琛ㄧず鍙Щ妞嶆搷浣滅郴緇熸帴鍙o紙Portable Operating System Interface 錛岀緝鍐欎負 POSIX 鏄負浜嗚闊蟲洿鍍?UNIX錛夈傜數姘斿拰鐢靛瓙宸ョ▼甯堝崗浼氾紙Institute of Electrical and Electronics Engineers錛孖EEE錛夋渶鍒濆紑鍙?POSIX 鏍囧噯錛屾槸涓轟簡鎻愰珮 UNIX 鐜涓嬪簲鐢ㄧ▼搴忕殑鍙Щ妞嶆с傜劧鑰岋紝POSIX 騫朵笉灞闄愪簬 UNIX銆傝澶氬叾瀹冪殑鎿嶄綔緋葷粺錛屼緥濡?DEC OpenVMS 鍜?Microsoft Windows NT錛岄兘鏀寔 POSIX 鏍囧噯錛屽挨鍏舵槸 IEEE Std. 1003.1-1990錛?995 騫翠慨璁級鎴?POSIX.1錛孭OSIX.1 鎻愪緵浜嗘簮浠g爜綰у埆鐨?C 璇█搴旂敤緙栫▼鎺ュ彛錛圓PI錛夌粰鎿嶄綔緋葷粺鐨勬湇鍔$▼搴忥紝渚嬪璇誨啓鏂囦歡銆侾OSIX.1 宸茬粡琚浗闄呮爣鍑嗗寲緇勭粐錛圛nternational Standards Organization錛孖SO錛夋墍鎺ュ彈錛岃鍛藉悕涓?ISO/IEC 9945-1:1990 鏍囧噯銆?
POSIX 鐜板湪宸茬粡鍙戝睍鎴愪負涓涓潪甯稿簽澶х殑鏍囧噯鏃忥紝鏌愪簺閮ㄥ垎姝e鍦ㄥ紑鍙戣繃紼嬩腑銆傝〃 1-1 緇欏嚭浜?POSIX 鏍囧噯鐨勫嚑涓噸瑕佺粍鎴愰儴鍒嗐侾OSIX 涓?IEEE 1003 鍜?2003 瀹舵棌鐨勬爣鍑嗘槸鍙簰鎹㈢殑銆傞櫎 1003.1 涔嬪錛?003 鍜?2003 瀹舵棌涔熷寘鎷湪琛ㄤ腑銆?
琛?錛氭爣鍑嗙殑閲嶈緇勬垚閮ㄥ垎
1003.0
綆$悊 POSIX 寮鏀懼紡緋葷粺鐜錛圤SE錛夈侷EEE 鍦?1995 騫撮氳繃浜嗚繖欏規爣鍑嗐?ISO 鐨勭増鏈槸 ISO/IEC 14252:1996銆?
1003.1
琚箍娉涙帴鍙椼佺敤浜庢簮浠g爜綰у埆鐨勫彲縐繪鎬ф爣鍑嗐?003.1 鎻愪緵涓涓搷浣滅郴緇熺殑 C 璇█搴旂敤緙栫▼鎺ュ彛錛圓PI錛夈侷EEE 鍜?ISO 宸茬粡鍦?1990 騫撮氳繃浜嗚繖涓爣鍑嗭紝IEEE 鍦?1995 騫撮噸鏂頒慨璁簡璇ユ爣鍑嗐?
1003.1b
涓涓敤浜庡疄鏃剁紪紼嬬殑鏍囧噯錛堜互鍓嶇殑 P1003.4 鎴?POSIX.4錛夈傝繖涓爣鍑嗗湪 1993 騫磋 IEEE 閫氳繃錛岃鍚堝茍榪?ISO/IEC 9945-1銆?
1003.1c
涓涓敤浜庣嚎紼嬶紙鍦ㄤ竴涓▼搴忎腑褰撳墠琚墽琛岀殑浠g爜孌碉級鐨勬爣鍑嗐備互鍓嶆槸 P1993.4 鎴?POSIX.4 鐨勪竴閮ㄥ垎錛岃繖涓爣鍑嗗凡緇忓湪 1995 騫磋 IEEE 閫氳繃錛屽綊鍏?ISO/IEC 9945-1:1996銆?
1003.1g
涓涓叧浜庡崗璁嫭绔嬫帴鍙g殑鏍囧噯錛岃鎺ュ彛鍙互浣夸竴涓簲鐢ㄧ▼搴忛氳繃緗戠粶涓庡彟涓涓簲鐢ㄧ▼搴忛氳銆?1996 騫達紝IEEE 閫氳繃浜嗚繖涓爣鍑嗐?
1003.2
涓涓簲鐢ㄤ簬 shell 鍜?宸ュ叿杞歡鐨勬爣鍑嗭紝瀹冧滑鍒嗗埆鏄搷浣滅郴緇熸墍蹇呴』鎻愪緵鐨勫懡浠ゅ鐞嗗櫒鍜屽伐鍏風▼搴忋?1992 騫?IEEE 閫氳繃浜嗚繖涓爣鍑嗐侷SO 涔熷凡緇忛氳繃浜嗚繖涓爣鍑嗭紙ISO/IEC 9945-2:1993錛夈?
1003.2d
鏀硅繘鐨?1003.2 鏍囧噯銆?
1003.5
涓涓浉褰撲簬 1003.1 鐨?Ada 璇█鐨?API銆傚湪 1992 騫達紝IEEE 閫氳繃浜嗚繖涓爣鍑嗐傚茍鍦?1997 騫村鍏惰繘琛屼簡淇銆侷SO 涔熼氳繃浜嗚鏍囧噯銆?
1003.5b
涓涓浉褰撲簬 1003.1b錛堝疄鏃舵墿灞曪級鐨?Ada 璇█鐨?API銆侷EEE 鍜?ISO 閮藉凡緇忛氳繃浜嗚繖涓爣鍑嗐侷SO 鐨勬爣鍑嗘槸 ISO/IEC 14519:1999銆?
1003.5c
涓涓浉褰撲簬 1003.1q錛堝崗璁嫭绔嬫帴鍙o級鐨?Ada 璇█鐨?API銆傚湪 1998 騫達紝 IEEE 閫氳繃浜嗚繖涓爣鍑嗐侷SO 涔熼氳繃浜嗚繖涓爣鍑嗐?
1003.9
涓涓浉褰撲簬 1003.1 鐨?FORTRAN 璇█鐨?API銆傚湪 1992 騫達紝IEEE 閫氳繃浜嗚繖涓爣鍑嗭紝騫朵簬 1997 騫村鍏跺啀嬈$‘璁ゃ侷SO 涔熷凡緇忛氳繃浜嗚繖涓爣鍑嗐?
1003.10
涓涓簲鐢ㄤ簬瓚呯駭璁$畻搴旂敤鐜妗嗘灦錛圓pplication Environment Profile錛孉EP錛夌殑鏍囧噯銆傚湪 1995 騫達紝IEEE 閫氳繃浜嗚繖涓爣鍑嗐?
1003.13
涓涓叧浜庡簲鐢ㄧ幆澧冩鏋剁殑鏍囧噯錛屼富瑕侀拡瀵逛嬌鐢?POSIX 鎺ュ彛鐨勫疄鏃跺簲鐢ㄧ▼搴忋傚湪 1998 騫達紝IEEE 閫氳繃浜嗚繖涓爣鍑嗐?
1003.22
涓涓拡瀵?POSIX 鐨勫叧浜庡畨鍏ㄦф鏋剁殑鎸囧崡銆?
1003.23
涓涓拡瀵圭敤鎴風粍緇囩殑鎸囧崡錛屼富瑕佹槸涓轟簡鎸囧鐢ㄦ埛寮鍙戝拰浣跨敤鏀寔鎿嶄綔闇姹傜殑寮鏀懼紡緋葷粺鐜錛圤SE錛夋鏋?
2003
閽堝鎸囧畾鍜屼嬌鐢ㄦ槸鍚︾鍚?POSIX 鏍囧噯鐨勬祴璇曟柟娉曪紝鏈夊叧鍏跺畾涔夈佷竴鑸渶姹傚拰鎸囧鏂歸拡鐨勪竴涓爣鍑嗐傚湪 1997 騫達紝IEEE 閫氳繃浜嗚繖涓爣鍑嗐?
2003.1
榪欎釜鏍囧噯瑙勫畾浜嗛拡瀵?1003.1 鐨?POSIX 嫻嬭瘯鏂規硶鐨勬彁渚涘晢瑕佹彁渚涚殑涓浜涙潯浠躲傚湪 1992 騫達紝IEEE 閫氳繃浜嗚繖涓爣鍑嗐?
2003.2
涓涓畾涔変簡琚敤鏉ユ鏌ヤ笌 IEEE 1003.2錛坰hell 鍜?宸ュ叿 API錛夋槸鍚︾鍚堢殑嫻嬭瘯鏂規硶鐨勬爣鍑嗐傚湪 1996 騫達紝IEEE 閫氳繃浜嗚繖涓爣鍑嗐?
闄や簡 1003 鍜?2003 瀹舵棌浠ュ錛岃繕鏈夊嚑涓叾瀹冪殑 IEEE 鏍囧噯錛屼緥濡?1224 鍜?1228錛屽畠浠篃鎻愪緵寮鍙戝彲縐繪搴旂敤紼嬪簭鐨?API銆傝鎯沖緱鍒板叧浜?IEEE 鏍囧噯鐨勬渶鏂頒俊鎭紝鍙互璁塊棶 IEEE 鏍囧噯鐨勪富欏碉紝緗戝潃鏄?http://standards.ieee.org/銆傛湁鍏?POSIX 鏍囧噯鐨勬榪頒俊鎭紝璇瘋闂?Web 绔欑偣 http://standards.ieee.org/reading/ieee/stad_public/description/posix/銆?/p>
Linux緋葷粺涓嬬殑澶氱嚎紼嬮伒寰狿OSIX綰跨▼鎺ュ彛錛岀О涓簆thread銆備粠涓婇潰鐨勬弿榪頒笉闅劇煡閬擄紝POSIX綰跨▼鎺ュ彛鏄疨OSIX浼楀鏍囧噯涓殑涓涓紙POSIX 1003.1-2001錛?/strong>銆?/p>
緙栧啓Linux涓嬬殑澶氱嚎紼嬬▼搴忥紝闇瑕佷嬌鐢ㄥご鏂囦歡pthread.h錛岃繛鎺ユ椂闇瑕佷嬌鐢ㄥ簱libpthread.a銆傞『渚胯涓涓嬶紝Linux涓媝thread鐨勫疄鐜版槸閫氳繃緋葷粺璋冪敤 clone() 鏉ュ疄鐜扮殑銆俢lone() 鏄疞inux鎵鐗規湁鐨勭郴緇熻皟鐢紝瀹冪殑浣跨敤鏂瑰紡綾諱技fork錛屽叧浜?clone() 鐨勮緇嗘儏鍐碉紝鏈夊叴瓚g殑璇昏呭彲浠ュ幓鏌ョ湅鏈夊叧鏂囨。璇存槑銆?/p>
涓嬮潰鏄竴涓?POSIX 綰跨▼鐨勭畝鍗曠ず渚嬬▼搴?thread1.c)錛? 瑕佺紪璇戣繖涓▼搴忥紝鍙渶鍏堝皢紼嬪簭瀛樹負 thread1.c錛岀劧鍚庤緭鍏ワ細 榪愯鍒欒緭鍏ワ細 Windows鏈韓娌℃湁鎻愪緵瀵筆OSIX鐨勬敮鎸併備絾鏈変竴涓彨 POSIX Threads for Win32 鐨勫紑婧愰」鐩粰鍑轟簡涓涓姛鑳芥瘮杈冨畬鍠勭殑Windows涓媝threads API鐨勫疄鐜般傜洰鍓嶇殑鏈鏂扮増鏈槸Pthreads-w32 release 2.8.0 (2006-12-22)銆?/p>
鎴戞病鏈夋祴璇曡繃榪欎釜鏈鏂扮増鏈紝榪欓噷鍙粰鍑?.7.0鐗堢殑閾炬帴錛?a title=ftp://sources.redhat.com/pub/pthreads-win32/pthreads-w32-2-7-0-release.exe href="ftp://sources.redhat.com/pub/pthreads-win32/pthreads-w32-2-7-0-release.exe">ftp://sources.redhat.com/pub/pthreads-win32/pthreads-w32-2-7-0-release.exe銆?/p>
鍏充簬璇ュ紑婧愰」鐩殑璇︾粏浠嬬粛瑙侊細http://sources.redhat.com/pthreads-win32/銆?/p>
涓婇潰鐨別xe鏂囦歡鏄竴涓嚜瑙e帇鏂囦歡錛岃В鍘嬪悗錛孭re-built.2鐩綍涓湁緙栬瘧鎵闇瑕佺殑澶存枃浠訛紙include瀛愮洰褰曪級鍜屽簱鏂囦歡錛坙ib瀛愮洰褰曪級銆?/p>
涓涓畝鍗曠殑嫻嬭瘯紼嬪簭(main.cpp)錛?/p>
浣跨敤 cl.exe 緙栬瘧錛堜笉鐔熸倝 cl.exe 鐨勮鍙傝冿細http://blog.csdn.net/liuyongjin1984/archive/2008/01/07/2029405.aspx 鎴栬呭弬瑙佷笅闈?.2閮ㄥ垎錛夛細 3.2 浣跨敤VC++ 6.0鎴朧isual Studio 2005鏉ヨ繍琛屼笂闈㈢殑紼嬪簭 鍏抽敭鏈変袱鐐癸細 1. 鏄皢澶存枃浠訛紙include瀛愮洰褰曪級鍜屽簱鏂囦歡錛坙ib瀛愮洰褰曪級涓殑鍐呭娣誨姞鍒癡C++ 6.0鎴朧isual Studio 2005寮鍙戠幆澧冨搴旂殑include鍜宭ib鐩綍涓嬨?/p>
鍏蜂綋鏉ヨ錛?strong>浠ユ坊鍔爄nclude鐩綍涓轟緥錛屾坊鍔爈ib鐩綍綾諱技#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
void *thread_function(void *arg) ...{
int i;
for ( i=0; i<20; i++) ...{
printf("Thread says hi! ");
sleep(1);
}
return NULL;
}
int main(void) ...{
pthread_t mythread;
if ( pthread_create( &mythread, NULL, thread_function, NULL) ) ...{
printf("error creating thread.");
abort();
}
if ( pthread_join ( mythread, NULL ) ) ...{
printf("error joining thread.");
abort();
}
exit(0);
}
3. Windows涓婸OSIX綰跨▼緙栫▼
3.1 綆鍗曚嬌鐢?/strong>
#include <stdio.h>
#include <pthread.h>
#include <assert.h>
void* Function_t(void* Param)
...{
printf("I am a thread! ");
pthread_t myid = pthread_self();
printf("thread ID=%d ", myid);
return NULL;
}
int main()
...{
pthread_t pid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&pid, &attr, Function_t, NULL);
printf("======================================== ");
getchar();
pthread_attr_destroy(&attr);
return 1;
}
銆?span style="COLOR: #000000">rem cl.bat
銆媍l.exe main.cpp /c /I"c:pthreads-w32-2-7-0-releasePre-built.2include"
銆媗ink.exe /out:main_cl.exe main.obj /LIBPATH:"c:pthreads-w32-2-7-0-releasePre-built.2lib" pthreadVC2.lib
鍥?錛歏C++ 6.0錛堟坊鍔爄nclude鐩綍錛氬伐鍏?-銆嬮夐」--銆嬬洰褰曪級
鍥?錛歏isual Studio 2005(娣誨姞include鐩綍錛歵ools--銆媜ptions)
2. 鎸囧畾link鏃惰榪炴帴鐨勫簱鐨勫悕縐幫紙pthreadVC2.lib錛?/strong>
鍥?錛歏C++ 6.0錛堝伐紼?-銆嬭緗?-銆嬭繛鎺ワ級
鍥?錛歏isual Studio 2005(project-->* property pages)
瀵硅薄姹犵殑鐢ㄩ斿湪榪欓噷灝變笉浠嬬粛浜嗭紝鏈緥涓彧鏄叾涓涓畝鍗曠殑瀹炵幇銆?
#include <list>
#include <iostream>
using namespace std;
template<class T>
class object_pool
{
list<void *> data_list;
public:
void* malloc_data()
{
if(!data_list.empty())
{
list<void *>::iterator it = data_list.begin();
void *p = *it;
data_list.pop_front();
return p;
}
else
{
void* p = malloc(sizeof(T));
return p;
}
}
void free_data(void* p)
{
data_list.push_back(p);
}
};
class A
{
public:
int value;
A(int a):value(a){cout<<"A("<<a<<") called"<<endl;}
~A() {cout<<"~A("<<value<<") called"<<endl;}
static object_pool<A> pool_;
void* operator new (size_t size)
{
return pool_.malloc_data();
}
void operator delete(void* p)
{
pool_.free_data(p);
}
};
object_pool<A> A::pool_;
void main()
{
A* a1=new A(1);
delete a1;
A* a2=new A(2);
delete a2;
}
鐢變簬縐嶇鍘熷洜錛屾垜浠棤娉曚繚璇佹墍鏈夐氳繃new鍦╤eap涓敵璇風殑鍐呭瓨璧勬簮閮藉畨鍏ㄥ湴寰楀埌閲婃斁錛屼緥濡傦細
class base{...};
void f()
{
base* ptr = new base;
...
delete ptr;
}
榪欐牱涓緋誨垪鎿嶄綔涓紝鍦?..."涓彲鑳戒細鎶涘嚭寮傚父錛屾渶緇堝鑷磀elete鏃犳硶寰楀埌鎵ц錛屼簬鏄氨閫犳垚浜嗗唴瀛樻硠闇層傚敖綆℃垜浠彲浠ヨ娉曢伩鍏嶅湪"..."涓姏鍑哄紓甯革紝浣嗘槸錛屽浜庡悗鏉ョ淮鎶ゅ拰淇敼榪欐浠g爜浜嗕漢鍛樻潵璇達紝寰堝彲鑳藉姞鍏ヤ竴浜涙帶鍒舵祦錛屼粠鑰岃繃鏃╁湴浠庡嚱鏁頒粠涓繑鍥烇紝鍐呭瓨娉勯湶鍐嶆鍙戠敓銆?/p>
涓縐嶈В鍐充箣閬撳氨鏄紝灝嗚祫婧愬皝瑁呭湪涓涓被涓紝鍒╃敤綾葷殑鏋愭瀯鍑芥暟鏉ラ噴鏀捐璧勬簮錛岃繖鏍蜂竴鏉ワ紝鏃犺鏄綍縐嶆柟寮忛鍑篺()鍑芥暟鐨勪綔鐢ㄥ煙錛岀被鐨勬瀽鏋勫嚱鏁版繪槸浼氳璋冪敤錛屼粠鑰屾湁鏁堝湴閬垮厤浜嗚祫婧愭硠闇層?/p>
auto_ptr灝辨槸榪欑鏂規硶鐨勪竴縐嶅吀鍨嬪簲鐢ㄣ傚畠琚О涓烘櫤鑳芥寚閽堬紝鏄竴涓ā鏉跨被銆傚0鏄庝竴涓彧鑳芥寚閽堢殑鏂規硶鏄細auto_ptr linux涓嬶紝g++緙栬瘧鍣ㄧ殑杈撳嚭緇撴灉濡備笅錛?br>~$ g++ test.cpp -o test#include <iostream>
#include <memory> //涓轟簡浣跨敤auto_ptr浣犲繀欏誨寘鍚ご鏂囦歡:#include <memory>
using namespace std;
class demo
{
public:
demo ()
{
cout << "demo()" << endl;
}
~demo ()
{
cout << "~demo()" << endl;
}
};
void
test_org ()
{
cout << "test_org():" << endl;
demo *ptr = new demo;
return;
}
void
test_auto ()
{
cout << "test_auto():" << endl;
auto_ptr < demo > ptr (new demo);
return;
}
int
main (int narg, char **arg)
{
test_org ();
test_auto ();
return 0;
}
~$ ./test
test_org():
demo()
test_auto():
demo()
~demo()
]]>
浣跨敤鏍囧噯C++鐨勭被鍨嬭漿鎹㈢錛歴tatic_cast銆乨ynamic_cast銆乺einterpret_cast銆佸拰const_cast銆?/font>
3.1 static_cast
鐢ㄦ硶錛歴tatic_cast < type-id > ( expression )
璇ヨ繍綆楃鎶奺xpression杞崲涓簍ype-id綾誨瀷錛屼絾娌℃湁榪愯鏃剁被鍨嬫鏌ユ潵淇濊瘉杞崲鐨勫畨鍏ㄦс傚畠涓昏鏈夊涓嬪嚑縐嶇敤娉曪細
鈶犵敤浜庣被灞傛緇撴瀯涓熀綾誨拰瀛愮被涔嬮棿鎸囬拡鎴栧紩鐢ㄧ殑杞崲銆?br>銆銆榪涜涓婅杞崲錛堟妸瀛愮被鐨勬寚閽堟垨寮曠敤杞崲鎴愬熀綾昏〃紺猴級鏄畨鍏ㄧ殑錛?br>銆銆榪涜涓嬭杞崲錛堟妸鍩虹被鎸囬拡鎴栧紩鐢ㄨ漿鎹㈡垚瀛愮被琛ㄧず錛夋椂錛岀敱浜庢病鏈夊姩鎬佺被鍨嬫鏌ワ紝鎵浠ユ槸涓嶅畨鍏ㄧ殑銆?br>鈶$敤浜庡熀鏈暟鎹被鍨嬩箣闂寸殑杞崲錛屽鎶奿nt杞崲鎴恈har錛屾妸int杞崲鎴恊num銆傝繖縐嶈漿鎹㈢殑瀹夊叏鎬т篃瑕佸紑鍙戜漢鍛樻潵淇濊瘉銆?br>鈶㈡妸絀烘寚閽堣漿鎹㈡垚鐩爣綾誨瀷鐨勭┖鎸囬拡銆?br>鈶f妸浠諱綍綾誨瀷鐨勮〃杈懼紡杞崲鎴恦oid綾誨瀷銆?/font>
娉ㄦ剰錛歴tatic_cast涓嶈兘杞崲鎺塭xpression鐨刢onst銆乿olitale銆佹垨鑰卂_unaligned灞炴с?/font>
3.2 dynamic_cast
鐢ㄦ硶錛歞ynamic_cast < type-id > ( expression )
璇ヨ繍綆楃鎶奺xpression杞崲鎴恡ype-id綾誨瀷鐨勫璞°俆ype-id蹇呴』鏄被鐨勬寚閽堛佺被鐨勫紩鐢ㄦ垨鑰卾oid *錛?br>濡傛灉type-id鏄被鎸囬拡綾誨瀷錛岄偅涔坋xpression涔熷繀欏繪槸涓涓寚閽堬紝濡傛灉type-id鏄竴涓紩鐢紝閭d箞expression涔熷繀欏繪槸涓涓紩鐢ㄣ?/font>
dynamic_cast涓昏鐢ㄤ簬綾誨眰嬈¢棿鐨勪笂琛岃漿鎹㈠拰涓嬭杞崲錛岃繕鍙互鐢ㄤ簬綾諱箣闂寸殑浜ゅ弶杞崲銆?br>鍦ㄧ被灞傛闂磋繘琛屼笂琛岃漿鎹㈡椂錛宒ynamic_cast鍜宻tatic_cast鐨勬晥鏋滄槸涓鏍風殑錛?br>鍦ㄨ繘琛屼笅琛岃漿鎹㈡椂錛宒ynamic_cast鍏鋒湁綾誨瀷媯鏌ョ殑鍔熻兘錛屾瘮static_cast鏇村畨鍏ㄣ?br>class B{
public:
int m_iNum;
virtual void foo();
};
class D:public B{
public:
char *m_szName[100];
};
void func(B *pb){
D *pd1 = static_cast<D *>(pb);
D *pd2 = dynamic_cast<D *>(pb);
}
鍦ㄤ笂闈㈢殑浠g爜孌典腑錛屽鏋減b鎸囧悜涓涓狣綾誨瀷鐨勫璞★紝pd1鍜宲d2鏄竴鏍風殑錛屽茍涓斿榪欎袱涓寚閽堟墽琛孌綾誨瀷鐨勪換浣曟搷浣滈兘鏄畨鍏ㄧ殑錛?br>浣嗘槸錛屽鏋減b鎸囧悜鐨勬槸涓涓狟綾誨瀷鐨勫璞★紝閭d箞pd1灝嗘槸涓涓寚鍚戣瀵硅薄鐨勬寚閽堬紝瀵瑰畠榪涜D綾誨瀷鐨勬搷浣滃皢鏄笉瀹夊叏鐨勶紙濡傝闂甿_szName錛夛紝
鑰宲d2灝嗘槸涓涓┖鎸囬拡銆?/font>
鍙﹀瑕佹敞鎰忥細B瑕佹湁铏氬嚱鏁幫紝鍚﹀垯浼氱紪璇戝嚭閿欙紱static_cast鍒欐病鏈夎繖涓檺鍒躲?br>榪欐槸鐢變簬榪愯鏃剁被鍨嬫鏌ラ渶瑕佽繍琛屾椂綾誨瀷淇℃伅錛岃岃繖涓俊鎭瓨鍌ㄥ湪綾葷殑铏氬嚱鏁拌〃錛?br>鍏充簬铏氬嚱鏁拌〃鐨勬蹇碉紝璇︾粏鍙<Inside c++ object model>錛変腑錛屽彧鏈夊畾涔変簡铏氬嚱鏁扮殑綾繪墠鏈夎櫄鍑芥暟琛紝
娌℃湁瀹氫箟铏氬嚱鏁扮殑綾繪槸娌℃湁铏氬嚱鏁拌〃鐨勩?/font>
鍙﹀錛宒ynamic_cast榪樻敮鎸佷氦鍙夎漿鎹紙cross cast錛夈傚涓嬩唬鐮佹墍紺恒?br>class A{
public:
int m_iNum;
virtual void f(){}
};
class B:public A{
};
class D:public A{
};
void foo(){
B *pb = new B;
pb->m_iNum = 100;
D *pd1 = static_cast<D *>(pb); //compile error
D *pd2 = dynamic_cast<D *>(pb); //pd2 is NULL
delete pb;
}
鍦ㄥ嚱鏁癴oo涓紝浣跨敤static_cast榪涜杞崲鏄笉琚厑璁哥殑錛屽皢鍦ㄧ紪璇戞椂鍑洪敊錛涜屼嬌鐢?dynamic_cast鐨勮漿鎹㈠垯鏄厑璁哥殑錛岀粨鏋滄槸絀烘寚閽堛?/font>
3.3 reinpreter_cast
鐢ㄦ硶錛歳einpreter_cast<type-id> (expression)
type-id蹇呴』鏄竴涓寚閽堛佸紩鐢ㄣ佺畻鏈被鍨嬨佸嚱鏁版寚閽堟垨鑰呮垚鍛樻寚閽堛?br>瀹冨彲浠ユ妸涓涓寚閽堣漿鎹㈡垚涓涓暣鏁幫紝涔熷彲浠ユ妸涓涓暣鏁拌漿鎹㈡垚涓涓寚閽堬紙鍏堟妸涓涓寚閽堣漿鎹㈡垚涓涓暣鏁幫紝
鍦ㄦ妸璇ユ暣鏁拌漿鎹㈡垚鍘熺被鍨嬬殑鎸囬拡錛岃繕鍙互寰楀埌鍘熷厛鐨勬寚閽堝鹼級銆?/font>
璇ヨ繍綆楃鐨勭敤娉曟瘮杈冨銆?/font>
3.4 const_cast
鐢ㄦ硶錛歝onst_cast<type_id> (expression)
璇ヨ繍綆楃鐢ㄦ潵淇敼綾誨瀷鐨刢onst鎴杤olatile灞炴с傞櫎浜哻onst 鎴杤olatile淇グ涔嬪錛?type_id鍜宔xpression鐨勭被鍨嬫槸涓鏍風殑銆?br>甯擱噺鎸囬拡琚漿鍖栨垚闈炲父閲忔寚閽堬紝騫朵笖浠嶇劧鎸囧悜鍘熸潵鐨勫璞★紱
甯擱噺寮曠敤琚漿鎹㈡垚闈炲父閲忓紩鐢紝騫朵笖浠嶇劧鎸囧悜鍘熸潵鐨勫璞★紱甯擱噺瀵硅薄琚漿鎹㈡垚闈炲父閲忓璞°?/font>
Voiatile鍜宑onst綾昏瘯銆備婦濡備笅涓渚嬶細
class B{
public:
int m_iNum;
}
void foo(){
const B b1;
b1.m_iNum = 100; //comile error
B b2 = const_cast<B>(b1);
b2. m_iNum = 200; //fine
}
涓婇潰鐨勪唬鐮佺紪璇戞椂浼氭姤閿欙紝鍥犱負b1鏄竴涓父閲忓璞★紝涓嶈兘瀵瑰畠榪涜鏀瑰彉錛?br>浣跨敤const_cast鎶婂畠杞崲鎴愪竴涓父閲忓璞★紝灝卞彲浠ュ瀹冪殑鏁版嵁鎴愬憳浠繪剰鏀瑰彉銆傛敞鎰忥細b1鍜宐2鏄袱涓笉鍚岀殑瀵硅薄銆?/font>