锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品h在线观看,欧美片在线观看,亚洲第一天堂无码专区http://www.shnenglu.com/dawnbreak/category/8913.htmlPearLi's Blogzh-cnSat, 15 Aug 2009 13:02:13 GMTSat, 15 Aug 2009 13:02:13 GMT60OnPaint()鍑芥暟鐨勪綔鐢ㄥ師鐞?/title><link>http://www.shnenglu.com/dawnbreak/articles/93425.html</link><dc:creator>pear_li</dc:creator><author>pear_li</author><pubDate>Sat, 15 Aug 2009 06:56:00 GMT</pubDate><guid>http://www.shnenglu.com/dawnbreak/articles/93425.html</guid><wfw:comment>http://www.shnenglu.com/dawnbreak/comments/93425.html</wfw:comment><comments>http://www.shnenglu.com/dawnbreak/articles/93425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dawnbreak/comments/commentRss/93425.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dawnbreak/services/trackbacks/93425.html</trackback:ping><description><![CDATA[<font color=#000099 face=騫煎渾>WM_PAINT鏄獥鍙f瘡嬈¢噸緇橀兘浼氫駭鐢熺殑涓涓秷鎭?/font> <p><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099>OnPaint鏄榪欎釜娑堟伅鐨勫弽搴斿嚱鏁?/font></p> <p><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099> <wbr></font></p> <p><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099>mfc 鐨?CWnd::OnPaint 娌″仛浠涔堬紝鍙槸涓㈢粰緋葷粺澶勭悊銆?/font></p> <p><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 20px" color=#000099><strong>涓 錛?/strong></font></p> <p><font style="FONT-FAMILY: 騫煎渾" color=#000099> <wbr> <wbr> 鍏堟墽琛孫nEraseBkgnd錛屾摝闄よ儗鏅紙濡傛灉鎯寵嚜緇樻帶浠訛紝榪欎釜鍑芥暟鐩存帴return TRUE灝卞彲浠ヤ簡錛岃繖鏍峰氨涓嶄細鎿﹂櫎鑳屾櫙錛屼笉浼氶棯錛?/font></p> <p><font style="FONT-FAMILY: 騫煎渾" color=#000099> <wbr></font></p> <p><strong><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 18px" color=#000099>OnEraseBkGnd涓嶰nPaint鐨勫尯鍒笌鑱旂郴</font></strong></p> <p><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099>鍦∣nEraseBkGnd涓?濡傛灉浣犱笉璋冪敤鍘熸潵緙虹渷鐨凮nEraseBkGnd鍙槸閲嶇敾鑳屾櫙鍒欎笉浼氭湁闂儊.鑰屽湪<font style="BACKGROUND-COLOR: #ccff00">OnPaint閲岄潰,鐢變簬瀹冮殣鍚殑璋冪敤浜哋nEraseBkGnd</font>,鑰屼綘鍙堟病鏈夊鐞哋nEraseBkGnd 鍑芥暟,榪欐椂灝卞拰紿楀彛緙虹渷鐨勮儗鏅埛鐩稿叧浜?緙虹渷鐨?OnEraseBkGnd鎿嶄綔浣跨敤紿楀彛鐨勭己鐪佽儗鏅埛鍒鋒柊鑳屾櫙(涓鑸儏鍐典笅鏄櫧鍒?,鑰岄殢鍚庝綘鍙堣嚜宸遍噸鐢昏儗鏅犳垚灞忓箷闂姩.</font></p> <p><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099><font style="BACKGROUND-COLOR: #ccff00">OnEraseBkGnd涓嶆槸姣忔閮戒細琚皟鐢ㄧ殑</font>.濡傛灉浣?font style="BACKGROUND-COLOR: #ccff00">璋冪敤Invalidate</font>鐨勬椂鍊欏弬鏁頒負TRUE,閭d箞鍦∣nPaint閲岄潰闅愬惈<font style="BACKGROUND-COLOR: #ccff00">璋冪敤BeginPaint</font>鐨勬椂鍊欏氨浜?font style="BACKGROUND-COLOR: #ccff00">鐢焀M_ERASEBKGND娑堟伅</font>,濡傛灉鍙傛暟鏄疐ALSE,鍒欎笉浼氶噸鍒瘋儗鏅?</font></p> <p><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099><strong>ZYP瑙i噴錛?/strong><font color=#000000>void Invalidate( BOOL bErase = TRUE ); 璇ュ嚱鏁扮殑浣滅敤鏄嬌鏁翠釜紿楀彛瀹㈡埛鍖烘棤鏁堛傜獥鍙g殑瀹㈡埛鍖烘棤鏁堟剰鍛崇潃闇瑕侀噸緇橈紝鍙傛暟bErase涓篢RUE鏃訛紝閲嶇粯鍖哄煙鍐呯殑鑳屾櫙灝嗚閲嶇粯鍗蟲摝闄わ紝鍚﹀垯錛岃儗鏅皢淇濇寔涓嶅彉銆傝皟鐢↖nvalidate絳夊嚱鏁板悗紿楀彛涓嶄細绔嬪嵆閲嶇粯錛岃繖鏄敱浜嶹M_PAINT娑堟伅鐨勪紭鍏堢駭寰堜綆錛屽畠闇瑕佺瓑娑堟伅闃熷垪涓殑鍏跺畠娑堟伅鍙戦佸畬鍚庢墠鑳借澶勭悊銆?/font></font></p> <p><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099><font color=#000000><font style="BACKGROUND-COLOR: #ccff00" color=#000099>OnPaint閲岄潰浼氳皟鐢?/font>BeginPaint鍑芥暟鑷姩璁劇疆鏄劇ず璁懼鍐呭鐨勫壀鍒囧尯鍩熻屾帓闄や換浣曟洿鏂板尯鍩熷鐨勫尯鍩熸洿鏂板尯鍩熴傚鏋滄洿鏂板尯鍩熻鏍囪涓哄彲鎿﹂櫎鐨勶紝BeginPaint鍙戦佷竴涓猈M_ERASEBKGND娑堟伅緇欑獥鍙c俉M_ERASEBKGND娑堟伅鐨勫搷搴斿嚱鏁版棦鏄?font style="BACKGROUND-COLOR: #ccff00" color=#000099>OnEraseBkGnd錛堬級</font></font><br><br>鎵浠ヨВ鍐蟲柟娉曟湁涓変釜鍗?<br>1.鐢∣nEraseBkGnd瀹炵幇,涓嶈璋冪敤鍘熸潵鐨凮nEraseBkGnd鍑芥暟.<br>2.鐢∣nPaint瀹炵幇,鍚屾椂閲嶈澆OnEraseBkGnd,鍏朵腑鐩存帴榪斿洖.<br>3.鐢∣nPaint瀹炵幇,鍒涘緩紿楀彛鏃惰緗儗鏅埛涓虹┖<br>4.鐢∣nPaint瀹炵幇,浣嗘槸瑕佹眰鍒鋒柊鏃剁敤Invalidate(FALSE)榪欐牱<br>鐨勫嚱鏁?(涓嶈繃榪欑鎯呭喌涓?紿楀彛瑕嗙洊絳夐犳垚鐨勫埛鏂拌繕鏄闂竴<br>涓?鎵浠ヤ笉鏄交搴曠殑瑙e喅鏂規硶)<br>閮芥尯綆鍗曠殑.</font></p> <table> <tbody> <tr> <td> <p><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099>鍦∕FC涓?浠諱綍涓鍊媤indow鍏冧歡鐨勭躬鍦?閮芥槸鏀懼湪閫欏叐鍊媘ember function涓?br>鍦ㄨō瀹氫笂 OnEraseBkgnd()鏄敤渚嗙暙搴曞湒鐨?鑰孫nPaint()鏄敤渚嗙暙涓昏鐗╀歡鐨?br>鑸変緥瑾槑 涓鍊嬫寜閳曟槸鐏拌壊鐨?涓婇潰閭勬湁鏂囧瓧<br>鍓嘜nEraseBkgnd()鎵鍋氱殑浜嬪氨鏄妸鎸夐垥鐣垚鐏拌壊<br>鑰孫nPaint()鎵鍋氱殑浜?灝辨槸鐣笂鏂囧瓧</font></p> <p><br><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099>鏃㈢劧閫欏叐鍊媘ember function閮芥槸鐢ㄤ締鐣嚭鍏冧歡鐨?br>閭g偤浣曢倓瑕佸垎OnPaint() 鑸?OnEraseBkgnd() 鍛?br>鍏跺OnPaint() 鑸?OnEraseBkgnd() 鐗規ф槸鏈夊樊鐨?br>1. <wbr><wbr><wbr><wbr><wbr>OnEraseBkgnd()鐨勮姹傛槸蹇熷湪瑁¢潰鐨勭躬鍦栫▼寮忔渶濂芥槸涓嶈澶楁檪闁?br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>鍥犵偤<font style="BACKGROUND-COLOR: #ccff00">姣忕暥window鍏冧歡鏈変換浣曞皬璁婂嫊閮芥渻棣笂鍛煎彨OnEraseBkgnd()</font><br>2. <wbr><wbr><wbr><wbr><wbr><font style="BACKGROUND-COLOR: #ccff33" color=#000099>OnPaint() 鏄彧鏈夊湪紼嬪紡鏈夌┖闁掔殑鏅傚欐墠鏈冭鍛煎彨<br></font>3. <wbr><wbr><wbr><wbr><wbr>OnEraseBkgnd() 鏄湪 OnPaint() 涔嬪墠鍛煎彨鐨?br>鎵浠?OnPaint()琚懠鍙竴嬈′箣鍓?鍙兘鏈冨懠鍙玂nEraseBkgnd()濂藉咕嬈?br><br>濡傛灉鎴戝戞槸涓鍊嬪湪鍋氬湒褰㈠寲浣跨敤鑰呬粙闈㈢殑浜?br>甯告渻闇瑕佹妸涓寮電編緹庣殑鍦栫墖璦偤鎴戝慸ialog鐨勫簳鍦?br>鎶婄躬鍦栫殑紼嬪紡紕兼斁鍦∣nPaint() 涔嬩腑 鍙兘鏈冨父紕板埌涓浜涘晱欏?br>姣旀柟瑾嫋鏇充竴鍊嬭紿楀湪鎴戝戝仛鐨刣ialog涓婇潰涓鐩寸Щ鍕?br>鍓嘾ialog鏈冭畩鎴愮伆鑹?鐩村埌鍕曚綔鍋滄鎵嶆仮寰?br>閫欐槸鍥犵偤姣忔闇瑕侀噸綣殑鏅傚?紼嬪紡閮芥渻棣笂鍛煎彨OnEraseBkgnd()<br>OnEraseBkgnd()灝辨妸dialog鐣垚鐏拌壊<br>鑰屽彧鏈夊嫊浣滃仠姝箣寰?紼嬪紡鎵嶆渻鍛煎彨OnPaint() 閫欐檪鎵嶆渻鎶婃垜鍊戣鐣殑搴曞湒璨間笂鍘?br><br>閫欏嬪晱欏岀殑瑙f硶 姣旇純宸粸鐨勬柟娉曟槸鎶奜nEraseBkgnd() 鏀瑰鎴愪笉鍋氫簨鐨刦unction<br>濡備笅鎵紺?/font></p> <div> <table border=1 cellSpacing=0 cellPadding=0 width="100%" height=32> <tbody> <tr> <td> <p><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099>BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)<br>{<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>return TRUE;<br>}</font></p> </td> </tr> </tbody> </table> </div> <p><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099>浠ヤ笂鏈締鏄渻鍛煎彨CDialog::OnEraseBkgnd() 浣嗘槸濡傛灉鎴戝戜笉鍛煎彨鐨勮┍<br>紼嬪紡渚夸笉鏈冪暙涓婄伆鑹茬殑搴曡壊浜?/font></p> <p><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099><font color=#000000>Q:鍩轟簬瀵硅瘽妗嗙殑紼嬪簭涓浣曢噸杞絆nEraseBkGnd()鍑芥暟</font></font></p> <p><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099>A:<font color=#000000>榪欐槸涓涓秷鎭疻M_ERASEBKWND  <wbr><br> <wbr> 鍦–LASS  <wbr> WIZARD涓? <wbr><br> <wbr> 閫夋嫨CLASSINFO欏甸潰  <wbr><br> <wbr> 鍦∕ESSAGEFILTER涓殑閫夐」璁懼湪WINDOW灝卞彲浠ョ湅鍒拌繖涓秷鎭簡.</font><br><br>姣旇純濂界殑鍋氭硶鏄洿鎺ュ皣綣湒鐨勭▼寮忓緸OnPaint()縐誨埌OnEraseBkgnd()渚嗗仛<br>濡備笅鎵紺?/font></p> <div> <table border=1 cellSpacing=0 cellPadding=0 width="100%" height=280> <tbody> <tr> <td> <p><br><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099>// m_bmpBKGND 鐐轟竴CBitmap鐗╀歡 涓斾簨鍏堟棭宸茶級鍏ユ垜鍊戠殑搴曞湒<br>// 搴曞湒鐨勫ぇ灝忚垏鎴戝戠殑瑕栫獥client澶у皬涓鑷?br><br><br>BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)<br>{<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>CRect rc;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>GetUpdateRect(&rc);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>CDC srcDC;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>srcDC.CreateCompatibleDC(pDC);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>srcDC.SelectObject(m_bmpBKGND);<br><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>pDC->BitBlt(rc.left,rc.top,rc.GetWidth(),<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>rc.GetHeight(),&srcDC,rc.left,rc.top,SRCCOPY);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>return TRUE;<br>}</font></p> </td> </tr> </tbody> </table> </div> <div><br><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099>鐗瑰垾瑕佹敞鎰忕殑鏄?鍙栧緱閲嶇暙澶у皬鏄嬌鐢℅etUpdateRect() 鑰屼笉鏄疓etClientRect()<br>濡傛灉浣跨敤GetClientRect() 鏈冩妸涓嶈┎閲嶇暙鐨勫湴鏂歸噸鐣?/font></div> <div><font style="FONT-SIZE: 16px"><wbr></font></div> <div><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099>鏉ヨ嚜:http://hi.baidu.com/%BF%AA%D0%C4_%D0%D6%B5%DC/blog/item/2f6d3b10b6c622fac2ce79a5<wbr>.html</font></div> </td> </tr> </tbody> </table> <pre><font style="FONT-FAMILY: 騫煎渾" color=#000099> <wbr> </font> </pre> <p><strong><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 20px" color=#000099>浜?錛?/font></strong></p> <p><font style="FONT-FAMILY: 騫煎渾" color=#000099> <wbr> <wbr> <wbr> <wbr> 緋葷粺鐨凮npaint涓皟鐢ㄤ簡OnDraw錛屼絾濡傛灉鎴戜滑鑷繁緇ф壙浜嗕竴涓狾nPaint鍑芥暟鍙堟病鏈夋樉寮忚皟鐢∣nDraw錛屽垯OnDraw灝變笉浼氳璋冪敤,OnInitialUpdate鍦∣nDraw涔嬪墠錛屾槸紿楀彛琚垱寤轟互鍚庤皟鐢ㄧ殑絎竴涓嚱鏁般?/font></p> <p><font style="FONT-FAMILY: 騫煎渾" color=#000099> <wbr></font></p> <p><strong><font style="FONT-FAMILY: 騫煎渾" color=#000099 size=4>MFC涓璒nDraw涓嶰nPaint鐨勫尯鍒?/font></strong></p> <p><font style="FONT-FAMILY: 騫煎渾" color=#000099>鍦∣nPaint涓皟鐢∣nDraw錛屼竴鑸潵璇達紝鐢ㄦ埛鑷繁鐨勭粯鍥句唬鐮佸簲鏀懼湪OnDraw涓?/font></p> <p><font style="FONT-FAMILY: 騫煎渾" color=#000099 size=3>OnPaint()鏄疌Wnd鐨勭被鎴愬憳錛岃礋璐e搷搴擶M_PAINT娑堟伅銆侽nDraw()鏄疌VIEW鐨勬垚鍛樺嚱鏁幫紝娌℃湁鍝嶅簲娑堟伅鐨勫姛鑳?褰撹鍥懼彉寰楁棤鏁堟椂錛堝寘鎷ぇ灝忕殑鏀瑰彉錛岀Щ鍔紝琚伄鐩栫瓑絳夛級錛學indows鍙戦乄M_PAINT娑堟伅銆傝瑙嗗浘鐨凮nPaint 澶勭悊鍑芥暟閫氳繃鍒涘緩CPaintDC綾葷殑DC瀵硅薄鏉ュ搷搴旇娑堟伅騫惰皟鐢ㄨ鍥劇殑OnDraw鎴愬憳鍑芥暟.<font style="BACKGROUND-COLOR: #ccff00">OnPaint鏈鍚庝篃瑕佽皟鐢∣nDraw</font>,鍥犳涓鑸湪OnDraw鍑芥暟涓繘琛岀粯鍒躲?/font></p> <p><font size=3><br><font style="FONT-FAMILY: 騫煎渾" color=#000099>The WM_PAINT message is sent when the UpdateWindow or RedrawWindow member function is called.</font></font></p> <p><font style="FONT-FAMILY: 騫煎渾" color=#000099 size=3>鍦∣nPaint涓紝灝嗚皟鐢˙eginPaint錛岀敤鏉ヨ幏寰楀鎴峰尯鐨勬樉紺鴻澶囩幆澧冿紝騫朵互姝よ皟鐢℅DI鍑芥暟鎵ц緇樺浘鎿嶄綔銆傚湪緇樺浘鎿嶄綔瀹屾垚鍚庯紝灝嗚皟鐢‥ndPaint浠ラ噴鏀炬樉紺鴻澶囩幆澧冦傝孫nDraw鍦˙eginPaint涓嶦ndPaint闂磋璋冪敤銆傦紙<font color=#000000>涓涓簲鐢ㄧ▼搴忛櫎浜嗗搷搴擶M_PAINT娑堟伅澶栵紝涓嶅簲璇ヨ皟鐢˙eginPaint銆傛瘡嬈¤皟鐢˙eginPaint閮藉簲璇ユ湁鐩稿簲鐨凟ndPaint鍑芥暟銆?/font>錛?/font></p> <p><font size=3><font style="FONT-FAMILY: 騫煎渾" color=#000099>1) 鍦╩fc緇撴瀯閲孫nPaint鏄疌Wnd鐨勬垚鍛樺嚱鏁? OnDraw鏄疌View鐨勬垚鍛樺嚱鏁?<br>2) OnPaint()璋冪敤OnDraw()錛孫nPrint涔熶細璋冪敤OnDraw()錛屾墍浠nDraw()鏄樉紺哄拰鎵撳嵃鐨勫叡鍚屾搷浣溿?br><br>OnPaint鏄疻M_PAINT娑堟伅寮曞彂鐨勯噸緇樻秷鎭鐞嗗嚱鏁幫紝鍦∣nPaint涓細璋冪敤OnDraw鏉ヨ繘琛岀粯鍥俱侽nPaint涓鍏堟瀯閫犱竴涓狢PaintDC綾誨緱瀹炰緥錛岀劧鍚庝竴榪欎釜瀹炰緥涓哄弬鏁版潵璋冪敤铏氬嚱鏁癘nPrepareDC鏉ヨ繘琛屼竴浜涚粯鍒跺墠鐨勪竴浜涘鐞嗭紝姣旇緗槧灝勬ā寮忥紝鏈鍚庤皟鐢∣nDraw銆傝?/font><a name=baidusnap0></a><font color=#000099><font style="FONT-FAMILY: 妤蜂綋_GB2312,妤蜂綋"><font style="FONT-FAMILY: 騫煎渾"><strong style="BACKGROUND-COLOR: rgb(255,255,102); COLOR: black">OnDraw鍜?/strong>OnPrepareDC涓嶆槸娑堟伅澶勭悊鍑芥暟銆傛墍浠ュ湪涓嶆槸鍥犱負閲嶇粯娑堟伅鎵寮曞彂鐨凮nPaint瀵艱嚧OnDraw琚皟鐢ㄦ椂錛屾瘮濡傚湪OnLButtonDown絳夋秷鎭鐞嗗嚱鏁頒腑緇樺浘鏃訛紝瑕佸厛鑷繁璋冪敤OnPrepareDC銆?br>鑷充簬CPaintDC鍜孋ClientDC鏍規湰鏄袱鍥炰簨鎯?CPaintDC鏄竴涓澶囩幆澧冪被錛屽湪OnPaint涓綔涓哄弬鏁頒紶閫掔粰OnPrepareDC鏉ヤ綔璁懼鐜鐨勮緗傜湡姝e拰CClientDC鍏鋒湁鍙瘮鎬х殑鏄疌WindowDC錛屼粬浠竴涓槸鎻忚堪瀹㈡埛鍖哄煙錛屼竴涓槸鎻忚堪鏁翠釜灞忓箷銆?br>濡傛灉鏄CVIEW鎴栦粠CVIEW綾繪淳鐢熺殑紿楀彛緇樺浘鏃跺簲璇ョ敤OnDraw銆?/font></font></font></font></p> <p><font size=3><font style="FONT-FAMILY: 騫煎渾" color=#000099>OnDraw()</font><a name=baidusnap1></a><font color=#000099><font style="FONT-FAMILY: 妤蜂綋_GB2312,妤蜂綋"><font style="FONT-FAMILY: 騫煎渾"><strong style="BACKGROUND-COLOR: rgb(160,255,255); COLOR: black">鍜孫nPaint</strong>()鏈変粈涔堝尯鍒憿錛?br>棣栧厛錛氭垜浠厛瑕佹槑紜瓹View綾繪淳鐢熻嚜CWnd綾匯傝孫nPaint()鏄疌Wnd鐨勭被鎴愬憳錛屽悓鏃惰礋璐e搷搴擶M_PAINT娑堟伅銆侽nDraw()鏄疌VIEW鐨勬垚鍛樺嚱鏁幫紝騫朵笖娌℃湁鍝嶅簲娑堟伅鐨勫姛鑳姐傝繖灝辨槸涓轟粈涔堜綘鐢╒C鎴愮殑紼嬪簭浠g爜鏃訛紝鍦ㄨ鍥劇被鍙湁OnDraw娌℃湁</font></font></font><a name=baidusnap2></a><font color=#000099><font style="FONT-FAMILY: 妤蜂綋_GB2312,妤蜂綋"><font style="FONT-FAMILY: 騫煎渾"><strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">OnPaint鐨?/strong>鍘熷洜銆傝屽湪鍩轟簬瀵硅瘽妗嗙殑紼嬪簭涓紝鍙湁OnPaint銆?br>鍏舵錛氭垜浠湪絎婃瘡澶╄窡鎴戝MFC銆?鐨勫紑濮嬮儴鍒嗗凡緇忚鍒頒簡銆傝鎯沖湪灞忓箷涓婄粯鍥炬垨鏄劇ず鍥懼艦錛岄鍏堥渶瑕佸緩绔嬭澶囩幆澧僁C銆傚叾瀹濪C鏄竴涓暟鎹粨鏋勶紝瀹冨寘鍚緭鍑鴻澶囷紙涓嶅崟鎸囦綘17瀵哥殑綰睆鏄劇ず鍣紝榪樺寘鎷墦鍗版満涔嬬被鐨勮緭鍑鴻澶囷級鐨勭粯鍥懼睘鎬х殑鎻忚堪銆侻FC鎻愪緵浜咰PaintDC綾誨拰CWindwoDC綾繪潵瀹炴椂鐨勫搷搴旓紝鑰孋PaintDC鏀寔閲嶇敾銆傚綋瑙嗗浘鍙樺緱鏃犳晥鏃訛紙鍖呮嫭澶у皬鐨勬敼鍙橈紝縐誨姩錛岃閬洊絳夌瓑錛夛紝Windows 灝?WM_PAINT 娑堟伅鍙戦佺粰瀹冦傝瑙嗗浘鐨凮nPaint 澶勭悊鍑芥暟閫氳繃鍒涘緩 CPaintDC 綾葷殑DC瀵硅薄鏉ュ搷搴旇娑堟伅騫惰皟鐢ㄨ鍥劇殑 OnDraw 鎴愬憳鍑芥暟銆傞氬父鎴戜滑涓嶅繀緙栧啓閲嶅啓鐨?OnPaint 澶勭悊鎴愬憳鍑芥暟銆?br>///CView榛樿鐨勬爣鍑嗙殑閲嶇敾鍑芥暟<br>void CView::OnPaint() //瑙乂IEWCORE.CPP<br>{</font></font></font></font></p> <p><font color=#000099><font style="FONT-FAMILY: 妤蜂綋_GB2312,妤蜂綋"><font style="FONT-FAMILY: 騫煎渾"><font size=3>CPaintDC dc(this);<br>OnPrepareDC(&dc)錛?br>OnDraw(&dc); <wbr></font><wbr>//璋冪敤浜哋nDraw<br>}<br>///CView榛樿鐨勬爣鍑嗙殑OnPrint鍑芥暟<br>void CView::OnPrint(CDC* pDC, CPrintInfo*)<br>{<br>ASSERT_VALID(pDC);<br>OnDraw(pDC); <wbr><wbr>// Call Draw<br>}</font></font></font></p> <p><font style="FONT-FAMILY: 騫煎渾" color=#000099 size=3>鏃㈢劧OnPaint鏈鍚庝篃瑕佽皟鐢∣nDraw,鍥犳鎴戜滑涓鑸細鍦∣nDraw鍑芥暟涓繘琛岀粯鍒躲備笅闈㈡槸涓涓吀鍨嬬殑紼嬪簭銆?br>///瑙嗗浘涓殑緇樺浘浠g爜棣栧厛媯绱㈡寚鍚戞枃妗g殑鎸囬拡錛岀劧鍚庨氳繃DC榪涜緇樺浘璋冪敤銆?br>void CMyView::OnDraw( CDC* pDC )<br>{</font></p> <p><font style="FONT-FAMILY: 騫煎渾" color=#000099 size=3>CMyDoc* pDoc = GetDocument();<br>CString s = pDoc->GetData();<br>GetClientRect( &rect ); // Returns a CString CRect rect;<br>pDC->SetTextAlign( TA_BASELINE | TA_CENTER );<br>pDC->TextOut( rect.right / 2, rect.bottom / 2, s, s.GetLength() );<br>}<br>鏈鍚庯細鐜板湪澶у鏄庣櫧榪欏摜淇╀箣闂寸殑鍏崇郴浜嗗惂銆傚洜姝ゆ垜浠竴鑸敤OnPaint緇存姢紿楀彛鐨勫鎴峰尯錛堜緥濡傛垜浠殑紿楀彛瀹㈡埛鍖哄姞涓涓儗鏅浘鐗囷級錛岀敤OnDraw緇存姢瑙嗗浘鐨勫鎴峰尯錛堜緥濡傛垜浠氳繃榧犳爣鍦ㄨ鍥句腑鐢誨浘錛夈傚綋鐒朵綘涔熷彲浠ヤ笉鎸夌収涓婇潰瑙勫緥鏉ワ紝鍙杈懼埌鐩殑騫朵笖娌℃湁闂錛屾庝箞騫查兘鎴愩傝ˉ鍏咃細鎴戜滑榪樺彲浠ュ埄鐢↖nvalidate(),ValidateRgn(),ValidateRect()鍑芥暟寮哄埗鐨勯噸鐢葷獥鍙o紝鍏蜂綋鐨勮鍙傝僊SDN鍚с?/font></p> <p><font style="FONT-FAMILY: 騫煎渾" color=#000099 size=3>OnDraw涓彲浠ョ粯鍒剁敤鎴峰尯鍩熴侽nPaint涓彧鏄綋紿楀彛鏃犳晥鏃墮噸緇樹笉浼氫繚鐣機ClientDC緇樺埗鐨勫唴瀹廣?/font></p> <p><font style="FONT-FAMILY: 騫煎渾" color=#000099 size=3>榪欎袱涓嚱鏁版湁鍖哄埆涔熸湁鑱旂郴錛?/font></p> <p><font style="FONT-FAMILY: 騫煎渾" color=#000099 size=3>1銆佸尯鍒細OnDraw鏄竴涓函铏氬嚱鏁幫紝瀹氫箟涓簐irtual void OnDraw( CDC* pDC ) = 0;銆鑰孫nPaint鏄竴涓秷鎭搷搴斿嚱鏁幫紝瀹冨搷搴斾簡WM錛縋ANIT娑堟伅錛屼篃鏄槸紿楀彛閲嶇粯娑堟伅銆?/font></p> <p><font style="FONT-FAMILY: 騫煎渾" color=#000099 size=3>2銆佽仈緋伙細鎴戜滑涓鑸湪瑙嗙被涓綔鍥劇殑鏃跺欙紝寰寰涓嶇洿鎺ュ搷搴擶M錛縋ANIT娑堟伅錛岃屾槸閲嶈澆OnDraw綰櫄鍑芥暟錛岃繖鏄洜涓哄湪CVIEW綾諱腑鐨刉M錛縋ANIT娑堟伅鍝嶅簲鍑芥暟涓皟鐢ㄤ簡OnDraw鍑芥暟錛屽鏋滃湪CMYVIEW綾諱腑鍝嶅簲浜哤M錛縋AINT娑堟伅錛屼笉鏄懼紡鍦拌皟鐢∣nDraw鍑芥暟鐨勮瘽錛屾槸涓嶄細鍦ㄧ獥鍙i噸緇樼殑鏃跺欒皟鐢∣nDraw鍑芥暟鐨勩?/font></p> <p><font style="FONT-FAMILY: 騫煎渾" color=#000099 size=3>搴旂敤紼嬪簭涓嚑涔庢墍鏈夌殑緇樺浘閮藉湪瑙嗗浘鐨?OnDraw 鎴愬憳鍑芥暟涓彂鐢燂紝蹇呴』鍦ㄨ鍥劇被涓噸鍐欒鎴愬憳鍑芥暟銆傦紙榧犳爣緇樺浘鏄釜鐗逛緥錛岃繖鍦ㄩ氳繃瑙嗗浘瑙i噴鐢ㄦ埛杈撳叆涓璁恒傦級</font></p> <p><font size=3><br><font color=#000099><font style="FONT-FAMILY: 妤蜂綋_GB2312,妤蜂綋"><font style="FONT-FAMILY: 騫煎渾">OnDraw 閲嶅啓錛?br>閫氳繃璋冪敤鎮ㄦ彁渚涚殑鏂囨。鎴愬憳鍑芥暟鑾峰彇鏁版嵁銆?br>閫氳繃璋冪敤妗嗘灦浼犻掔粰 OnDraw 鐨勮澶囦笂涓嬫枃瀵硅薄鐨勬垚鍛樺嚱鏁版潵鏄劇ず鏁版嵁銆?br>褰撴枃妗g殑鏁版嵁浠ユ煇縐嶆柟寮忔洿鏀瑰悗錛屽繀欏婚噸緇樿鍥句互鍙嶆槧璇ユ洿鏀廣傞粯璁ょ殑 OnUpdate 瀹炵幇浣胯鍥劇殑鏁翠釜宸ヤ綔鍖烘棤鏁堛傚綋瑙嗗浘鍙樺緱鏃犳晥鏃訛紝Windows 灝?WM_PAINT 娑堟伅鍙戦佺粰瀹冦傝瑙嗗浘鐨?OnPaint 澶勭悊鍑芥暟閫氳繃鍒涘緩 CPaintDC 綾葷殑璁懼涓婁笅鏂囧璞℃潵鍝嶅簲璇ユ秷鎭茍璋冪敤瑙嗗浘鐨?OnDraw 鎴愬憳鍑芥暟銆?br><br>褰撴病鏈夋坊鍔燱M_PAINT娑堟伅澶勭悊鏃?紿楀彛閲嶇粯鏃?鐢監nDraw鏉ヨ繘琛屾秷鎭搷搴?..褰撴坊鍔燱M_PAINT娑堟伅澶勭悊鏃?紿楀彛閲嶇粯鏃?WM_PAINT娑堟伅琚姇閫?鐢監nPaint鏉ヨ繘琛屾秷鎭搷搴?榪欐椂灝變笉鑳介殣寮忚皟鐢∣nDraw浜?蹇呴』鏄懼紡璋冪敤( <wbr></font></font></font></font><wbr><font style="FONT-FAMILY: 騫煎渾" color=#000099>CDC *pDC=GetDC(); OnDraw(pDC); <wbr><wbr>)..<br>闅愬紡璋冪敤:褰撶敱OnPaint鏉ヨ繘琛屾秷鎭搷搴旀椂,緋葷粺鑷姩璋冪敤CView::OnDraw(&pDC).</font></p> <p><br><font style="FONT-FAMILY: 騫煎渾" color=#000099 size=3>鎯寵薄涓涓嬶紝紿楀彛鏄劇ず鐨勫唴瀹瑰拰鎵撳嵃鐨勫唴瀹規槸宸笉澶氱殑錛屾墍浠ワ紝涓鑸儏鍐典笅錛岀粺涓鐢監nDraw鏉ョ敾銆傜獥鍙e墠鏅渶瑕佸埛鏂版椂錛岀郴緇熶細浼氳皟鐢ㄥ埌OnPaint錛岃孫nPaint涓鑸儏鍐典笅鏄DC浣滀竴浜涘垵濮嬪寲鎿嶄綔鍚庯紝璋冪敤OnDraw()銆?/font></p> <p><font size=3><br><font color=#000099><font style="FONT-FAMILY: 妤蜂綋_GB2312,妤蜂綋"><font style="FONT-FAMILY: 騫煎渾">OnEraseBkGnd()錛屾槸紿楀彛鑳屾櫙闇瑕佸埛鏂版椂鐢辯郴緇熻皟鐢ㄧ殑銆傛槑鏄劇殑涓涓緥瀛愭槸璁劇疆紿楀彛鐨勮儗鏅鑹詫紙浣犲彲浠ユ妸榪欐斁鍦∣nPaint涓幓鍋氾紝浣嗘槸浼氫嬌浜х敓闂儊鐨勭幇璞★級銆?<wbr></font></font></font></font><wbr><br><font style="FONT-FAMILY: 騫煎渾" color=#000099>鑷充簬鎬庝箞鐣屽畾鑳屾櫙鍜屽墠鏅紝閭h鍏蜂綋闂鍏蜂綋鍒嗘瀽浜嗭紝涓鑸儏鍐典笅錛屼綘榪樻槸寰堝鏄撳尯鍒殑鍚с?/font></p> <p><font style="FONT-FAMILY: 騫煎渾" color=#000099 size=3>鐨勭‘錛孫nPaint()鐢ㄦ潵鍝嶅簲WM_PAINT娑堟伅錛岃綾葷殑OnPaint()鍐呴儴鏍規嵁鏄墦鍗拌繕鏄睆騫曠粯鍒跺垎鍒互涓嶅悓鐨勫弬鏁拌皟鐢∣nDraw()铏氬嚱鏁般傛墍浠ュ湪OnDraw()閲屼綘鍙互鍖哄埆瀵瑰緟鎵撳嵃鍜屽睆騫曠粯鍒躲?br>鍏跺疄錛孧FC鍦ㄨ繘琛屾墦鍗板墠鍚庤繕鍋氫簡寰堝宸ヤ綔錛岃皟鐢ㄤ簡寰堝铏氬嚱鏁幫紝姣斿OnPreparePrint()絳夈?/font></p> <p><br><strong><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 20px" color=#000099>鍙﹀OnInitialUpdate</font></strong></p> <p><font style="FONT-FAMILY: 騫煎渾; FONT-SIZE: 16px" color=#000099>瑙嗗浘紿楀彛瀹屽叏寤虹珛鍚庣涓涓妗嗘灦璋冪敤鐨勫嚱鏁般傛鏋跺湪絎竴嬈¤皟鐢∣nDraw鍓嶄細璋冪敤OnInitialUpdate錛屽洜姝nInitialUpdate鏄緗粴鍔ㄨ鍥劇殑閫昏緫灝哄鍜屾槧灝勬ā寮忕殑鏈鍚堥傜殑鍦版柟銆?/font></p> <img src ="http://www.shnenglu.com/dawnbreak/aggbug/93425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dawnbreak/" target="_blank">pear_li</a> 2009-08-15 14:56 <a href="http://www.shnenglu.com/dawnbreak/articles/93425.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>c++鎿嶄綔絎﹂噸杞?http://www.shnenglu.com/dawnbreak/articles/92979.htmlpear_lipear_liTue, 11 Aug 2009 16:00:00 GMThttp://www.shnenglu.com/dawnbreak/articles/92979.htmlhttp://www.shnenglu.com/dawnbreak/comments/92979.htmlhttp://www.shnenglu.com/dawnbreak/articles/92979.html#Feedback0http://www.shnenglu.com/dawnbreak/comments/commentRss/92979.htmlhttp://www.shnenglu.com/dawnbreak/services/trackbacks/92979.html闃呰鍏ㄦ枃

pear_li 2009-08-12 00:00 鍙戣〃璇勮
]]>
Makefile鏁欑▼http://www.shnenglu.com/dawnbreak/articles/86350.htmlpear_lipear_liMon, 01 Jun 2009 01:35:00 GMThttp://www.shnenglu.com/dawnbreak/articles/86350.htmlhttp://www.shnenglu.com/dawnbreak/comments/86350.htmlhttp://www.shnenglu.com/dawnbreak/articles/86350.html#Feedback0http://www.shnenglu.com/dawnbreak/comments/commentRss/86350.htmlhttp://www.shnenglu.com/dawnbreak/services/trackbacks/86350.html

0 Makefile姒傝堪


浠涔堟槸makefile錛熸垨璁稿緢澶歐inodws鐨勭▼搴忓憳閮戒笉鐭ラ亾榪欎釜涓滆タ錛屽洜涓洪偅浜沇indows鐨処DE閮戒負浣犲仛浜嗚繖涓伐浣滐紝浣嗘垜瑙夊緱瑕佷綔涓涓ソ鐨勫拰professional鐨勭▼搴忓憳錛宮akefile榪樻槸瑕佹噦銆傝繖灝卞ソ鍍忕幇鍦ㄦ湁榪欎箞澶氱殑HTML鐨勭紪杈戝櫒錛屼絾濡傛灉浣犳兂鎴愪負涓涓笓涓氫漢澹紝浣犺繕鏄浜嗚ВHTML鐨勬爣璇嗙殑鍚箟銆傜壒鍒湪Unix涓嬬殑杞歡緙栬瘧錛屼綘灝變笉鑳戒笉鑷繁鍐檓akefile浜嗭紝浼氫笉浼氬啓makefile錛屼粠涓涓晶闈㈣鏄庝簡涓涓漢鏄惁鍏峰瀹屾垚澶у瀷宸ョ▼鐨勮兘鍔涖?

鍥犱負錛宮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銆?

0.1 鍏充簬紼嬪簭鐨勭紪璇戝拰閾炬帴

鍦ㄦ錛屾垜鎯沖璇村叧浜庣▼搴忕紪璇戠殑涓浜涜鑼冨拰鏂規硶錛屼竴鑸潵璇達紝鏃犺鏄疌銆丆++銆佽繕鏄痯as錛岄鍏堣鎶婃簮鏂囦歡緙栬瘧鎴愪腑闂翠唬鐮佹枃浠訛紝鍦╓indows涓嬩篃灝辨槸 .obj 鏂囦歡錛孶NIX涓嬫槸 .o 鏂囦歡錛屽嵆 Object File錛岃繖涓姩浣滃彨鍋氱紪璇戯紙compile錛夈傜劧鍚庡啀鎶婂ぇ閲忕殑Object File鍚堟垚鎵ц鏂囦歡錛岃繖涓姩浣滃彨浣滈摼鎺ワ紙link錛夈?

緙栬瘧鏃訛紝緙栬瘧鍣ㄩ渶瑕佺殑鏄娉曠殑姝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鏈夎澶氱殑鍐呭錛岄棽璦灝戝彊錛岃繕鏄鎴戜滑寮濮嬪惂銆?

1 Makefile 浠嬬粛


make鍛戒護鎵ц鏃訛紝闇瑕佷竴涓?Makefile 鏂囦歡錛屼互鍛婅瘔make鍛戒護闇瑕佹庝箞鏍風殑鍘葷紪璇戝拰閾炬帴紼嬪簭銆?

棣栧厛錛屾垜浠敤涓涓ず渚嬫潵璇存槑Makefile鐨勪功鍐欒鍒欍備互渚跨粰澶у涓涓劅鍏磋璇嗐傝繖涓ず渚嬫潵婧愪簬GNU鐨刴ake浣跨敤鎵嬪唽錛屽湪榪欎釜紺轟緥涓紝鎴戜滑鐨勫伐紼嬫湁8涓狢鏂囦歡錛屽拰3涓ご鏂囦歡錛屾垜浠鍐欎竴涓狹akefile鏉ュ憡璇塵ake鍛戒護濡備綍緙栬瘧鍜岄摼鎺ヨ繖鍑犱釜鏂囦歡銆傛垜浠殑瑙勫垯鏄細

  1. 濡傛灉榪欎釜宸ョ▼娌℃湁緙栬瘧榪囷紝閭d箞鎴戜滑鐨勬墍鏈塁鏂囦歡閮借緙栬瘧騫惰閾炬帴銆?
  2. 濡傛灉榪欎釜宸ョ▼鐨勬煇鍑犱釜C鏂囦歡琚慨鏀癸紝閭d箞鎴戜滑鍙紪璇戣淇敼鐨凜鏂囦歡錛屽茍閾炬帴鐩爣紼嬪簭銆?
  3. 濡傛灉榪欎釜宸ョ▼鐨勫ご鏂囦歡琚敼鍙樹簡錛岄偅涔堟垜浠渶瑕佺紪璇戝紩鐢ㄤ簡榪欏嚑涓ご鏂囦歡鐨凜鏂囦歡錛屽茍閾炬帴鐩爣紼嬪簭銆?

鍙鎴戜滑鐨凪akefile鍐欏緱澶熷ソ錛屾墍鏈夌殑榪欎竴鍒囷紝鎴戜滑鍙敤涓涓猰ake鍛戒護灝卞彲浠ュ畬鎴愶紝make鍛戒護浼氳嚜鍔ㄦ櫤鑳藉湴鏍規嵁褰撳墠鐨勬枃浠朵慨鏀圭殑鎯呭喌鏉ョ‘瀹氬摢浜涙枃浠墮渶瑕侀噸緙栬瘧錛屼粠鑰岃嚜宸辯紪璇戞墍闇瑕佺殑鏂囦歡鍜岄摼鎺ョ洰鏍囩▼搴忋?

1.1 Makefile鐨勮鍒?

鍦ㄨ榪拌繖涓狹akefile涔嬪墠錛岃繕鏄鎴戜滑鍏堟潵綺楃暐鍦扮湅涓鐪婱akefile鐨勮鍒欍?
target ... : prerequisites ...
command
...
...
target涔熷氨鏄竴涓洰鏍囨枃浠訛紝鍙互鏄疧bject File錛屼篃鍙互鏄墽琛屾枃浠躲傝繕鍙互鏄竴涓爣絳撅紙Label錛夛紝瀵逛簬鏍囩榪欑鐗規э紝鍦ㄥ悗緇殑“浼洰鏍?#8221;绔犺妭涓細鏈夊彊榪般?

prerequisites灝辨槸錛岃鐢熸垚閭d釜target鎵闇瑕佺殑鏂囦歡鎴栨槸鐩爣銆?

command涔熷氨鏄痬ake闇瑕佹墽琛岀殑鍛戒護銆傦紙浠繪剰鐨凷hell鍛戒護錛?

榪欐槸涓涓枃浠剁殑渚濊禆鍏崇郴錛屼篃灝辨槸璇達紝target榪欎竴涓垨澶氫釜鐨勭洰鏍囨枃浠朵緷璧栦簬prerequisites涓殑鏂囦歡錛屽叾鐢熸垚瑙勫垯瀹氫箟鍦╟ommand涓傝鐧戒竴鐐瑰氨鏄錛宲rerequisites涓鏋滄湁涓涓互涓婄殑鏂囦歡姣攖arget鏂囦歡瑕佹柊鐨勮瘽錛宑ommand鎵瀹氫箟鐨勫懡浠ゅ氨浼氳鎵ц銆傝繖灝辨槸Makefile鐨勮鍒欍備篃灝辨槸Makefile涓渶鏍稿績鐨勫唴瀹廣?

璇村埌搴曪紝Makefile鐨勪笢瑗垮氨鏄繖鏍蜂竴鐐癸紝濂藉儚鎴戠殑榪欑瘒鏂囨。涔熻緇撴潫浜嗐傚懙鍛點傝繕涓嶅敖鐒訛紝榪欐槸Makefile鐨勪富綰垮拰鏍稿績錛屼絾瑕佸啓濂戒竴涓狹akefile榪樹笉澶燂紝鎴戜細浠ュ悗闈竴鐐逛竴鐐瑰湴緇撳悎鎴戠殑宸ヤ綔緇忛獙緇欎綘鎱㈡參鍒版潵銆傚唴瀹硅繕澶氱潃鍛€傦細錛?

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”灝卞彲浠ヤ簡銆?

鍦ㄨ繖涓猰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涓畾涔変笉鐢ㄧ殑緙栬瘧鎴栨槸鍜岀紪璇戞棤鍏崇殑鍛戒護錛屾瘮濡傜▼搴忕殑鎵撳寘錛岀▼搴忕殑澶囦喚錛岀瓑絳夈?

1.3 make鏄浣曞伐浣滅殑

鍦ㄩ粯璁ょ殑鏂瑰紡涓嬶紝涔熷氨鏄垜浠彧杈撳叆make鍛戒護銆傞偅涔堬紝

  1. make浼氬湪褰撳墠鐩綍涓嬫壘鍚嶅瓧鍙?#8220;Makefile”鎴?#8220;makefile”鐨勬枃浠躲?
  2. 濡傛灉鎵懼埌錛屽畠浼氭壘鏂囦歡涓殑絎竴涓洰鏍囨枃浠訛紙target錛夛紝鍦ㄤ笂闈㈢殑渚嬪瓙涓紝浠栦細鎵懼埌“edit”榪欎釜鏂囦歡錛屽茍鎶婅繖涓枃浠朵綔涓烘渶緇堢殑鐩爣鏂囦歡銆?
  3. 濡傛灉edit鏂囦歡涓嶅瓨鍦紝鎴栨槸edit鎵渚濊禆鐨勫悗闈㈢殑 .o 鏂囦歡鐨勬枃浠朵慨鏀規椂闂磋姣攅dit榪欎釜鏂囦歡鏂幫紝閭d箞錛屼粬灝變細鎵ц鍚庨潰鎵瀹氫箟鐨勫懡浠ゆ潵鐢熸垚edit榪欎釜鏂囦歡銆?
  4. 濡傛灉edit鎵渚濊禆鐨?o鏂囦歡涔熷瓨鍦紝閭d箞make浼氬湪褰撳墠鏂囦歡涓壘鐩爣涓?o鏂囦歡鐨勪緷璧栨э紝濡傛灉鎵懼埌鍒欏啀鏍規嵁閭d竴涓鍒欑敓鎴?o鏂囦歡銆傦紙榪欐湁鐐瑰儚涓涓爢鏍堢殑榪囩▼錛?
  5. 褰撶劧錛屼綘鐨凜鏂囦歡鍜孒鏂囦歡鏄瓨鍦ㄧ殑鍟︼紝浜庢槸make浼氱敓鎴?.o 鏂囦歡錛岀劧鍚庡啀鐢?.o 鏂囦歡鐢熷懡make鐨勭粓鏋佷換鍔★紝涔熷氨鏄墽琛屾枃浠秂dit浜嗐?

榪欏氨鏄暣涓猰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浼氳閲嶉摼鎺ャ?

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璇█涓殑瀹忓彲鑳戒細鏇村ソ銆?

姣斿錛屾垜浠0鏄庝竴涓彉閲忥紝鍙玱bjects, OBJECTS, objs, OBJS, obj, 鎴栨槸 OBJ錛屽弽姝d笉綆′粈涔堝暒錛屽彧瑕佽兘澶熻〃紺簅bj鏂囦歡灝辮浜嗐傛垜浠湪makefile涓寮濮嬪氨榪欐牱瀹氫箟錛?

     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)

浜庢槸濡傛灉鏈夋柊鐨?.o 鏂囦歡鍔犲叆錛屾垜浠彧闇綆鍗曞湴淇敼涓涓?objects 鍙橀噺灝卞彲浠ヤ簡銆?

鍏充簬鍙橀噺鏇村鐨勮瘽棰橈紝鎴戜細鍦ㄥ悗緇粰浣犱竴涓閬撴潵銆?

1.5 璁﹎ake鑷姩鎺ㄥ

GNU鐨刴ake寰堝己澶э紝瀹冨彲浠ヨ嚜鍔ㄦ帹瀵兼枃浠朵互鍙婃枃浠朵緷璧栧叧緋誨悗闈㈢殑鍛戒護錛屼簬鏄垜浠氨娌″繀瑕佸幓鍦ㄦ瘡涓涓猍.o]鏂囦歡鍚庨兘鍐欎笂綾諱技鐨勫懡浠わ紝鍥犱負錛屾垜浠殑make浼氳嚜鍔ㄨ瘑鍒紝騫惰嚜宸辨帹瀵煎懡浠ゃ?

鍙make鐪嬪埌涓涓猍.o]鏂囦歡錛屽畠灝變細鑷姩鐨勬妸[.c]鏂囦歡鍔犲湪渚濊禆鍏崇郴涓紝濡傛灉make鎵懼埌涓涓獁hatever.o錛岄偅涔坵hatever.c錛屽氨浼氭槸whatever.o鐨勪緷璧栨枃浠躲傚茍涓?cc -c whatever.c 涔熶細琚帹瀵煎嚭鏉ワ紝浜庢槸錛屾垜浠殑makefile鍐嶄篃涓嶇敤鍐欏緱榪欎箞澶嶆潅銆傛垜浠殑鏄柊鐨刴akefile鍙堝嚭鐐変簡銆?

    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鏄釜浼洰鏍囨枃浠躲?

鍏充簬鏇翠負璇︾粏鐨?#8220;闅愭櫐瑙勫垯”鍜?#8220;浼洰鏍囨枃浠?#8221;錛屾垜浼氬湪鍚庣畫緇欎綘涓涓閬撴潵銆?

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;銆?

涓婇潰灝辨槸涓涓猰akefile鐨勬璨岋紝涔熸槸makefile鐨勫熀紜錛屼笅闈㈣繕鏈夊緢澶歮akefile鐨勭浉鍏崇粏鑺傦紝鍑嗗濂戒簡鍚楋紵鍑嗗濂戒簡灝辨潵銆?


2 Makefile 鎬昏堪

2.1 Makefile閲屾湁浠涔堬紵

Makefile閲屼富瑕佸寘鍚簡浜斾釜涓滆タ錛氭樉寮忚鍒欍侀殣鏅﹁鍒欍佸彉閲忓畾涔夈佹枃浠舵寚紺哄拰娉ㄩ噴銆?

  1. 鏄懼紡瑙勫垯銆傛樉寮忚鍒欒鏄庝簡錛屽浣曠敓鎴愪竴涓垨澶氱殑鐨勭洰鏍囨枃浠躲傝繖鏄敱Makefile鐨勪功鍐欒呮槑鏄炬寚鍑猴紝瑕佺敓鎴愮殑鏂囦歡錛屾枃浠剁殑渚濊禆鏂囦歡錛岀敓鎴愮殑鍛戒護銆?
  2. 闅愭櫐瑙勫垯銆傜敱浜庢垜浠殑make鏈夎嚜鍔ㄦ帹瀵肩殑鍔熻兘錛屾墍浠ラ殣鏅︾殑瑙勫垯鍙互璁╂垜浠瘮杈冪矖緋欏湴綆鐣ュ湴涔﹀啓Makefile錛岃繖鏄敱make鎵鏀寔鐨勩?
  3. 鍙橀噺鐨勫畾涔夈傚湪Makefile涓垜浠瀹氫箟涓緋誨垪鐨勫彉閲忥紝鍙橀噺涓鑸兘鏄瓧絎︿覆錛岃繖涓湁鐐逛綘C璇█涓殑瀹忥紝褰揗akefile琚墽琛屾椂錛屽叾涓殑鍙橀噺閮戒細琚墿灞曞埌鐩稿簲鐨勫紩鐢ㄤ綅緗笂銆?
  4. 鏂囦歡鎸囩ず銆傚叾鍖呮嫭浜嗕笁涓儴鍒嗭紝涓涓槸鍦ㄤ竴涓狹akefile涓紩鐢ㄥ彟涓涓狹akefile錛屽氨鍍廋璇█涓殑include涓鏍鳳紱鍙︿竴涓槸鎸囨牴鎹煇浜涙儏鍐墊寚瀹歁akefile涓殑鏈夋晥閮ㄥ垎錛屽氨鍍廋璇█涓殑棰勭紪璇?if涓鏍鳳紱榪樻湁灝辨槸瀹氫箟涓涓琛岀殑鍛戒護銆傛湁鍏寵繖涓閮ㄥ垎鐨勫唴瀹癸紝鎴戜細鍦ㄥ悗緇殑閮ㄥ垎涓榪般?
  5. 娉ㄩ噴銆侻akefile涓彧鏈夎娉ㄩ噴錛屽拰UNIX鐨凷hell鑴氭湰涓鏍鳳紝鍏舵敞閲婃槸鐢?#8220;#”瀛楃錛岃繖涓氨鍍廋/C++涓殑“//”涓鏍楓傚鏋滀綘瑕佸湪浣犵殑Makefile涓嬌鐢?#8220;#”瀛楃錛屽彲浠ョ敤鍙嶆枩妗嗚繘琛岃漿涔夛紝濡傦細“\#”銆?

鏈鍚庯紝榪樺煎緱涓鎻愮殑鏄紝鍦∕akefile涓殑鍛戒護錛屽繀欏昏浠Tab]閿紑濮嬨?

2.2Makefile鐨勬枃浠跺悕

榛樿鐨勬儏鍐典笅錛宮ake鍛戒護浼氬湪褰撳墠鐩綍涓嬫寜欏哄簭鎵懼鏂囦歡鍚嶄負“GNUmakefile”銆?#8220;makefile”銆?#8220;Makefile”鐨勬枃浠訛紝鎵懼埌浜嗚В閲婅繖涓枃浠躲傚湪榪欎笁涓枃浠跺悕涓紝鏈濂戒嬌鐢?#8220;Makefile”榪欎釜鏂囦歡鍚嶏紝鍥犱負錛岃繖涓枃浠跺悕絎竴涓瓧絎︿負澶у啓錛岃繖鏍鋒湁涓縐嶆樉鐩殑鎰熻銆傛渶濂戒笉瑕佺敤“GNUmakefile”錛岃繖涓枃浠舵槸GNU鐨刴ake璇嗗埆鐨勩傛湁鍙﹀涓浜沵ake鍙鍏ㄥ皬鍐欑殑“makefile”鏂囦歡鍚嶆晱鎰燂紝浣嗘槸鍩烘湰涓婃潵璇達紝澶у鏁扮殑make閮芥敮鎸?#8220;makefile”鍜?#8220;Makefile”榪欎袱縐嶉粯璁ゆ枃浠跺悕銆?

褰撶劧錛屼綘鍙互浣跨敤鍒殑鏂囦歡鍚嶆潵涔﹀啓Makefile錛屾瘮濡傦細“Make.Linux”錛?#8220;Make.Solaris”錛?#8220;Make.AIX”絳夛紝濡傛灉瑕佹寚瀹氱壒瀹氱殑Makefile錛屼綘鍙互浣跨敤make鐨?#8220;-f”鍜?#8220;--file”鍙傛暟錛屽錛歮ake -f Make.Linux鎴杕ake --file Make.AIX銆?

2.3 寮曠敤鍏跺畠鐨凪akefile

鍦∕akefile浣跨敤include鍏抽敭瀛楀彲浠ユ妸鍒殑Makefile鍖呭惈榪涙潵錛岃繖寰堝儚C璇█鐨?include錛岃鍖呭惈鐨勬枃浠朵細鍘熸ā鍘熸牱鐨勬斁鍦ㄥ綋鍓嶆枃浠剁殑鍖呭惈浣嶇疆銆俰nclude鐨勮娉曟槸錛?
include <filename>
filename鍙互鏄綋鍓嶆搷浣滅郴緇烻hell鐨勬枃浠舵ā寮忥紙鍙互淇濆惈璺緞鍜岄氶厤絎︼級

鍦╥nclude鍓嶉潰鍙互鏈変竴浜涚┖瀛楃錛屼絾鏄粷涓嶈兘鏄痆Tab]閿紑濮嬨俰nclude鍜?filename>鍙互鐢ㄤ竴涓垨澶氫釜絀烘牸闅斿紑銆備婦涓緥瀛愶紝浣犳湁榪欐牱鍑犱釜Makefile錛歛.mk銆乥.mk銆乧.mk錛岃繕鏈変竴涓枃浠跺彨foo.make錛屼互鍙婁竴涓彉閲?(bar)錛屽叾鍖呭惈浜唀.mk鍜宖.mk錛岄偅涔堬紝涓嬮潰鐨勮鍙ワ細

    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榪樹細鍦ㄤ笅闈㈢殑鍑犱釜鐩綍涓嬫壘錛?

  1. 濡傛灉make鎵ц鏃訛紝鏈?#8220;-I”鎴?#8220;--include-dir”鍙傛暟錛岄偅涔坢ake灝變細鍦ㄨ繖涓弬鏁版墍鎸囧畾鐨勭洰褰曚笅鍘誨鎵俱?
  2. 濡傛灉鐩綍 /include錛堜竴鑸槸錛?usr/local/bin鎴?usr/include錛夊瓨鍦ㄧ殑璇濓紝make涔熶細鍘繪壘銆?

濡傛灉鏈夋枃浠舵病鏈夋壘鍒扮殑璇濓紝make浼氱敓鎴愪竴鏉¤鍛婁俊鎭紝浣嗕笉浼氶┈涓婂嚭鐜拌嚧鍛介敊璇傚畠浼氱戶緇澆鍏ュ叾瀹冪殑鏂囦歡錛屼竴鏃﹀畬鎴恗akefile鐨勮鍙栵紝make浼氬啀閲嶈瘯榪欎簺娌℃湁鎵懼埌錛屾垨鏄笉鑳借鍙栫殑鏂囦歡錛屽鏋滆繕鏄笉琛岋紝make鎵嶄細鍑虹幇涓鏉¤嚧鍛戒俊鎭傚鏋滀綘鎯寵make涓嶇悊閭d簺鏃犳硶璇誨彇鐨勬枃浠訛紝鑰岀戶緇墽琛岋紝浣犲彲浠ュ湪include鍓嶅姞涓涓噺鍙?#8220;-”銆傚錛?

-include <filename>
鍏惰〃紺猴紝鏃犺include榪囩▼涓嚭鐜頒粈涔堥敊璇紝閮戒笉瑕佹姤閿欑戶緇墽琛屻傚拰鍏跺畠鐗堟湰make鍏煎鐨勭浉鍏沖懡浠ゆ槸sinclude錛屽叾浣滅敤鍜岃繖涓涓槸涓鏍風殑銆?

2.4 鐜鍙橀噺 MAKEFILES

濡傛灉浣犵殑褰撳墠鐜涓畾涔変簡鐜鍙橀噺MAKEFILES錛岄偅涔堬紝make浼氭妸榪欎釜鍙橀噺涓殑鍊煎仛涓涓被浼間簬include鐨勫姩浣溿傝繖涓彉閲忎腑鐨勫兼槸鍏跺畠鐨凪akefile錛岀敤絀烘牸鍒嗛殧銆傚彧鏄紝瀹冨拰include涓嶅悓鐨勬槸錛屼粠榪欎釜鐜鍙樹腑寮曞叆鐨凪akefile鐨?#8220;鐩爣”涓嶄細璧蜂綔鐢紝濡傛灉鐜鍙橀噺涓畾涔夌殑鏂囦歡鍙戠幇閿欒錛宮ake涔熶細涓嶇悊銆?

浣嗘槸鍦ㄨ繖閲屾垜榪樻槸寤鴻涓嶈浣跨敤榪欎釜鐜鍙橀噺錛屽洜涓哄彧瑕佽繖涓彉閲忎竴琚畾涔夛紝閭d箞褰撲綘浣跨敤make鏃訛紝鎵鏈夌殑Makefile閮戒細鍙楀埌瀹冪殑褰卞搷錛岃繖緇濅笉鏄綘鎯崇湅鍒扮殑銆傚湪榪欓噷鎻愯繖涓簨錛屽彧鏄負浜嗗憡璇夊ぇ瀹訛紝涔熻鏈夋椂鍊欎綘鐨凪akefile鍑虹幇浜嗘簨錛岄偅涔堜綘鍙互鐪嬬湅褰撳墠鐜涓湁娌℃湁瀹氫箟榪欎釜鍙橀噺銆?

2.5 make鐨勫伐浣滄柟寮?

GNU鐨刴ake宸ヤ綔鏃剁殑鎵ц姝ラ鍏ヤ笅錛氾紙鎯蟲潵鍏跺畠鐨刴ake涔熸槸綾諱技錛?

  1. 璇誨叆鎵鏈夌殑Makefile銆?
  2. 璇誨叆琚玦nclude鐨勫叾瀹僊akefile銆?
  3. 鍒濆鍖栨枃浠朵腑鐨勫彉閲忋?
  4. 鎺ㄥ闅愭櫐瑙勫垯錛屽茍鍒嗘瀽鎵鏈夎鍒欍?
  5. 涓烘墍鏈夌殑鐩爣鏂囦歡鍒涘緩渚濊禆鍏崇郴閾俱?
  6. 鏍規嵁渚濊禆鍏崇郴錛屽喅瀹氬摢浜涚洰鏍囪閲嶆柊鐢熸垚銆?
  7. 鎵ц鐢熸垚鍛戒護銆?

1-5姝ヤ負絎竴涓樁孌碉紝6-7涓虹浜屼釜闃舵銆傜涓涓樁孌典腑錛屽鏋滃畾涔夌殑鍙橀噺琚嬌鐢ㄤ簡錛岄偅涔堬紝make浼氭妸鍏跺睍寮鍦ㄤ嬌鐢ㄧ殑浣嶇疆銆備絾make騫朵笉浼氬畬鍏ㄩ┈涓婂睍寮錛宮ake浣跨敤鐨勬槸鎷栧歡鎴樻湳錛屽鏋滃彉閲忓嚭鐜板湪渚濊禆鍏崇郴鐨勮鍒欎腑錛岄偅涔堜粎褰撹繖鏉′緷璧栬鍐沖畾瑕佷嬌鐢ㄤ簡錛屽彉閲忔墠浼氬湪鍏跺唴閮ㄥ睍寮銆?

褰撶劧錛岃繖涓伐浣滄柟寮忎綘涓嶄竴瀹氳娓呮錛屼絾鏄煡閬撹繖涓柟寮忎綘涔熶細瀵筸ake鏇翠負鐔熸倝銆傛湁浜嗚繖涓熀紜錛屽悗緇儴鍒嗕篃灝卞鏄撶湅鎳備簡銆?

3 Makefile涔﹀啓瑙勫垯


瑙勫垯鍖呭惈涓や釜閮ㄥ垎錛屼竴涓槸渚濊禆鍏崇郴錛屼竴涓槸鐢熸垚鐩爣鐨勬柟娉曘?

鍦∕akefile涓紝瑙勫垯鐨勯『搴忔槸寰堥噸瑕佺殑錛屽洜涓猴紝Makefile涓彧搴旇鏈変竴涓渶緇堢洰鏍囷紝鍏跺畠鐨勭洰鏍囬兘鏄榪欎釜鐩爣鎵榪炲甫鍑烘潵鐨勶紝鎵浠ヤ竴瀹氳璁﹎ake鐭ラ亾浣犵殑鏈緇堢洰鏍囨槸浠涔堛備竴鑸潵璇達紝瀹氫箟鍦∕akefile涓殑鐩爣鍙兘浼氭湁寰堝錛屼絾鏄涓鏉¤鍒欎腑鐨勭洰鏍囧皢琚‘绔嬩負鏈緇堢殑鐩爣銆傚鏋滅涓鏉¤鍒欎腑鐨勭洰鏍囨湁寰堝涓紝閭d箞錛岀涓涓洰鏍囦細鎴愪負鏈緇堢殑鐩爣銆俶ake鎵瀹屾垚鐨勪篃灝辨槸榪欎釜鐩爣銆?

濂戒簡錛岃繕鏄鎴戜滑鏉ョ湅涓鐪嬪浣曚功鍐欒鍒欍?

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閿紑澶達級銆傝繖涓鍒欏憡璇夋垜浠袱浠朵簨錛?

  1. 鏂囦歡鐨勪緷璧栧叧緋伙紝foo.o渚濊禆浜巉oo.c鍜宒efs.h鐨勬枃浠訛紝濡傛灉foo.c鍜宒efs.h鐨勬枃浠舵棩鏈熻姣攆oo.o鏂囦歡鏃ユ湡瑕佹柊錛屾垨鏄痜oo.o涓嶅瓨鍦紝閭d箞渚濊禆鍏崇郴鍙戠敓銆?
  2. 濡傛灉鐢熸垚錛堟垨鏇存柊錛塮oo.o鏂囦歡銆備篃灝辨槸閭d釜cc鍛戒護錛屽叾璇存槑浜嗭紝濡備綍鐢熸垚foo.o榪欎釜鏂囦歡銆傦紙褰撶劧foo.c鏂囦歡include浜哾efs.h鏂囦歡錛?

3.2 瑙勫垯鐨勮娉?

      targets : prerequisites
command
...
鎴栨槸榪欐牱錛?
      targets : prerequisites ; command
command
...
targets鏄枃浠跺悕錛屼互絀烘牸鍒嗗紑錛屽彲浠ヤ嬌鐢ㄩ氶厤絎︺備竴鑸潵璇達紝鎴戜滑鐨勭洰鏍囧熀鏈笂鏄竴涓枃浠訛紝浣嗕篃鏈夊彲鑳芥槸澶氫釜鏂囦歡銆?

command鏄懡浠よ錛屽鏋滃叾涓嶄笌“target:prerequisites”鍦ㄤ竴琛岋紝閭d箞錛屽繀欏諱互[Tab閿甝寮澶達紝濡傛灉鍜宲rerequisites鍦ㄤ竴琛岋紝閭d箞鍙互鐢ㄥ垎鍙峰仛涓哄垎闅斻傦紙瑙佷笂錛?

prerequisites涔熷氨鏄洰鏍囨墍渚濊禆鐨勬枃浠訛紙鎴栦緷璧栫洰鏍囷級銆傚鏋滃叾涓殑鏌愪釜鏂囦歡瑕佹瘮鐩爣鏂囦歡瑕佹柊錛岄偅涔堬紝鐩爣灝辮璁や負鏄?#8220;榪囨椂鐨?#8221;錛岃璁や負鏄渶瑕侀噸鐢熸垚鐨勩傝繖涓湪鍓嶉潰宸茬粡璁茶繃浜嗐?

濡傛灉鍛戒護澶暱錛屼綘鍙互浣跨敤鍙嶆枩妗嗭紙‘\’錛変綔涓烘崲琛岀銆俶ake瀵逛竴琛屼笂鏈夊灝戜釜瀛楃娌℃湁闄愬埗銆傝鍒欏憡璇塵ake涓や歡浜嬶紝鏂囦歡鐨勪緷璧栧叧緋誨拰濡備綍鎴愭垚鐩爣鏂囦歡銆?

涓鑸潵璇達紝make浼氫互UNIX鐨勬爣鍑哠hell錛屼篃灝辨槸/bin/sh鏉ユ墽琛屽懡浠ゃ?

3.3 鍦ㄨ鍒欎腑浣跨敤閫氶厤絎?

濡傛灉鎴戜滑鎯沖畾涔変竴緋誨垪姣旇緝綾諱技鐨勬枃浠訛紝鎴戜滑寰堣嚜鐒跺湴灝辨兂璧蜂嬌鐢ㄩ氶厤絎︺俶ake鏀寔涓夊悇閫氶厤絎︼細“*”錛?#8220;?”鍜?#8220;[...]”銆傝繖鏄拰Unix鐨凚-Shell鏄浉鍚岀殑銆?

娉㈡氮鍙鳳紙“~”錛夊瓧絎﹀湪鏂囦歡鍚嶄腑涔熸湁姣旇緝鐗規畩鐨勭敤閫斻傚鏋滄槸“~/test”錛岃繖灝辮〃紺哄綋鍓嶇敤鎴風殑$HOME鐩綍涓嬬殑test鐩綍銆傝?#8220;~hchen/test”鍒欒〃紺虹敤鎴穐chen鐨勫涓葷洰褰曚笅鐨則est鐩綍銆傦紙榪欎簺閮芥槸Unix涓嬬殑灝忕煡璇嗕簡錛宮ake涔熸敮鎸侊級鑰屽湪Windows鎴栨槸MS-DOS涓嬶紝鐢ㄦ埛娌℃湁瀹夸富鐩綍錛岄偅涔堟嘗嫻彿鎵鎸囩殑鐩綍鍒欐牴鎹幆澧冨彉閲?#8220;HOME”鑰屽畾銆?

閫氶厤絎︿唬鏇夸簡浣犱竴緋誨垪鐨勬枃浠訛紝濡?#8220;*.c”琛ㄧず鎵浠ュ悗緙涓篶鐨勬枃浠躲備竴涓渶瑕佹垜浠敞鎰忕殑鏄紝濡傛灉鎴戜滑鐨勬枃浠跺悕涓湁閫氶厤絎︼紝濡傦細“*”錛岄偅涔堝彲浠ョ敤杞箟瀛楃“\”錛屽“\*”鏉ヨ〃紺虹湡瀹炵殑“*”瀛楃錛岃屼笉鏄換鎰忛暱搴︾殑瀛楃涓層?

濂藉惂錛岃繕鏄厛鏉ョ湅鍑犱釜渚嬪瓙鍚э細

    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 鏂囦歡鎼滃

鍦ㄤ竴浜涘ぇ鐨勫伐紼嬩腑錛屾湁澶ч噺鐨勬簮鏂囦歡錛屾垜浠氬父鐨勫仛娉曟槸鎶婅繖璁稿鐨勬簮鏂囦歡鍒嗙被錛屽茍瀛樻斁鍦ㄤ笉鍚岀殑鐩綍涓傛墍浠ワ紝褰搈ake闇瑕佸幓鎵懼鏂囦歡鐨勪緷璧栧叧緋繪椂錛屼綘鍙互鍦ㄦ枃浠跺墠鍔犱笂璺緞錛屼絾鏈濂界殑鏂規硶鏄妸涓涓礬寰勫憡璇塵ake錛岃make鍦ㄨ嚜鍔ㄥ幓鎵俱?

Makefile鏂囦歡涓殑鐗規畩鍙橀噺“VPATH”灝辨槸瀹屾垚榪欎釜鍔熻兘鐨勶紝濡傛灉娌℃湁鎸囨槑榪欎釜鍙橀噺錛宮ake鍙細鍦ㄥ綋鍓嶇殑鐩綍涓幓鎵懼渚濊禆鏂囦歡鍜岀洰鏍囨枃浠躲傚鏋滃畾涔変簡榪欎釜鍙橀噺錛岄偅涔堬紝make灝變細鍦ㄥ綋褰撳墠鐩綍鎵句笉鍒扮殑鎯呭喌涓嬶紝鍒版墍鎸囧畾鐨勭洰褰曚腑鍘繪壘瀵繪枃浠朵簡銆?

    VPATH = src:../headers
涓婇潰鐨勭殑瀹氫箟鎸囧畾涓や釜鐩綍錛?#8220;src”鍜?#8220;../headers”錛宮ake浼氭寜鐓ц繖涓『搴忚繘琛屾悳绱€傜洰褰曠敱“鍐掑彿”鍒嗛殧銆傦紙褰撶劧錛屽綋鍓嶇洰褰曟案榪滄槸鏈楂樹紭鍏堟悳绱㈢殑鍦版柟錛?

鍙︿竴涓緗枃浠舵悳绱㈣礬寰勭殑鏂規硶鏄嬌鐢╩ake鐨?#8220;vpath”鍏抽敭瀛楋紙娉ㄦ剰錛屽畠鏄叏灝忓啓鐨勶級錛岃繖涓嶆槸鍙橀噺錛岃繖鏄竴涓猰ake鐨勫叧閿瓧錛岃繖鍜屼笂闈㈡彁鍒扮殑閭d釜VPATH鍙橀噺寰堢被浼鹼紝浣嗘槸瀹冩洿涓虹伒媧匯傚畠鍙互鎸囧畾涓嶅悓鐨勬枃浠跺湪涓嶅悓鐨勬悳绱㈢洰褰曚腑銆傝繖鏄竴涓緢鐏墊椿鐨勫姛鑳姐傚畠鐨勪嬌鐢ㄦ柟娉曟湁涓夌錛?

  1. vpath < pattern> < directories>
    涓虹鍚堟ā寮?lt; pattern>鐨勬枃浠舵寚瀹氭悳绱㈢洰褰?lt; directories>銆?
  2. vpath < pattern>
    娓呴櫎絎﹀悎妯″紡< pattern>鐨勬枃浠剁殑鎼滅儲鐩綍銆?
  3. vpath
    娓呴櫎鎵鏈夊凡琚緗ソ浜嗙殑鏂囦歡鎼滅儲鐩綍銆?

vapth浣跨敤鏂規硶涓殑< pattern>闇瑕佸寘鍚?#8220;%”瀛楃銆?#8220;%”鐨勬剰鎬濇槸鍖歸厤闆舵垨鑻ュ共瀛楃錛屼緥濡傦紝“%.h”琛ㄧず鎵鏈変互“.h”緇撳熬鐨勬枃浠躲?lt; pattern>鎸囧畾浜嗚鎼滅儲鐨勬枃浠墮泦錛岃?lt; directories>鍒欐寚瀹氫簡 鐨勬枃浠墮泦鐨勬悳绱㈢殑鐩綍銆備緥濡傦細

    vpath %.h ../headers
璇ヨ鍙ヨ〃紺猴紝瑕佹眰make鍦?#8220;../headers”鐩綍涓嬫悳绱㈡墍鏈変互“.h”緇撳熬鐨勬枃浠躲傦紙濡傛灉鏌愭枃浠跺湪褰撳墠鐩綍娌℃湁鎵懼埌鐨勮瘽錛?

鎴戜滑鍙互榪炵畫鍦頒嬌鐢╲path璇彞錛屼互鎸囧畾涓嶅悓鎼滅儲絳栫暐銆傚鏋滆繛緇殑vpath璇彞涓嚭鐜頒簡鐩稿悓鐨?lt; pattern>錛屾垨鏄閲嶅浜嗙殑< pattern>錛岄偅涔堬紝make浼氭寜鐓path璇彞鐨勫厛鍚庨『搴忔潵鎵ц鎼滅儲銆傚錛?

    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 浼洰鏍?

鏈鏃╁厛鐨勪竴涓緥瀛愪腑錛屾垜浠彁鍒拌繃涓涓?#8220;clean”鐨勭洰鏍囷紝榪欐槸涓涓?#8220;浼洰鏍?#8221;錛?

    clean:
rm *.o temp
姝e儚鎴戜滑鍓嶉潰渚嬪瓙涓殑“clean”涓鏍鳳紝鍗崇劧鎴戜滑鐢熸垚浜嗚澶氭枃浠剁紪璇戞枃浠訛紝鎴戜滑涔熷簲璇ユ彁渚涗竴涓竻闄ゅ畠浠殑“鐩爣”浠ュ瀹屾暣鍦伴噸緙栬瘧鑰岀敤銆?錛堜互“make clean”鏉ヤ嬌鐢ㄨ鐩爣錛?

鍥犱負錛屾垜浠茍涓嶇敓鎴?#8220;clean”榪欎釜鏂囦歡銆?#8220;浼洰鏍?#8221;騫朵笉鏄竴涓枃浠訛紝鍙槸涓涓爣絳撅紝鐢變簬“浼洰鏍?#8221;涓嶆槸鏂囦歡錛屾墍浠ake鏃犳硶鐢熸垚瀹冪殑渚濊禆鍏崇郴鍜屽喅瀹氬畠鏄惁瑕佹墽琛屻傛垜浠彧鏈夐氳繃鏄劇ず鍦版寚鏄庤繖涓?#8220;鐩爣”鎵嶈兘璁╁叾鐢熸晥銆傚綋鐒訛紝“浼洰鏍?#8221;鐨勫彇鍚嶄笉鑳藉拰鏂囦歡鍚嶉噸鍚嶏紝涓嶇劧鍏跺氨澶卞幓浜?#8220;浼洰鏍?#8221;鐨勬剰涔変簡銆?

褰撶劧錛屼負浜嗛伩鍏嶅拰鏂囦歡閲嶅悕鐨勮繖縐嶆儏鍐碉紝鎴戜滑鍙互浣跨敤涓涓壒孌婄殑鏍囪“.PHONY”鏉ユ樉紺哄湴鎸囨槑涓涓洰鏍囨槸“浼洰鏍?#8221;錛屽悜make璇存槑錛屼笉綆℃槸鍚︽湁榪欎釜鏂囦歡錛岃繖涓洰鏍囧氨鏄?#8220;浼洰鏍?#8221;銆?

    .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 澶氱洰鏍?

Makefile鐨勮鍒欎腑鐨勭洰鏍囧彲浠ヤ笉姝竴涓紝鍏舵敮鎸佸鐩爣錛屾湁鍙兘鎴戜滑鐨勫涓洰鏍囧悓鏃朵緷璧栦簬涓涓枃浠訛紝騫朵笖鍏剁敓鎴愮殑鍛戒護澶т綋綾諱技銆備簬鏄垜浠氨鑳芥妸鍏跺悎騫惰搗鏉ャ傚綋鐒訛紝澶氫釜鐩爣鐨勭敓鎴愯鍒欑殑鎵ц鍛戒護鏄悓涓涓紝榪欏彲鑳戒細鍙垜浠甫鏉ラ夯鐑︼紝涓嶈繃濂藉湪鎴戜滑鐨勫彲浠ヤ嬌鐢ㄤ竴涓嚜鍔ㄥ寲鍙橀噺“$@”錛堝叧浜庤嚜鍔ㄥ寲鍙橀噺錛屽皢鍦ㄥ悗闈㈣榪幫級錛岃繖涓彉閲忚〃紺虹潃鐩墠瑙勫垯涓墍鏈夌殑鐩爣鐨勯泦鍚堬紝榪欐牱璇村彲鑳藉緢鎶借薄錛岃繕鏄湅涓涓緥瀛愬惂銆?

    bigoutput littleoutput : text.g
generate text.g -$(subst output,,$@) > $@
    涓婅堪瑙勫垯絳変環浜庯細
bigoutput : text.g generate text.g -big > bigoutput littleoutput : text.g generate text.g -little > littleoutput
鍏朵腑錛?$(subst output,,$@)涓殑“$”琛ㄧず鎵ц涓涓狹akefile鐨勫嚱鏁幫紝鍑芥暟鍚嶄負subst錛屽悗闈㈢殑涓哄弬鏁般傚叧浜庡嚱鏁幫紝灝嗗湪鍚庨潰璁茶堪銆傝繖閲岀殑榪欎釜鍑芥暟鏄埅鍙栧瓧絎︿覆鐨勬剰鎬濓紝“$@”琛ㄧず鐩爣鐨勯泦鍚堬紝灝卞儚涓涓暟緇勶紝“$@”渚濇鍙栧嚭鐩爣錛屽茍鎵т簬鍛戒護銆?

3.7 闈欐佹ā寮?

闈欐佹ā寮忓彲浠ユ洿鍔犲鏄撳湴瀹氫箟澶氱洰鏍囩殑瑙勫垯錛屽彲浠ヨ鎴戜滑鐨勮鍒欏彉寰楁洿鍔犵殑鏈夊脊鎬у拰鐏墊椿銆傛垜浠繕鏄厛鏉ョ湅涓涓嬭娉曪細

<targets ...>: <target-pattern>: <prereq-patterns ...>
銆銆銆<commands>
...

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;%”瀛楃銆?

鐪嬩竴涓緥瀛愶細

    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 $<

$(filter %.o,$(files))琛ㄧず璋冪敤Makefile鐨刦ilter鍑芥暟錛岃繃婊?#8220;$filter”闆嗭紝鍙鍏朵腑妯″紡涓?#8220;%.o”鐨勫唴瀹廣傚叾鐨勫畠鍐呭錛屾垜灝變笉鐢ㄥ璇翠簡鍚с傝繖涓緥瀛楀睍紺轟簡Makefile涓洿澶х殑寮規с?

3.8 鑷姩鐢熸垚渚濊禆鎬?

鍦∕akefile涓紝鎴戜滑鐨勪緷璧栧叧緋誨彲鑳戒細闇瑕佸寘鍚竴緋誨垪鐨勫ご鏂囦歡錛屾瘮濡傦紝濡傛灉鎴戜滑鐨刴ain.c涓湁涓鍙?#8220;#include "defs.h"”錛岄偅涔堟垜浠殑渚濊禆鍏崇郴搴旇鏄細

    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”鍙傛暟浼氭妸涓浜涙爣鍑嗗簱鐨勫ご鏂囦歡涔熷寘鍚繘鏉ャ?

gcc -M main.c鐨勮緭鍑烘槸錛?

    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]鏂囦歡鐨勪緷璧栧叧緋匯?

浜庢槸錛屾垜浠彲浠ュ啓鍑篬.c]鏂囦歡鍜孾.d]鏂囦歡鐨勪緷璧栧叧緋伙紝騫惰make鑷姩鏇存柊鎴栬嚜鎴怺.d]鏂囦歡錛屽茍鎶婂叾鍖呭惈鍦ㄦ垜浠殑涓籑akefile涓紝榪欐牱錛屾垜浠氨鍙互鑷姩鍖栧湴鐢熸垚姣忎釜鏂囦歡鐨勪緷璧栧叧緋諱簡銆?

榪欓噷錛屾垜浠粰鍑轟簡涓涓ā寮忚鍒欐潵浜х敓[.d]鏂囦歡錛?

    %.d: %.c
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$

榪欎釜瑙勫垯鐨勬剰鎬濇槸錛屾墍鏈夌殑[.d]鏂囦歡渚濊禆浜嶽.c]鏂囦歡錛?#8220;rm -f $@”鐨勬剰鎬濇槸鍒犻櫎鎵鏈夌殑鐩爣錛屼篃灝辨槸[.d]鏂囦歡錛岀浜岃鐨勬剰鎬濇槸錛屼負姣忎釜渚濊禆鏂囦歡“$<”錛屼篃灝辨槸[.c]鏂囦歡鐢熸垚渚濊禆鏂囦歡錛?#8220;$@”琛ㄧず妯″紡“%.d”鏂囦歡錛屽鏋滄湁涓涓狢鏂囦歡鏄痭ame.c錛岄偅涔?#8220;%”灝辨槸“name”錛?#8220;$$$$”鎰忎負涓涓殢鏈虹紪鍙鳳紝絎簩琛岀敓鎴愮殑鏂囦歡鏈夊彲鑳芥槸“name.d.12345”錛岀涓夎浣跨敤sed鍛戒護鍋氫簡涓涓浛鎹紝鍏充簬sed鍛戒護鐨勭敤娉曡鍙傜湅鐩稿叧鐨勪嬌鐢ㄦ枃妗c傜鍥涜灝辨槸鍒犻櫎涓存椂鏂囦歡銆?

鎬昏岃█涔嬶紝榪欎釜妯″紡瑕佸仛鐨勪簨灝辨槸鍦ㄧ紪璇戝櫒鐢熸垚鐨勪緷璧栧叧緋諱腑鍔犲叆[.d]鏂囦歡鐨勪緷璧栵紝鍗蟲妸渚濊禆鍏崇郴錛?

    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鏄寜嬈℃潵杞藉叆鏂囦歡錛屾渶鍏堣澆鍏ョ殑[.d]鏂囦歡涓殑鐩爣浼氭垚涓洪粯璁ょ洰鏍?

4 Makefile 涔﹀啓鍛戒護


姣忔潯瑙勫垯涓殑鍛戒護鍜屾搷浣滅郴緇烻hell鐨勫懡浠よ鏄竴鑷寸殑銆俶ake浼氫竴鎸夐『搴忎竴鏉′竴鏉$殑鎵ц鍛戒護錛屾瘡鏉″懡浠ょ殑寮澶村繀欏諱互[Tab]閿紑澶達紝闄ら潪錛屽懡浠ゆ槸绱ц窡鍦ㄤ緷璧栬鍒欏悗闈㈢殑鍒嗗彿鍚庣殑銆傚湪鍛戒護琛屼箣闂翠腑鐨勭┖鏍兼垨鏄┖琛屼細琚拷鐣ワ紝浣嗘槸濡傛灉璇ョ┖鏍兼垨絀鴻鏄互Tab閿紑澶寸殑錛岄偅涔坢ake浼氳涓哄叾鏄竴涓┖鍛戒護銆?

鎴戜滑鍦║NIX涓嬪彲鑳戒細浣跨敤涓嶅悓鐨凷hell錛屼絾鏄痬ake鐨勫懡浠ら粯璁ゆ槸琚?#8220;/bin/sh”鈥斺擴NIX鐨勬爣鍑哠hell瑙i噴鎵ц鐨勩傞櫎闈炰綘鐗瑰埆鎸囧畾涓涓叾瀹冪殑Shell銆侻akefile涓紝“#”鏄敞閲婄錛屽緢鍍廋/C++涓殑“//”錛屽叾鍚庣殑鏈瀛楃閮借娉ㄩ噴銆?

4.1 鏄劇ず鍛戒護

閫氬父錛宮ake浼氭妸鍏惰鎵ц鐨勫懡浠よ鍦ㄥ懡浠ゆ墽琛屽墠杈撳嚭鍒板睆騫曚笂銆傚綋鎴戜滑鐢?#8220;@”瀛楃鍦ㄥ懡浠よ鍓嶏紝閭d箞錛岃繖涓懡浠ゅ皢涓嶈make鏄劇ず鍑烘潵錛屾渶鍏蜂唬琛ㄦх殑渚嬪瓙鏄紝鎴戜滑鐢ㄨ繖涓姛鑳芥潵鍍忓睆騫曟樉紺轟竴浜涗俊鎭傚錛?

    @echo 姝e湪緙栬瘧XXX妯″潡......
褰搈ake鎵ц鏃訛紝浼氳緭鍑?#8220;姝e湪緙栬瘧XXX妯″潡......”瀛椾覆錛屼絾涓嶄細杈撳嚭鍛戒護錛屽鏋滄病鏈?#8220;@”錛岄偅涔堬紝make灝嗚緭鍑猴細
    echo 姝e湪緙栬瘧XXX妯″潡......
姝e湪緙栬瘧XXX妯″潡......
濡傛灉make鎵ц鏃訛紝甯﹀叆make鍙傛暟“-n”鎴?#8220;--just-print”錛岄偅涔堝叾鍙槸鏄劇ず鍛戒護錛屼絾涓嶄細鎵ц鍛戒護錛岃繖涓姛鑳藉緢鏈夊埄浜庢垜浠皟璇曟垜浠殑Makefile錛岀湅鐪嬫垜浠功鍐欑殑鍛戒護鏄墽琛岃搗鏉ユ槸浠涔堟牱瀛愮殑鎴栨槸浠涔堥『搴忕殑銆?

鑰宮ake鍙傛暟“-s”鎴?#8220;--slient”鍒欐槸鍏ㄩ潰紱佹鍛戒護鐨勬樉紺恒?

4.2 鍛戒護鎵ц

褰撲緷璧栫洰鏍囨柊浜庣洰鏍囨椂錛屼篃灝辨槸褰撹鍒欑殑鐩爣闇瑕佽鏇存柊鏃訛紝make浼氫竴鏉′竴鏉$殑鎵ц鍏跺悗鐨勫懡浠ゃ傞渶瑕佹敞鎰忕殑鏄紝濡傛灉浣犺璁╀笂涓鏉″懡浠ょ殑緇撴灉搴旂敤鍦ㄤ笅涓鏉″懡浠ゆ椂錛屼綘搴旇浣跨敤鍒嗗彿鍒嗛殧榪欎袱鏉″懡浠ゃ傛瘮濡備綘鐨勭涓鏉″懡浠ゆ槸cd鍛戒護錛屼綘甯屾湜絎簩鏉″懡浠ゅ緱鍦╟d涔嬪悗鐨勫熀紜涓婅繍琛岋紝閭d箞浣犲氨涓嶈兘鎶婅繖涓ゆ潯鍛戒護鍐欏湪涓よ涓婏紝鑰屽簲璇ユ妸榪欎袱鏉″懡浠ゅ啓鍦ㄤ竴琛屼笂錛岀敤鍒嗗彿鍒嗛殧銆傚錛?

    紺轟緥涓錛?
exec:
cd /home/hchen
pwd
紺轟緥浜岋細
exec:
cd /home/hchen; pwd

褰撴垜浠墽琛?#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”絳夊悗緙銆?

4.3 鍛戒護鍑洪敊

姣忓綋鍛戒護榪愯瀹屽悗錛宮ake浼氭嫻嬫瘡涓懡浠ょ殑榪斿洖鐮侊紝濡傛灉鍛戒護榪斿洖鎴愬姛錛岄偅涔坢ake浼氭墽琛屼笅涓鏉″懡浠わ紝褰撹鍒欎腑鎵鏈夌殑鍛戒護鎴愬姛榪斿洖鍚庯紝榪欎釜瑙勫垯灝辯畻鏄垚鍔熷畬鎴愪簡銆傚鏋滀竴涓鍒欎腑鐨勬煇涓懡浠ゅ嚭閿欎簡錛堝懡浠ら鍑虹爜闈為浂錛夛紝閭d箞make灝變細緇堟鎵ц褰撳墠瑙勫垯錛岃繖灝嗘湁鍙兘緇堟鎵鏈夎鍒欑殑鎵ц銆?

鏈変簺鏃跺欙紝鍛戒護鐨勫嚭閿欏茍涓嶈〃紺哄氨鏄敊璇殑銆備緥濡俶kdir鍛戒護錛屾垜浠竴瀹氶渶瑕佸緩绔嬩竴涓洰褰曪紝濡傛灉鐩綍涓嶅瓨鍦紝閭d箞mkdir灝辨垚鍔熸墽琛岋紝涓囦簨澶у悏錛屽鏋滅洰褰曞瓨鍦紝閭d箞灝卞嚭閿欎簡銆傛垜浠箣鎵浠ヤ嬌鐢╩kdir鐨勬剰鎬濆氨鏄竴瀹氳鏈夎繖鏍風殑涓涓洰褰曪紝浜庢槸鎴戜滑灝變笉甯屾湜mkdir鍑洪敊鑰岀粓姝㈣鍒欑殑榪愯銆?

涓轟簡鍋氬埌榪欎竴鐐癸紝蹇界暐鍛戒護鐨勫嚭閿欙紝鎴戜滑鍙互鍦∕akefile鐨勫懡浠よ鍓嶅姞涓涓噺鍙?#8220;-”錛堝湪Tab閿箣鍚庯級錛屾爣璁頒負涓嶇鍛戒護鍑轟笉鍑洪敊閮借涓烘槸鎴愬姛鐨勩傚錛?

   clean:
-rm -f *.o
榪樻湁涓涓叏灞鐨勫姙娉曟槸錛岀粰make鍔犱笂“-i”鎴栨槸“--ignore-errors”鍙傛暟錛岄偅涔堬紝Makefile涓墍鏈夊懡浠ら兘浼氬拷鐣ラ敊璇傝屽鏋滀竴涓鍒欐槸浠?#8220;.IGNORE”浣滀負鐩爣鐨勶紝閭d箞榪欎釜瑙勫垯涓殑鎵鏈夊懡浠ゅ皢浼氬拷鐣ラ敊璇傝繖浜涙槸涓嶅悓綰у埆鐨勯槻姝㈠懡浠ゅ嚭閿欑殑鏂規硶錛屼綘鍙互鏍規嵁浣犵殑涓嶅悓鍠滄璁劇疆銆?

榪樻湁涓涓鎻愪竴涓嬬殑make鐨勫弬鏁扮殑鏄?#8220;-k”鎴栨槸“--keep-going”錛岃繖涓弬鏁扮殑鎰忔濇槸錛屽鏋滄煇瑙勫垯涓殑鍛戒護鍑洪敊浜嗭紝閭d箞灝辯粓鐩瑙勫垯鐨勬墽琛岋紝浣嗙戶緇墽琛屽叾瀹冭鍒欍?

4.4 宓屽鎵цmake

鍦ㄤ竴浜涘ぇ鐨勫伐紼嬩腑錛屾垜浠細鎶婃垜浠笉鍚屾ā鍧楁垨鏄笉鍚屽姛鑳界殑婧愭枃浠舵斁鍦ㄤ笉鍚岀殑鐩綍涓紝鎴戜滑鍙互鍦ㄦ瘡涓洰褰曚腑閮戒功鍐欎竴涓鐩綍鐨凪akefile錛岃繖鏈夊埄浜庤鎴戜滑鐨凪akefile鍙樺緱鏇村姞鍦扮畝媧侊紝鑰屼笉鑷充簬鎶婃墍鏈夌殑涓滆タ鍏ㄩ儴鍐欏湪涓涓狹akefile涓紝榪欐牱浼氬緢闅劇淮鎶ゆ垜浠殑Makefile錛岃繖涓妧鏈浜庢垜浠ā鍧楃紪璇戝拰鍒嗘緙栬瘧鏈夌潃闈炲父澶х殑濂藉銆?

渚嬪錛屾垜浠湁涓涓瓙鐩綍鍙玸ubdir錛岃繖涓洰褰曚笅鏈変釜Makefile鏂囦歡錛屾潵鎸囨槑浜嗚繖涓洰褰曚笅鏂囦歡鐨勭紪璇戣鍒欍傞偅涔堟垜浠繪帶鐨凪akefile鍙互榪欐牱涔﹀啓錛?

    subsystem:
cd subdir && $(MAKE)
鍏剁瓑浠蜂簬錛?
subsystem:
$(MAKE) -C subdir
瀹氫箟$(MAKE)瀹忓彉閲忕殑鎰忔濇槸錛屼篃璁告垜浠殑make闇瑕佷竴浜涘弬鏁幫紝鎵浠ュ畾涔夋垚涓涓彉閲忔瘮杈冨埄浜庣淮鎶ゃ傝繖涓や釜渚嬪瓙鐨勬剰鎬濋兘鏄厛榪涘叆“subdir”鐩綍錛岀劧鍚庢墽琛宮ake鍛戒護銆?

鎴戜滑鎶婅繖涓狹akefile鍙仛“鎬繪帶Makefile”錛屾繪帶Makefile鐨勫彉閲忓彲浠ヤ紶閫掑埌涓嬬駭鐨凪akefile涓紙濡傛灉浣犳樉紺虹殑澹版槑錛夛紝浣嗘槸涓嶄細瑕嗙洊涓嬪眰鐨凪akefile涓墍瀹氫箟鐨勫彉閲忥紝闄ら潪鎸囧畾浜?#8220;-e”鍙傛暟銆?

濡傛灉浣犺浼犻掑彉閲忓埌涓嬬駭Makefile涓紝閭d箞浣犲彲浠ヤ嬌鐢ㄨ繖鏍風殑澹版槑錛?

export <variable ...>
濡傛灉浣犱笉鎯寵鏌愪簺鍙橀噺浼犻掑埌涓嬬駭Makefile涓紝閭d箞浣犲彲浠ヨ繖鏍峰0鏄庯細
unexport <variable ...>
濡傦細
紺轟緥涓錛?
export variable = value
鍏剁瓑浠蜂簬錛?
variable = value
export variable
鍏剁瓑浠蜂簬錛?
export variable := value
鍏剁瓑浠蜂簬錛?
variable := value
export variable
紺轟緥浜岋細
export variable += value
鍏剁瓑浠蜂簬錛?
variable += value
export variable
濡傛灉浣犺浼犻掓墍鏈夌殑鍙橀噺錛岄偅涔堬紝鍙涓涓猠xport灝辮浜嗐傚悗闈粈涔堜篃涓嶇敤璺燂紝琛ㄧず浼犻掓墍鏈夌殑鍙橀噺銆?

闇瑕佹敞鎰忕殑鏄紝鏈変袱涓彉閲忥紝涓涓槸SHELL錛屼竴涓槸MAKEFLAGS錛岃繖涓や釜鍙橀噺涓嶇浣犳槸鍚xport錛屽叾鎬繪槸瑕佷紶閫掑埌涓嬪眰Makefile涓紝鐗瑰埆鏄疢AKEFILES鍙橀噺錛屽叾涓寘鍚簡make鐨勫弬鏁頒俊鎭紝濡傛灉鎴戜滑鎵ц“鎬繪帶Makefile”鏃舵湁make鍙傛暟鎴栨槸鍦ㄤ笂灞侻akefile涓畾涔変簡榪欎釜鍙橀噺錛岄偅涔圡AKEFILES鍙橀噺灝嗕細鏄繖浜涘弬鏁幫紝騫朵細浼犻掑埌涓嬪眰Makefile涓紝榪欐槸涓涓郴緇熺駭鐨勭幆澧冨彉閲忋?

浣嗘槸make鍛戒護涓殑鏈夊嚑涓弬鏁板茍涓嶅線涓嬩紶閫掞紝瀹冧滑鏄?#8220;-C”,“-f”,“-h”“-o”鍜?#8220;-W”錛堟湁鍏矼akefile鍙傛暟鐨勭粏鑺傚皢鍦ㄥ悗闈㈣鏄庯級錛屽鏋滀綘涓嶆兂寰涓嬪眰浼犻掑弬鏁幫紝閭d箞錛屼綘鍙互榪欐牱鏉ワ細

subsystem:
cd subdir && $(MAKE) MAKEFLAGS=
濡傛灉浣犲畾涔変簡鐜鍙橀噺MAKEFLAGS錛岄偅涔堜綘寰楃‘淇″叾涓殑閫夐」鏄ぇ瀹墮兘浼氱敤鍒扮殑錛屽鏋滃叾涓湁“-t”,“-n”,鍜?#8220;-q”鍙傛暟錛岄偅涔堝皢浼氭湁璁╀綘鎰忔兂涓嶅埌鐨勭粨鏋滐紝鎴栬浼氳浣犲紓甯稿湴鎭愭厡銆?

榪樻湁涓涓湪“宓屽鎵ц”涓瘮杈冩湁鐢ㄧ殑鍙傛暟錛?#8220;-w”鎴栨槸“--print-directory”浼氬湪make鐨勮繃紼嬩腑杈撳嚭涓浜涗俊鎭紝璁╀綘鐪嬪埌鐩墠鐨勫伐浣滅洰褰曘傛瘮濡傦紝濡傛灉鎴戜滑鐨勪笅綰ake鐩綍鏄?#8220;/home/hchen/gnu/make”錛屽鏋滄垜浠嬌鐢?#8220;make -w”鏉ユ墽琛岋紝閭d箞褰撹繘鍏ヨ鐩綍鏃訛紝鎴戜滑浼氱湅鍒幫細

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 瀹氫箟鍛戒護鍖?

濡傛灉Makefile涓嚭鐜頒竴浜涚浉鍚屽懡浠ゅ簭鍒楋紝閭d箞鎴戜滑鍙互涓鴻繖浜涚浉鍚岀殑鍛戒護搴忓垪瀹氫箟涓涓彉閲忋傚畾涔夎繖縐嶅懡浠ゅ簭鍒楃殑璇硶浠?#8220;define”寮濮嬶紝浠?#8220;endef”緇撴潫錛屽錛?

    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鍦ㄦ墽琛屽懡浠ゅ寘鏃訛紝鍛戒護鍖呬腑鐨勬瘡涓懡浠や細琚緷嬈$嫭绔嬫墽琛屻?

pear_li 2009-06-01 09:35 鍙戣〃璇勮
]]>
C++鏍煎紡鍖栬緭鍑鴻緭鍏?錛坰tream錛?/title><link>http://www.shnenglu.com/dawnbreak/articles/85932.html</link><dc:creator>pear_li</dc:creator><author>pear_li</author><pubDate>Wed, 27 May 2009 09:53:00 GMT</pubDate><guid>http://www.shnenglu.com/dawnbreak/articles/85932.html</guid><wfw:comment>http://www.shnenglu.com/dawnbreak/comments/85932.html</wfw:comment><comments>http://www.shnenglu.com/dawnbreak/articles/85932.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dawnbreak/comments/commentRss/85932.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dawnbreak/services/trackbacks/85932.html</trackback:ping><description><![CDATA[<h4><font color=#ff0000>鏈枃鎽樿嚜C++primer絎洓鐗堥檮褰旳3</font></h4> <h4>A.3.3. 鎺у埗杈撳嚭鏍煎紡</h4> <p>璁稿鎿嶇旱絎︿嬌鎴戜滑鑳藉鏀瑰彉杈撳嚭鐨勫瑙傘傛湁涓ゅぇ綾葷殑杈撳嚭鎺у埗錛氭帶鍒舵暟鍊肩殑琛ㄧず錛屼互鍙婃帶鍒跺~鍏呯鐨勬暟閲忓拰甯冨眬銆?/p> <h5>鎺у埗甯冨皵鍊煎拰鏍煎紡</h5> <p>鏀瑰彉瀵硅薄鏍煎紡鍖栫姸鎬佺殑鎿嶇旱絎︾殑涓涓緥瀛愭槸 <tt><font face=NSimsun>boolalpha</font></tt> 鎿嶇旱絎︺傞粯璁ゆ儏鍐典笅錛屽皢 <tt><font face=NSimsun>bool</font></tt> 鍊兼樉紺轟負 1 鎴?0錛?tt><font face=NSimsun>true</font></tt> 鍊兼樉紺轟負 1錛岃?<tt><font face=NSimsun>false</font></tt> 鍊兼樉紺轟負 0銆傚彲浠ラ氳繃嫻佺殑 <tt><font face=NSimsun>boolalpha</font></tt> 鎿嶇旱絎﹁鐩栬繖涓牸寮忓寲錛?/p> <pre>cout << "default bool values: "<br> << true << " " << false<br> << "\nalpha bool values: "<br> << boolalpha<br> << true << " " << false<br> << endl;</pre> <p>鎵ц鏃訛紝榪欐紼嬪簭浜х敓涓嬮潰鐨勮緭鍑猴細</p> <pre><span>default bool values: 1 0</span><br> <span>alpha bool values: true false</span></pre> <p>涓鏃﹀皢 <tt><font face=NSimsun>boolalpha</font></tt> “鍐?#8221;鑷?<tt><font face=NSimsun>cout</font></tt>錛屼粠榪欎釜鐐硅搗灝辨敼鍙樹簡 <tt><font face=NSimsun>cout</font></tt> 灝嗘庢牱鏄劇ず <tt><font face=NSimsun>bool</font></tt> 鍊鹼紝鍚庣畫鏄劇ず <tt><font face=NSimsun>bool</font></tt> 鍊肩殑鎿嶄綔灝嗙敤 <tt><font face=NSimsun>true</font></tt> 鎴?<tt><font face=NSimsun>false</font></tt> 榪涜鏄劇ず銆?/p> <a></a><a></a><a></a><a></a><a></a><a></a><a></a><a></a><a></a><a></a><a></a><a></a><a></a><a></a><a></a> <p>瑕佸彇娑?<tt><font face=NSimsun>cout</font></tt> 鐨勬牸寮忕姸鎬佹敼鍙橈紝蹇呴』搴旂敤 <tt><font face=NSimsun>noboolalpha</font></tt>錛?/p> <pre>bool bool_val;<br>cout << boolalpha // <span>sets internal state of</span> <span>cout</span><br> << bool_val<br> << noboolalpha; // <span>resets internal state to default formatting</span></pre> <p>鐜板湪鍙敼鍙?<tt><font face=NSimsun>bool</font></tt> 鍊肩殑鏍煎紡鍖栨潵鏄劇ず <tt><font face=NSimsun>bool_val</font></tt>錛屽茍涓旂珛鍗沖皢嫻侀噸緗負鍘熸潵鐨勭姸鎬併?/p> <h5>鎸囧畾鏁村瀷鍊肩殑鍩烘暟</h5> <p>榛樿鎯呭喌涓嬶紝鐢ㄥ崄榪涘埗璇誨啓鏁村瀷鍊箋傞氳繃浣跨敤鎿嶇旱絎?<tt><font face=NSimsun>hex</font></tt>銆?tt><font face=NSimsun>oct</font></tt> 鍜?<tt><font face=NSimsun>dec</font></tt>錛岀▼搴忓憳鍙互灝嗚〃紺鴻繘鍒舵敼涓哄叓榪涘埗銆佸崄鍏繘鍒舵垨鎭㈠鍗佽繘鍒訛紙嫻偣鍊肩殑琛ㄧず涓嶅彈褰卞搷錛夛細</p> <pre>const int ival = 15, jval = 1024; // <span>const,</span> <span>so values never change</span><br> cout << "default: ival = " << ival<br> << " jval = " << jval << endl;<br> cout << "printed in octal: ival = " << oct << ival<br> << " jval = " << jval << endl;<br> cout << "printed in hexadecimal: ival = " << hex << ival<br> << " jval = " << jval << endl;<br> cout << "printed in decimal: ival = " << dec << ival<br> << " jval = " << jval << endl;</pre> <p>緙栬瘧鍜屾墽琛岀殑鏃跺欙紝紼嬪簭浜х敓涓嬮潰鐨勮緭鍑猴細</p> <pre><span>default: ival = 15 jval = 1024</span><br> <span>printed in octal: ival = 17 jval = 2000</span><br> <span>printed in hexadecimal: ival = f jval = 400</span><br> <span>printed in decimal: ival = 15 jval = 1024</span></pre> <p>娉ㄦ剰錛屽儚 <tt><font face=NSimsun>boolalpha</font></tt> 涓鏍鳳紝榪欎簺鎿嶇旱絎︽敼鍙樻牸寮忕姸鎬併傚畠浠獎鍝嶇揣鎺ュ湪鍚庨潰鐨勮緭鍑猴紝浠ュ強鎵鏈夊悗緇殑鏁村瀷杈撳嚭錛岀洿鍒伴氳繃璋冪敤鍙︿竴鎿嶇旱絎﹂噸鍥存牸寮忎負姝€?/p> <a></a> <h5>鎸囧嚭杈撳嚭鐨勫熀鏁?/h5> <p>榛樿鎯呭喌涓嬶紝鏄劇ず鏁板肩殑鏃跺欙紝涓嶅瓨鍦ㄥ叧浜庢墍鐢ㄥ熀鏁扮殑鍙璁板彿銆備緥濡傦紝20 鏄?20,榪樻槸 16 鐨勫叓榪涘埗琛ㄧず錛熸寜鍗佽繘鍒舵ā寮忔樉紺烘暟鍊肩殑鏃跺欙紝浼氭寜鎴戜滑鏈熷緟鐨勬牸寮忔墦鍗版暟鍊箋傚鏋滈渶瑕佹墦鍗板叓榪涘埗鎴栧崄鍏繘鍒跺鹼紝鍙兘搴旇涔熶嬌鐢?<tt><font face=NSimsun>showbase</font></tt> 鎿嶇旱絎︺?tt><font face=NSimsun>showbase</font></tt> 鎿嶇旱絎﹀鑷磋緭鍑烘祦浣跨敤鐨勭害瀹氾紝涓庢寚瀹氭暣鍨嬪父閲忓熀鏁版墍鐢ㄧ殑鐩稿悓錛?/p> <ul> <li> <p>浠?0x 涓哄墠瀵艱〃紺哄崄鍏繘鍒躲?/p> <li> <p>浠?0 涓哄墠瀵艱〃紺哄叓榪涘埗銆?/p> <li> <p>娌℃湁浠諱綍鍓嶅琛ㄧず鍗佽繘鍒躲?/p> </li> </ul> <p>淇敼紼嬪簭浣跨敤 <tt><font face=NSimsun>showbase</font></tt> 濡備笅錛?/p> <pre>const int ival = 15, jval = 1024; // <span>const</span> <span>so values never change</span><br> cout << showbase; // <span>show base when printing integral values</span><br> cout << "default: ival = " << ival<br> << " jval = " << jval << endl;<br> cout << "printed in octal: ival = " << oct << ival<br> << " jval = " << jval << endl;<br> cout << "printed in hexadecimal: ival = " << hex << ival<br> << " jval = " << jval << endl;<br> cout << "printed in decimal: ival = " << dec << ival<br> << " jval = " << jval << endl;<br> cout << noshowbase; // <span>reset state of the stream</span></pre> <p>淇敼鍚庣殑杈撳嚭浣垮緱鍩虹鍊煎埌搴曟槸浠涔堝緢娓呮錛?/p> <pre><span>default: ival = 15 jval = 1024</span><br> <span>printed in octal: ival = 017 jval = 02000</span><br> <span>printed in hexadecimal: ival = 0xf jval = 0x400</span><br> <span>printed in decimal: ival = 15 jval = 1024</span></pre> <p><tt><font face=NSimsun>noshowbase</font></tt> 鎿嶇旱絎﹂噸緗?<tt><font face=NSimsun>cout</font></tt>錛屼互渚垮畠涓嶅啀鏄劇ず鏁村瀷鍊肩殑琛ㄧず鍩烘暟銆?/p> <p>榛樿鎯呭喌涓嬶紝鍗佸叚榪涘埗鍊肩敤甯﹀皬鍐?<tt><font face=NSimsun>x</font></tt> 鐨勫皬鍐欏艦寮忔墦鍗般傚彲浠ュ簲鐢?<tt><font face=NSimsun>uppercase</font></tt> 鎿嶇旱絎︽樉紺?<tt><font face=NSimsun>X</font></tt> 騫跺皢鍗佸叚榪涘埗鏁板瓧 <tt><font face=NSimsun>a</font></tt> - <tt><font face=NSimsun>f</font></tt> 鏄劇ず涓哄ぇ鍐欏瓧姣嶃?/p> <pre>cout << uppercase << showbase << hex<br> << "printed in hexadecimal: ival = " << ival<br> << " jval = " << jval << endl<br> << nouppercase << endl;</pre> <p>鍓嶉潰鐨勭▼搴忎駭鐢熶笅闈㈢殑杈撳嚭錛?/p> <pre><span>printed in hexadecimal: ival = 0XF jval = 0X400</span></pre> <p>瑕佹仮澶嶅皬鍐欙紝灝卞簲鐢?nouppercase 鎿嶇旱絎︺?/p> <h5>鎺у埗嫻偣鍊肩殑鏍煎紡</h5> <p>瀵逛簬嫻偣鍊肩殑鏍煎紡鍖栵紝鍙互鎺у埗涓嬮潰涓変釜鏂歸潰錛?/p> <ul> <li> <p>綺懼害錛氭樉紺哄灝戜綅鏁板瓧銆?/p> <li> <p>璁版暟娉曪細鐢ㄥ皬鏁拌繕鏄瀛﹁娉曟硶鏄劇ず銆?/p> <li> <p>瀵規槸鏁存暟鐨勬誕鐐瑰肩殑灝忔暟鐐圭殑澶勭悊銆?/p> </li> </ul> <p>榛樿鎯呭喌涓嬶紝浣跨敤鍏綅鏁板瓧鐨勭簿搴︽樉紺烘誕鐐瑰箋傚鏋滃兼病鏈夊皬鏁伴儴鍒嗭紝鍒欑渷鐣ュ皬鏁扮偣銆備嬌鐢ㄥ皬鏁板艦寮忚繕鏄瀛﹁鏁版硶鏄劇ず鏁板煎彇鍐充簬琚樉紺虹殑嫻偣鏁扮殑鍊鹼紝鏍囧噯搴撻夋嫨澧炲己鏁板煎彲璇繪х殑鏍煎紡錛岄潪甯稿ぇ鍜岄潪甯稿皬鐨勫間嬌鐢ㄧ瀛﹁鏁版硶鏄劇ず錛屽叾浠栧間嬌鐢ㄥ皬鏁板艦寮忋?/p> <h5>鎸囧畾鏄劇ず綺懼害</h5> <p>榛樿鎯呭喌涓嬶紝綺懼害鎺у埗鏄劇ず鐨勬暟瀛楁諱綅鏁般傛樉紺虹殑鏃跺欙紝灝嗘誕鐐瑰煎洓鑸嶄簲鍏ュ埌褰撳墠綺懼害銆傚洜姝わ紝濡傛灉褰撳墠綺懼害鏄?4錛屽垯 <tt><font face=NSimsun>3.14159</font></tt> 鎴愪負 <tt><font face=NSimsun>3.142</font></tt>錛涘鏋滅簿搴︽槸 3錛屾墦鍗頒負 <tt><font face=NSimsun>3.14</font></tt>銆?/p> <p>閫氳繃鍚嶄負 <tt><font face=NSimsun>precision</font></tt> 鐨勬垚鍛樺嚱鏁幫紝鎴栬呴氳繃浣跨敤 <tt><font face=NSimsun>setprecision</font></tt> 鎿嶇旱絎︼紝鍙互鏀瑰彉綺懼害銆?tt><font face=NSimsun>precision</font></tt> 鎴愬憳鏄噸杞界殑錛?a ><font color=#bf7fa1>絎?7.8 鑺?/font></a>錛夛細涓涓増鏈帴鍙椾竴涓?<tt><font face=NSimsun>int</font></tt> 鍊煎茍灝嗙簿搴﹁緗負閭d釜鏂板鹼紝瀹冭繑鍥?span>鍏堝墠</span>鐨勭簿搴﹀鹼紱鍙︿竴涓増鏈笉鎺ュ彈瀹炲弬騫惰繑鍥炲綋鍓嶇簿搴﹀箋?tt><font face=NSimsun>setprecision</font></tt> 鎿嶇旱絎︽帴鍙椾竴涓疄鍙傦紝鐢ㄦ潵璁劇疆綺懼害銆?/p> <p>涓嬮潰鐨勭▼搴忚鏄庢帶鍒舵樉紺烘誕鐐瑰兼墍鐢ㄧ簿搴︾殑涓嶅悓鏂規硶錛?/p> <pre>// <span>cout.precision</span> <span>reports current precision value</span><br> cout << "Precision: " << cout.precision()<br> << ", Value: " << sqrt(2.0) << endl;<br> // <span>cout.precision(12)</span> <span>asks that 12 digits of precision to be printed</span><br> cout.precision(12);<br> cout << "Precision: " << cout.precision()<br> << ", Value: " << sqrt(2.0) << endl;<br> // <span>alternative way to set precision using</span> <span>setprecision</span> <span>manipulator</span><br> cout << setprecision(3);<br> cout << "Precision: " << cout.precision()<br> << ", Value: " << sqrt(2.0) << endl;</pre> <p>緙栬瘧騫舵墽琛屽悗錛岀▼搴忎駭鐢熶笅闈㈢殑杈撳嚭錛?/p> <pre><span>Precision: 6, Value: 1.41421</span><br> <span>Precision: 12, Value: 1.41421356237</span><br> <span>Precision: 3, Value: 1.41</span></pre> <p>榪欎釜紼嬪簭璋冪敤鏍囧噯搴撲腑鐨?<tt><font face=NSimsun>sqrt</font></tt> 鍑芥暟錛屽彲浠ュ湪澶存枃浠?<tt><font face=NSimsun>cmath</font></tt> 涓壘鍒板畠銆?tt><font face=NSimsun>sqrt</font></tt> 鍑芥暟閲忛噸杞界殑錛屽彲浠ョ敤 <tt><font face=NSimsun>float</font></tt>銆?tt><font face=NSimsun>double</font></tt> 鎴?<tt><font face=NSimsun>long double</font></tt> 瀹炲弬璋冪敤錛屽畠榪斿洖瀹炲弬鐨勫鉤鏂規牴銆?/p> <a></a> <div> <p> <table cellSpacing=0 cellPadding=1 width="90%" border=0> <tbody> <tr> <td vAlign=top width=60><br></td> <td vAlign=top> <p>鎿嶇旱絎﹀拰鍏朵粬鎺ュ彈瀹炲弬鐨勬搷綰電瀹氫箟鍦ㄥご鏂囦歡 <tt><font face=NSimsun>iomanip</font></tt> 涓?/p> </td> </tr> </tbody> </table> </p> </div> <h5>鎺у埗璁版暟娉?/h5> <p>榛樿鎯呭喌涓嬶紝鐢ㄤ簬鏄劇ず嫻偣鍊肩殑璁版暟娉曞彇鍐充簬鏁扮殑澶у皬錛氬鏋滄暟寰堝ぇ鎴栧緢灝忥紝灝嗘寜縐戝璁版暟娉曟樉紺猴紝鍚﹀垯錛屼嬌鐢ㄥ浐瀹氫綅鏁扮殑灝忔暟銆傛爣鍑嗗簱閫夋嫨浣垮緱鏁板鏄撻槄璇葷殑璁版暟娉曘?/p> <a></a> <div> <p> <table cellSpacing=0 cellPadding=1 width="90%" border=0> <tbody> <tr> <td vAlign=top width=60><br></td> <td vAlign=top> <p>灝嗘誕鐐規暟鏄劇ず涓烘櫘閫氭暟錛堢浉瀵逛簬鏄劇ず璐у竵銆佺櫨鍒嗘瘮錛岄偅鏃舵垜浠笇鏈涙帶鍒跺肩殑澶栬錛夌殑鏃跺欙紝閫氬父鏈濂借鏍囧噯搴撴潵閫夋嫨浣跨敤鐨勮鏁版硶銆傝寮哄埗縐戝璁版暟娉曟垨鍥哄畾浣嶆暟灝忔暟鐨勪竴縐嶆儏鍐墊槸鍦ㄦ樉紺鴻〃鐨勬椂鍊欙紝琛ㄤ腑鐨勫皬鏁扮偣搴旇瀵歸綈銆?/p> </td> </tr> </tbody> </table> </p> </div> <p>濡傛灉甯屾湜寮哄埗縐戝璁版暟娉曟垨鍥哄畾浣嶆暟灝忔暟琛ㄧず錛屽彲浠ラ氳繃浣跨敤閫傚綋鐨勬搷綰電鍋氬埌榪欎竴鐐癸細<tt><font face=NSimsun>scientific</font></tt> 鎿嶇旱絎﹀皢嫻佸彉涓轟嬌鐢ㄧ瀛﹁鏁版硶銆傚儚鍦ㄥ崄鍏繘鍒跺間笂鏄劇ず <tt><font face=NSimsun>x</font></tt> 涓鏍鳳紝涔熷彲浠ラ氳繃 <tt><font face=NSimsun>uppercase</font></tt> 鎿嶇旱絎︽帶鍒剁瀛﹁鏁版硶涓殑 <tt><font face=NSimsun>e</font></tt>銆?tt><font face=NSimsun>fixed</font></tt> 鎿嶇旱絎﹀皢嫻佷負浣跨敤鍥哄畾浣嶆暟灝忔暟琛ㄧず銆?/p> <p>榪欎簺鎿嶇旱絎︽敼鍙樻祦綺懼害鐨勯粯璁ゅ惈涔夈傛墽琛?<tt><font face=NSimsun>scientific</font></tt> 鎴?<tt><font face=NSimsun>fixed</font></tt> 涔嬪悗錛岀簿搴﹀兼帶鍒跺皬鏁扮偣涔嬪悗鐨勬暟浣嶃傞粯璁ゆ儏鍐典笅錛岀簿搴︽寚瀹氭暟瀛楃殑鎬諱綅鏁扳斺斿皬鏁扮偣涔嬪墠鍜屼箣鍚庛備嬌鐢?<tt><font face=NSimsun>fixed</font></tt> 鎴?<tt><font face=NSimsun>scientific</font></tt> 鍛藉悕鎴戜滑鑳藉鎸夊垪瀵歸綈鏉ユ樉紺烘暟錛岃繖涓絳栫暐淇濊瘉灝忔暟鐐規繪槸鍦ㄧ浉瀵逛簬琚樉紺虹殑灝忔暟閮ㄥ垎鍥哄畾鐨勪綅緗?/p> <h5>鎭㈠嫻偣鍊肩殑榛樿璁版暟娉?/h5> <p>涓庡叾浠栨搷綰電涓嶅悓錛屼笉瀛樺湪灝嗘祦鎭㈠涓烘牴鎹鏄劇ず鍊奸夋嫨璁版暟娉曠殑榛樿鐘舵佺殑鎿嶇旱絎︼紝鐩稿弽錛屾垜浠繀欏昏皟鐢?<tt><font face=NSimsun>unsetf</font></tt> 鎴愬憳鏉ュ彇娑?<tt><font face=NSimsun>scientific</font></tt> 鎴?<tt><font face=NSimsun>fixed</font></tt> 鎵鍋氱殑鏀瑰彉銆傝灝嗘祦鎭㈠涓烘誕鐐瑰肩殑榛樿澶勭悊錛屽皢鍚嶄負 <tt><font face=NSimsun>floatfield</font></tt> 鐨勬爣鍑嗗簱瀹氫箟鍊間紶緇?<tt><font face=NSimsun>unsetf</font></tt> 鍑芥暟錛?/p> <pre>// <span>reset to default handling for notation</span><br> cout.unsetf(ostream::floatfield);</pre> <p>闄や簡鍙栨秷瀹冧滑鐨勬晥鏋滀箣澶栵紝浣跨敤榪欎簺鎿嶇旱絎﹀儚浣跨敤浠繪剰鍏朵粬鎿嶇旱絎︿竴鏍鳳細</p> <pre>cout << sqrt(2.0) << '\n' << endl;<br> cout << "scientific: " << scientific << sqrt(2.0) << '\n'<br> << "fixed decimal: " << fixed << sqrt(2.0) << "\n\n";<br> cout << uppercase<br> << "scientific: " << scientific << sqrt(2.0) << '\n'<br> << "fixed decimal: " << fixed << sqrt(2.0) << endl<br> << nouppercase;<br> // <span>reset to default handling for notation</span><br> cout.unsetf(ostream::floatfield);<br> cout << '\n' << sqrt(2.0) << endl;</pre> <p>浜х敓濡備笅杈撳嚭錛?/p> <pre><span>1.41421</span><br><br> <span>scientific: 1.414214e+00</span><br> <span>fixed decimal: 1.414214</span><br><br> <span>scientific: 1.414214E+00</span><br> <span>fixed decimal: 1.414214</span><br><br> <span>1.41421</span></pre> <h5>鏄劇ず灝忔暟鐐?/h5> <p>榛樿鎯呭喌涓嬶紝褰撴誕鐐瑰肩殑灝忔暟閮ㄥ垎涓?0 鐨勬椂鍊欙紝涓嶆樉紺哄皬鏁扮偣銆?tt><font face=NSimsun>showpoint</font></tt> 鎿嶇旱絎﹀己鍒舵樉紺哄皬鏁扮偣錛?/p> <pre>cout << 10.0 << endl; // <span>prints</span> <span>10</span><br> cout << showpoint << 10.0 // <span>prints</span> <span>10.0000</span><br> << noshowpoint << endl; // <span>revert to default handling of decimal point</span></pre> <p><tt><font face=NSimsun>noshowpoint</font></tt> 鎿嶇旱絎︽仮澶嶉粯璁よ涓恒備笅涓涓緭鍑鴻〃杈懼紡灝嗗叿鏈夐粯璁よ涓猴紝鍗籌紝濡傛灉嫻偣鍊煎皬鏁伴儴鍒嗕負 0,灝卞彇娑堝皬鏁扮偣銆?/p> <h5>濉厖杈撳嚭</h5> <p>鎸夋爮鏄劇ず鏁版嵁鐨勬椂鍊欙紝緇忓父寰堝笇鏈涘緢濂藉湴鎺у埗鏁版嵁鐨勬牸寮忓寲銆傛爣鍑嗗簱鎻愪緵涓嬮潰鍑犱釜鎿嶇旱甯姪鎴戜滑瀹炵幇闇瑕佺殑鎺у埗錛?/p> <ul> <li> <p><tt><font face=NSimsun>setw</font></tt>錛屾寚瀹氫笅涓涓暟鍊兼垨瀛楃涓茬殑鏈灝忛棿闅斻?/p> <li> <p><tt><font face=NSimsun>left</font></tt>錛屽乏瀵歸綈杈撳嚭銆?/p> <p><tt><font face=NSimsun>right</font></tt>錛屽彸瀵歸綈杈撳嚭銆傝緭鍑洪粯璁や負鍙沖榻愩?/p> <li> <p><tt><font face=NSimsun>internal</font></tt>錛屾帶鍒惰礋鍊肩殑絎﹀彿浣嶇疆銆?tt><font face=NSimsun>internal</font></tt> 宸﹀榻愮鍙蜂笖鍙沖榻愬鹼紝鐢ㄧ┖鏍煎~鍏呬粙浜庡叾闂寸殑絀洪棿銆?/p> <li> <p><tt><font face=NSimsun>setfill</font></tt>錛屼嬌鎴戜滑鑳藉鎸囧畾濉厖杈撳嚭鏃朵嬌鐢ㄧ殑鍙︿竴涓瓧絎︺傞粯璁ゆ儏鍐典笅錛屽兼槸絀烘牸銆?/p> </li> </ul> <a></a> <div> <p> <table cellSpacing=0 cellPadding=1 width="90%" border=0> <tbody> <tr> <td vAlign=top width=60><br></td> <td vAlign=top> <p>鍍?<tt><font face=NSimsun>endl</font></tt> 涓鏍鳳紝<tt><font face=NSimsun>setw</font></tt> 涓嶆敼鍙樿緭鍑烘祦鐨勫唴閮ㄧ姸鎬侊紝瀹冨彧鍐沖畾涓嬩竴涓緭鍑虹殑闀垮害銆?/p> </td> </tr> </tbody> </table> </p> </div> <p>涓嬮潰紼嬪簭孌佃鏄庝簡榪欎簺鎿嶇旱絎︼細</p> <pre>int i = -16;<br> double d = 3.14159;<br> // <span>pad first column to use minimum of 12 positions in the output</span><br> cout << "i: " << setw(12) << i << "next col" << '\n'<br> << "d: " << setw(12) << d << "next col" << '\n';<br> // <span>pad first column and left-justify all columns</span><br> cout << left<br> << "i: " << setw(12) << i << "next col" << '\n'<br> << "d: " << setw(12) << d << "next col" << '\n'<br> << right; // <span>restore normal justification</span><br> // <span>pad first column and right-justify all columns</span><br> cout << right<br> << "i: " << setw(12) << i << "next col" << '\n'<br> << "d: " << setw(12) << d << "next col" << '\n';<br> // <span>pad first column but put the padding internal to the field</span><br> cout << internal<br> << "i: " << setw(12) << i << "next col" << '\n'<br> << "d: " << setw(12) << d << "next col" << '\n';<br> // <span>pad first column, using # as the pad character</span><br> cout << setfill('#')<br> << "i: " << setw(12) << i << "next col" << '\n'<br> << "d: " << setw(12) << d << "next col" << '\n'<br> << setfill(' '); // <span>restore normal pad character</span></pre> <p>鎵ц鏃訛紝璇ョ▼搴忔浜х敓濡備笅杈撳嚭錛?/p> <pre><span>i: -16next col</span><br> <span>d: 3.14159next col</span><br> <span>i: -16 next col</span><br> <span>d: 3.14159 next col</span><br> <span>i: -16next col</span><br> <span>d: 3.14159next col</span><br> <span>i: - 16next col</span><br> <span>d: 3.14159next col</span><br> <span>i: -#########16next col</span><br> <span>d: #####3.14159next col</span></pre> <h4>A.3.4. 鎺у埗杈撳叆鏍煎紡鍖?/h4> <p>榛樿鎯呭喌涓嬶紝杈撳叆鎿嶄綔絎﹀拷鐣ョ┖鐧斤紙絀烘牸銆佸埗琛ㄧ銆佹崲琛岀銆佽繘綰稿拰鍥炶濺錛夈傚涓嬮潰鐨勫驚鐜細</p> <pre>while (cin >> ch)<br> cout << ch;</pre> <p>緇欏畾杈撳叆搴忓垪</p> <pre><span>a b c</span><br> <span>d</span></pre> <p>寰幆鎵ц鍥涙浠庡瓧絎?<tt><font face=NSimsun>a</font></tt> 璇誨埌 <tt><font face=NSimsun>d</font></tt>錛岃煩榪囦粙浜庡叾闂寸殑絀烘牸銆佸彲鑳界殑鍒惰〃絎﹀拰鎹㈣絎︺傝紼嬪簭孌電殑杈撳嚭鏄細</p> <pre><span>abcd</span></pre> <p><tt><font face=NSimsun>noskipws</font></tt> 鎿嶇旱絎﹀鑷磋緭鍏ユ搷浣滅璇伙紙鑰屼笉鏄煩榪囷級絀虹櫧銆傝榪斿洖榛樿琛屼負錛屽簲鐢?<tt><font face=NSimsun>skipws</font></tt> 鎿嶇旱絎︼細</p> <pre>cin >> noskipws; // <span>set</span> <span>cin</span> <span>so that it reads whitespace</span><br> while (cin >> ch)<br> cout << ch;<br> cin >> skipws; // <span>reset</span> <span>cin</span> <span>to default state so that it discards whitespace</span></pre> <p>緇欏畾涓庡墠闈㈢浉鍚岀殑杈撳叆錛岃寰幆榪涜 7 嬈¤凱浠o紝璇昏緭鍏ヤ腑鐨勭┖鐧戒互鍙婂瓧絎︺傝寰幆浜х敓濡備笅杈撳嚭錛?/p> <pre><span>a b c</span><br> <span>d</span></pre> <h4>A.3.5. 鏈牸寮忓寲鐨勮緭鍏ワ紡杈撳嚭鎿嶄綔</h4> <p>榪勪粖涓烘錛岀ず渚嬬▼搴忎腑鍙嬌鐢ㄨ繃鏍煎紡鍖栫殑 IO 鎿嶄綔銆傝緭鍏ュ拰杈撳嚭鎿嶄綔絎︼紙<tt><font face=NSimsun><<</font></tt> 鍜?<tt><font face=NSimsun>>></font></tt>錛夋牴鎹澶勭悊鏁版嵁鐨勭被鍨嬫牸寮忓寲鎵璇誨啓鐨勬暟鎹傝緭鍏ユ搷浣滅蹇界暐絀虹櫧錛岃緭鍑烘搷浣滅搴旂敤濉厖銆佺簿搴︾瓑銆?/p> <p>鏍囧噯搴撹繕鎻愪緵浜嗕赴瀵岀殑鏀寔鏈牸寮忓寲 IO 鐨勪綆綰ф搷浣滐紝榪欎簺鎿嶄綔浣挎垜浠兘澶熷皢嫻佷綔涓烘湭瑙i噴鐨勫瓧鑺傚簭鍒楀鐞嗭紝鑰屼笉鏄綔涓烘暟鎹被鍨嬶紙濡?<tt><font face=NSimsun>char</font></tt>銆?tt><font face=NSimsun>int</font></tt>銆?tt><font face=NSimsun>string</font></tt> 絳夛級鐨勫簭鍒楀鐞嗐?/p> <img src ="http://www.shnenglu.com/dawnbreak/aggbug/85932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dawnbreak/" target="_blank">pear_li</a> 2009-05-27 17:53 <a href="http://www.shnenglu.com/dawnbreak/articles/85932.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鍩轟簬浜嬩歡瑙f瀽鐨凷AX妯″瀷鍒嗘瀽http://www.shnenglu.com/dawnbreak/articles/85822.htmlpear_lipear_liTue, 26 May 2009 09:26:00 GMThttp://www.shnenglu.com/dawnbreak/articles/85822.htmlhttp://www.shnenglu.com/dawnbreak/comments/85822.htmlhttp://www.shnenglu.com/dawnbreak/articles/85822.html#Feedback0http://www.shnenglu.com/dawnbreak/comments/commentRss/85822.htmlhttp://www.shnenglu.com/dawnbreak/services/trackbacks/85822.html
銆銆姣斿錛屽綋浣犺繘琛屽熀浜庝簨浠剁殑緙栫▼鐨勬椂鍊欙紝浣犲彲浠ュ垱寤哄嚱鏁版潵鍝嶅簲鐢ㄦ埛瀹氫箟鐨勪簨浠訛紙姣斿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 raw_interfaces_only


銆銆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爜銆?

pear_li 2009-05-26 17:26 鍙戣〃璇勮
]]>
STL涓殑鎺掑簭綆楁硶涓瑙圼By ACM閮佸笀] http://www.shnenglu.com/dawnbreak/articles/85685.htmlpear_lipear_liMon, 25 May 2009 03:51:00 GMThttp://www.shnenglu.com/dawnbreak/articles/85685.htmlhttp://www.shnenglu.com/dawnbreak/comments/85685.htmlhttp://www.shnenglu.com/dawnbreak/articles/85685.html#Feedback0http://www.shnenglu.com/dawnbreak/comments/commentRss/85685.htmlhttp://www.shnenglu.com/dawnbreak/services/trackbacks/85685.html璇︾粏鐨勪粠綆楁硶鐨勬晥鐜囨柟闈㈡潵璇存槑浜嗘帓搴忕畻娉曪紒

STL涓湁澶氱鎺掑簭綆楁硶錛屽悇鏈夊悇鐨勯傜敤鑼冨洿錛屼笅闈㈠惉鎴戜竴涓閬撴潵錛?br>
I銆佸畬鍏ㄦ帓搴?/span>
sort()
棣栧厛瑕侀殕閲嶆帹鍑虹殑褰撶劧鏄渶鏈甯哥敤鐨剆ort浜嗭紝sort鏈変袱縐嶅艦寮忥紝絎竴縐嶅艦寮忔湁涓や釜榪唬鍣ㄥ弬鏁幫紝鏋勬垚涓涓墠寮鍚庨棴鐨勫尯闂達紝鎸夌収鍏冪礌鐨?less 鍏崇郴鎺掑簭錛涚浜岀褰㈠紡澶氬姞涓涓寚瀹氭帓搴忓噯鍒欑殑璋撹瘝銆俿ort鍩烘湰鏄渶閫氱敤鐨勬帓搴忓嚱鏁幫紝瀹冧嬌鐢ㄥ揩閫熸帓搴忕畻娉曪紝騫朵笖鍦ㄩ掑綊榪囩▼涓紝褰撳厓绱犳暟鐩皬浜庝竴涓槇鍊鹼紙涓鑸槸16錛屾垜鐨勮瘯楠屾槸24錛夋椂錛岃漿鎴愮洿鎺ユ彃鍏ユ帓搴忋備紵澶х殑鏁板瀹禟nuth宸茬粡璇佹槑錛屽湪騫沖潎鎰忎箟涓婏紝蹇熸帓搴忔槸鏈蹇殑浜嗭紱褰撶劧錛屾渶鍧忓鏉傛ф瘮杈冨樊銆俿ort瑕佹眰闅忔満榪唬鍣紝鍥犳瀵逛簬寰堝緙栬瘧鍣ㄦ潵璇達紝瀵逛簬鍓嶅悜榪唬鍣紙濡俵ist錛変嬌鐢╯ort鏄竴涓紪璇戦敊璇?涓嶈繃錛屽湪vc2005閲岄潰錛岃繖涓敊璇俊鎭疄鍦ㄥ緢緋熺硶)

sort鐨勫熀鏈嬌鐢ㄦ柟寮忓涓嬶細

  1. C++:   
  2.   
  3. #include <vector>   
  4. #include <algorithm>   
  5. #include <functional>   
  6. #include <cstdlib>   
  7.     
  8. using namespace std;   
  9.     
  10. void func1()   
  11. {   
  12.     vector<int> ar;   
  13.     //鍚戞暟緇勯噷闈㈡彃鍏ヤ竴浜涢殢鏈烘暟   
  14.     generate_n(back_inserter(ar), 100, rand);   
  15.     //鎸変粠灝忓埌澶ф帓搴?  
  16.     sort(ar.begin(), ar.end());   
  17. }    

緇忓父鏈変漢闂浣曚粠澶у埌灝忛嗘帓搴忥紝榪欎釜鍏跺疄鏈夊緢澶氫腑鏂瑰紡瀹炵幇錛屽涓嬮潰鐨勪緥瀛愶細
  1. C++:   
  2.   
  3. void func2()   
  4. {   
  5.     vector<int> ar;   
  6.     //鍚戞暟緇勯噷闈㈡彃鍏ヤ竴浜涢殢鏈烘暟   
  7.     generate_n(back_inserter(ar), 100, rand);   
  8.     
  9.     //鏂規硶1錛氫嬌鐢ㄥ嚱鏁頒綔涓鴻皳璇?  
  10.     sort(ar.begin(), ar.end(), GreateThan);   
  11.     //鏂規硶2錛氫嬌鐢ㄤ豢鍑芥暟浣滀負璋撹瘝   
  12.     //娉ㄦ剰涓嬮潰涓ょ鏂規硶閮介渶瑕佹湁涓嫭鍙鳳紝瀹為檯涓婃槸瑕佷駭鐢熶竴涓復鏃跺璞?  
  13.     sort(ar.begin(), ar.end(), CompareInt());   
  14.     //鏂規硶3錛氫嬌鐢ㄩ瀹氫箟鐨凙dapter, 瀹氫箟鍦?nbsp;<functional> 涓?  
  15.     sort(ar.begin(), ar.end(), greater<int>());   
  16.     //鏂規硶4錛氭甯告帓搴忥紝鐒跺悗緲昏漿榪囨潵   
  17.     sort(ar.begin(), ar.end());   
  18.     reverse(ar.begin(), ar.end());   
  19.     //鏂規硶5錛氫嬌鐢ㄩ嗚凱浠e櫒   
  20.     sort(ar.rbegin(), ar.rend());   
  21. }    
  22.   

鏈鍚庝竴縐嶆柟娉曟槸鎴戞瘮杈冩璧忕殑錛屽彲浠ヤ笉鑳界洿鎺ュ鍘熺敓鏁扮粍浣跨敤錛屼篃灝辨槸璇達紝濡傛灉ar鐨勫畾涔夋槸int ar[MAXN]錛屼笂闈㈠叾浠栫殑鎺掑簭綆楁硶閮藉彲浠ョ畝鍗曠殑鏀規垚sort(ar, ar+MAXN, ...錛夛紝浣嗘渶鍚庝竴涓笉琛岋紝瑕佺敤鍙﹀涓縐嶆瘮杈冧笐闄嬬殑鏂瑰紡錛?br>
  1. C++:   
  2.   
  3. #include <iterator>   
  4. void func3(){   
  5.     int ax[5]={1,3,4,5,2};   
  6.     sort(reverse_iterator<int*>(ax+5), reverse_iterator<int*>(ax+0));   
  7. }    

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>
  1. C++:   
  2.   
  3. class CStudent   
  4. {   
  5. public:   
  6.     CStudent();   
  7.     //娉ㄦ剰榪欎釜姣旇緝鍑芥暟涓殑const   
  8.     bool operator<(const CStudent& rhs) const  
  9.     {   
  10.         if (m_score != rhs.m_score)   
  11.             return (m_score <rhs.m_score);   
  12.         return m_name <rhs.m_name;   
  13.     }   
  14. protected:   
  15.     std::string m_name;   
  16.     int m_score;   
  17. };   
  18.     
  19. void func4()   
  20. {   
  21.     vector<CStudent> arStu;   
  22.     sort(arStu.begin(), arStu.end());   
  23. }    

sort_heap
鍫嗘帓搴忎篃鏄竴縐嶅揩閫熺殑鎺掑簭綆楁硶錛屽鏉傚害涔熸槸O(N*logN)銆係TL涓湁涓浜涘拰鍫嗙浉鍏崇殑鍑芥暟錛岃兘澶熸瀯閫犲爢錛屽鏋滃湪鏋勯犲ソ鐨勫爢涓婃瘡嬈″彇鍑烘潵鏍硅妭鐐規斁鍦ㄥ熬閮紝鎵鏈夊厓绱犲驚鐜竴閬嶏紝鏈鍚庣殑緇撴灉涔熷氨鏈夊簭浜嗐傝繖灝辨槸sort_heap浜嗐傚畠鐨勪嬌鐢ㄨ姹傚尯闂村墠闈㈠凡緇忔瀯閫犳垚鍫嗭紝濡傦細
  1. C++:   
  2.   
  3. void func5()   
  4. {   
  5.     vector<int> ar;   
  6.     generate_n(back_inserter(ar), 100, rand);   
  7.     make_heap(ar.begin(), ar.end());   
  8.     sort_heap(ar.begin(), ar.end());   
  9. }    

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櫒鍖洪棿涓細
  1. C++:   
  2.   
  3. void func6()   
  4. {   
  5.     int ar[12]={69,23,80,42,17,15,26,51,19,12,35,8};   
  6.     //鍙帓搴忓墠7涓暟鎹?  
  7.     partial_sort(ar, ar+7, ar+12);   
  8.     //緇撴灉鏄?nbsp;8 12 15 17 19 23 26 80 69 51 42 35錛屽悗5涓暟鎹笉瀹?  
  9.     vector<int> res(7);   
  10.     //鍓?欏規帓搴忓悗鏀懼叆res   
  11.     partial_sort_copy(ar, ar+7, res.begin(), res.end(), greater<int>() );   
  12. }    

榪欎袱涓嚱鏁扮殑瀹炵幇浣跨敤鐨勬槸鍫嗙殑鏂規硶錛屽厛灝嗗墠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


pear_li 2009-05-25 11:51 鍙戣〃璇勮
]]>
妯℃澘綾葷殑瀹氫箟鍜屽疄鐜拌鏀懼湪鍚屼竴鏂囦歡涓?/title><link>http://www.shnenglu.com/dawnbreak/articles/81704.html</link><dc:creator>pear_li</dc:creator><author>pear_li</author><pubDate>Sat, 02 May 2009 08:50:00 GMT</pubDate><guid>http://www.shnenglu.com/dawnbreak/articles/81704.html</guid><wfw:comment>http://www.shnenglu.com/dawnbreak/comments/81704.html</wfw:comment><comments>http://www.shnenglu.com/dawnbreak/articles/81704.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dawnbreak/comments/commentRss/81704.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dawnbreak/services/trackbacks/81704.html</trackback:ping><description><![CDATA[<p><font color=#000000>浠婂ぉ鍐欑▼搴忥紝灝嗘ā鏉垮唴鐨勫畾涔夋斁鍦ㄤ簡.h鏂囦歡涓紝鑰屽疄鐜版斁鍦ㄤ簡.cpp涓紝</font></p> <p><font color=#000000>緙栬瘧閫氳繃浜嗭紝鍙繛鎺ユ庝箞涔熶笉鑳芥垚鍔熴傘?/font></p> <p><font color=#000000>鏌ヤ簡涓浜涗功鎵嶇煡閬擄紝妯℃澘綾葷殑瀹氫箟鍜屽疄鐜板繀欏繪斁鍦ㄥ悓涓鏂囦歡錛?/font></p> <p><font color=#000000>銆奵++緙栫▼鎬濇兂銆嬩腑璇達細妯℃澘綾誨畾涔夊緢鐗規畩錛岀敱template<...>瀹氫箟鐨勪換浣曚笢瑗塊兘鎰忓懗鐫緙栬瘧鍣ㄥ湪褰撴椂涓嶄負瀹冨垎閰嶅唴瀛樼┖闂達紝瀹冧竴鐩村浜庣瓑寰呯姸鎬侊紝鐩村埌琚竴涓ā鏉垮疄渚嬪憡鐭ワ紝鍗蟲ā鏉垮弬鏁版槸鐢辯紪璇戝櫒鏉ユ浛鎹㈢殑銆?nbsp;  <br>        涓轟簡瀹規槗浣跨敤錛屽嚑涔庢繪槸鍦ㄥご鏂囦歡涓斁緗叏閮ㄧ殑妯℃澘澹版槑鍜屽畾涔夈傛湁鏃訛紝涔熷彲鑳戒負浜嗘弧瓚崇壒孌婇渶瑕佽岃鍦ㄧ嫭绔嬬殑cpp涓斁緗ā鏉跨殑瀹炵幇銆備絾澶ч儴鍒嗙幇鍦ㄧ殑緙栬瘧鍣ㄨ繕涓嶆敮鎸佹ā鏉跨被鐨勫畾涔夊拰瀹炵幇鍒嗗紑</font></p> <img src ="http://www.shnenglu.com/dawnbreak/aggbug/81704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dawnbreak/" target="_blank">pear_li</a> 2009-05-02 16:50 <a href="http://www.shnenglu.com/dawnbreak/articles/81704.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>甯擱噺鍑芥暟銆佸父閲忓紩鐢ㄥ弬鏁般佸父閲忓紩鐢ㄨ繑鍥炲糩C++] http://www.shnenglu.com/dawnbreak/articles/80791.htmlpear_lipear_liWed, 22 Apr 2009 15:09:00 GMThttp://www.shnenglu.com/dawnbreak/articles/80791.htmlhttp://www.shnenglu.com/dawnbreak/comments/80791.htmlhttp://www.shnenglu.com/dawnbreak/articles/80791.html#Feedback0http://www.shnenglu.com/dawnbreak/comments/commentRss/80791.htmlhttp://www.shnenglu.com/dawnbreak/services/trackbacks/80791.html闃呰鍏ㄦ枃

pear_li 2009-04-22 23:09 鍙戣〃璇勮
]]>
鏈蹇殑Hash琛?http://www.shnenglu.com/dawnbreak/articles/80536.htmlpear_lipear_liMon, 20 Apr 2009 06:25:00 GMThttp://www.shnenglu.com/dawnbreak/articles/80536.htmlhttp://www.shnenglu.com/dawnbreak/comments/80536.htmlhttp://www.shnenglu.com/dawnbreak/articles/80536.html#Feedback0http://www.shnenglu.com/dawnbreak/comments/commentRss/80536.htmlhttp://www.shnenglu.com/dawnbreak/services/trackbacks/80536.html涓涓畝鍗曠殑闂錛氭湁涓涓簽澶х殑瀛楃涓叉暟緇勶紝鐒跺悗緇欎綘涓涓崟鐙殑瀛楃涓詫紝璁╀綘浠庤繖涓暟緇勪腑鏌ユ壘鏄惁鏈夎繖涓瓧絎︿覆騫舵壘鍒板畠錛屼綘浼氭庝箞鍋氾紵鏈変竴涓柟娉曟渶綆鍗曪紝鑰佽?瀹炲疄浠庡ご鏌ュ埌灝撅紝涓涓竴涓瘮杈冿紝鐩村埌鎵懼埌涓烘錛屾垜鎯沖彧瑕佸榪囩▼搴忚璁$殑浜洪兘鑳芥妸榪欐牱涓涓▼搴忎綔鍑烘潵錛屼絾瑕佹槸鏈夌▼搴忓憳鎶婅繖鏍風殑紼嬪簭浜ょ粰鐢ㄦ埛錛屾垜鍙兘鐢ㄦ棤璇潵 璇勪環錛屾垨璁稿畠鐪熺殑鑳藉伐浣滐紝浣?/font>...涔熷彧鑳藉姝や簡銆?/span>

鏈鍚堥傜殑綆楁硶鑷劧鏄嬌鐢?/font>HashTable錛堝搱甯岃〃錛夛紝鍏堜粙緇嶄粙緇嶅叾涓殑鍩烘湰鐭ヨ瘑錛屾墍璋?/font>Hash錛屼竴鑸槸涓涓暣鏁幫紝閫氳繃鏌愮綆楁硶錛屽彲浠ユ妸涓涓瓧絎︿覆"鍘嬬緝" 鎴愪竴涓暣鏁般傚綋鐒訛紝鏃犺濡備綍錛屼竴涓?/font>32浣嶆暣鏁版槸鏃犳硶瀵瑰簲鍥炰竴涓瓧絎︿覆鐨勶紝浣嗗湪紼嬪簭涓紝涓や釜瀛楃涓茶綆楀嚭鐨?/font>Hash鍊肩浉絳夌殑鍙兘闈炲父灝忥紝涓嬮潰鐪嬬湅鍦?/font>MPQ涓殑Hash綆楁硶錛?/font>

浠ヤ笅鐨?/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;

}

Blizzard鐨勮繖涓畻娉曟槸闈炲父楂樻晥鐨勶紝琚О涓?/span>"One-Way Hash"( A one-way hash is a an algorithm that is constructed in such a way that deriving the original string (set of strings, actually) is virtually impossible)銆備婦涓緥瀛愶紝瀛楃涓?/span>"unitneutralacritter.grp"閫氳繃榪欎釜綆楁硶寰楀埌鐨勭粨鏋滄槸0xA26067F3銆?/span>
銆銆鏄笉鏄妸絎竴涓畻娉曟敼榪涗竴涓嬶紝鏀規垚閫愪釜姣旇緝瀛楃涓茬殑Hash鍊煎氨鍙互浜嗗憿錛岀瓟妗堟槸錛岃繙榪滀笉澶燂紝瑕佹兂寰楀埌鏈蹇殑綆楁硶錛屽氨涓嶈兘榪涜閫愪釜鐨勬瘮杈冿紝閫氬父鏄瀯閫犱竴涓搱甯岃〃(Hash Table)鏉ヨВ鍐抽棶棰橈紝鍝堝笇琛ㄦ槸涓涓ぇ鏁扮粍錛岃繖涓暟緇勭殑瀹歸噺鏍規嵁紼嬪簭鐨勮姹傛潵瀹氫箟錛屼緥濡?/span>1024錛屾瘡涓涓?/span>Hash鍊奸氳繃鍙栨ā榪愮畻 (mod) 瀵瑰簲鍒版暟緇勪腑鐨勪竴涓綅緗紝榪欐牱錛屽彧瑕佹瘮杈冭繖涓瓧絎︿覆鐨勫搱甯屽煎搴旂殑浣嶇疆鍙堟病鏈夎鍗犵敤錛屽氨鍙互寰楀埌鏈鍚庣殑緇撴灉浜嗭紝鎯蟲兂榪欐槸浠涔堥熷害錛熸槸鐨勶紝鏄渶蹇殑O(1)錛岀幇鍦ㄤ粩緇嗙湅鐪嬭繖涓畻娉曞惂錛?br>

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;

}

1.     璁$畻鍑哄瓧絎︿覆鐨勪笁涓搱甯屽鹼紙涓涓敤鏉ョ‘瀹氫綅緗紝鍙﹀涓や釜鐢ㄦ潵鏍¢獙)
2.
瀵熺湅鍝堝笇琛ㄤ腑鐨勮繖涓綅緗?/span>

3.
鍝堝笇琛ㄤ腑榪欎釜浣嶇疆涓虹┖鍚楋紵濡傛灉涓虹┖錛屽垯鑲畾璇ュ瓧絎︿覆涓嶅瓨鍦紝榪斿洖
4.
濡傛灉瀛樺湪錛屽垯媯鏌ュ叾浠栦袱涓搱甯屽兼槸鍚︿篃鍖歸厤錛屽鏋滃尮閰嶏紝鍒欒〃紺烘壘鍒頒簡璇ュ瓧絎︿覆錛岃繑鍥?/font>
5.
縐誨埌涓嬩竴涓綅緗紝濡傛灉宸茬粡縐誨埌浜嗚〃鐨勬湯灝撅紝鍒欏弽緇曞埌琛ㄧ殑寮濮嬩綅緗搗緇х畫鏌ヨ銆
6.
鐪嬬湅鏄笉鏄張鍥炲埌浜嗗師鏉ョ殑浣嶇疆錛屽鏋滄槸錛屽垯榪斿洖娌℃壘鍒?/font>
7.
鍥炲埌3

琛ュ厖1錛氬叾浠栨瘮杈冪畝鍗曚竴浜涚殑hash鍑芥暟錛?br>

/*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

浠ヤ笅涓鴻紼嬪簭鐨勬簮浠g爜錛屽湪linux涓嬫祴璇曢氳繃錛?br>


#include <stdio.h>


/*crytTable[]閲岄潰淇濆瓨鐨勬槸HashString鍑芥暟閲岄潰灝嗕細鐢ㄥ埌鐨勪竴浜涙暟鎹紝鍦╬repareCryptTable
*鍑芥暟閲岄潰鍒濆鍖?/
unsigned long cryptTable[0x500];


/***********************************************************
*浠ヤ笅鐨勫嚱鏁扮敓鎴愪竴涓暱搴︿負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 涓篽ash鐨勭被鍨嬶紝
*鍦ㄤ笅闈etHashTablePos鍑芥暟閲岄潰璋冪敤鏈嚱鏁幫紝鍏跺彲浠ュ彇鐨勫間負0銆?銆?錛涜鍑芥暟
*榪斿洖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;
}

/***********************************************************
*鍦╩ain涓祴璇昦rgv[1]鐨勪笁涓猦ash鍊鹼細
* ./hash "arr\units.dat"
* ./hash "unit\neutral\acritter.grp"
***********************************************************/
int main( int argc, char **argv )
{
    unsigned long ulHashValue;
    int i = 0;

    if ( argc != 2 )
    {
        printf("please input two arguments\n");
        return -1;
    }

     /*鍒濆鍖栨暟緇勶細crytTable[0x500]*/
     prepareCryptTable();

     /*鎵撳嵃鏁扮粍crytTable[0x500]閲岄潰鐨勫?/
     for ( ; i < 0x500; i++ )
     {
         if ( i % 10 == 0 )
         {
             printf("\n");
         }

         printf("%-12X", cryptTable[i] );
     }

     ulHashValue = HashString( argv[1], 0 );
     printf("\n----%X ----\n", ulHashValue );

     ulHashValue = HashString( argv[1], 1 );
     printf("----%X ----\n", ulHashValue );

     ulHashValue = HashString( argv[1], 2 );
     printf("----%X ----\n", ulHashValue );

     return 0;
}
 


pear_li 2009-04-20 14:25 鍙戣〃璇勮
]]>
C/C++涓璫onst鐢ㄦ硶鎬葷粨http://www.shnenglu.com/dawnbreak/articles/79254.htmlpear_lipear_liWed, 08 Apr 2009 05:17:00 GMThttp://www.shnenglu.com/dawnbreak/articles/79254.htmlhttp://www.shnenglu.com/dawnbreak/comments/79254.htmlhttp://www.shnenglu.com/dawnbreak/articles/79254.html#Feedback0http://www.shnenglu.com/dawnbreak/comments/commentRss/79254.htmlhttp://www.shnenglu.com/dawnbreak/services/trackbacks/79254.html 

涓銆?/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> 



pear_li 2009-04-08 13:17 鍙戣〃璇勮
]]>
鍦?console mode 涓嬌鐢?C/C++ 緙栬瘧鍣?/title><link>http://www.shnenglu.com/dawnbreak/articles/76947.html</link><dc:creator>pear_li</dc:creator><author>pear_li</author><pubDate>Tue, 17 Mar 2009 16:00:00 GMT</pubDate><guid>http://www.shnenglu.com/dawnbreak/articles/76947.html</guid><wfw:comment>http://www.shnenglu.com/dawnbreak/comments/76947.html</wfw:comment><comments>http://www.shnenglu.com/dawnbreak/articles/76947.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dawnbreak/comments/commentRss/76947.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dawnbreak/services/trackbacks/76947.html</trackback:ping><description><![CDATA[<li><font face=Verdana>CL.exe<br>1. cl /c [filename]   /c涓哄彧緙栬瘧涓嶉摼鎺ョ殑鎰忔濓紝榛樿cl.exe宸ュ叿浼氬湪緙栬瘧涔嬪悗鑷姩璋冪敤LINK.EXE榪涜閾炬帴<br>2. cl.exe榪愯闇瑕佹寚瀹歩nclude銆乴ib絳夌幆澧冨彉閲?br>3. [filename]闇瑕佹寚瀹氭枃浠跺叏鍚嶏紙鍖呭惈鍚庣紑鍚嶏級<br>4. C/C++鐨勭紪璇戞槸閽堝鏂囦歡榪涜鐨?/font> <li><font face=Verdana>lib.exe Microsoft搴撶鐞嗗伐鍏?br>鐢ㄤ簬鎵撳寘緙栬瘧鍚庣殑搴撴枃浠?obj)錛屼嬌鐢熸垚涓涓簱鏂囦歡(lib)</font> <br>obj鏂囦歡鍜宭ib鏂囦歡涓鏍鳳紝鍙互鐩存帴鐢ㄤ簬link.exe閾炬帴宸ュ叿涓紝鐢熸垚exe鍙墽琛屾枃浠躲俵ib.exe鐨勪綔鐢ㄥ彧鏄墦鍖咃紝灝嗗涓猳bj鎵撳寘涓轟竴涓? <li>link.exe 閾炬帴宸ュ叿<br>link [file(s)]  /dll閫夐」鐢ㄦ潵鐢熸垚涓涓姩鎬侀摼鎺ュ簱(dll) <li><font face=Verdana>搴撴枃浠剁殑緙栧啓錛?br>搴撴枃浠朵腑鍙寘鍚渶瑕佺殑鍑芥暟鍙婃暟鎹嵆鍙紝涓嶉渶瑕乵ain鍑芥暟錛屼篃涓嶈兘鏈塵ain鍑芥暟<br></font><font face=Verdana>搴撴枃浠剁殑璋冪敤鑰咃紝闇瑕佺敤extern鍏抽敭瀛楃敵鏄庤璋冪敤鐨勫閮ㄥ嚱鏁?/font> <li><font face=Verdana>鐩墠浠ib鍚庣紑鐨勫簱鏈変袱縐嶏紝涓縐嶄負闈欐侀摼鎺ュ簱(Static   Libary錛屼互涓嬬畝縐?#8220;闈欐佸簱”)錛屽彟涓縐嶄負鍔ㄦ佽繛鎺ュ簱(DLL錛屼互涓嬬畝縐?#8220;鍔ㄦ佸簱”)鐨勫鍏ュ簱(Import   Libary錛屼互涓嬬畝縐?#8220;瀵煎叆搴?#8221;錛夈?nbsp; <br>    闈欐佸簱鏄竴涓垨鑰呭涓猳bj鏂囦歡鐨勬墦鍖咃紝鎵浠ユ湁浜哄共鑴嗘妸浠巓bj鏂囦歡鐢熸垚lib鐨勮繃紼嬬О涓篈rchive錛屽嵆鍚堝茍鍒頒竴璧楓傛瘮濡備綘閾炬帴涓涓潤鎬佸簱錛屽鏋滃叾涓湁閿欙紝瀹冧細鍑嗙‘鐨勬壘鍒版槸鍝釜obj鏈夐敊錛屽嵆闈欐乴ib鍙槸澹沖瓙銆?nbsp;<br>    鍔ㄦ佸簱涓鑸細鏈夊搴旂殑瀵煎叆搴擄紝鏂逛究紼嬪簭闈欐佽澆鍏ュ姩鎬侀摼鎺ュ簱錛屽惁鍒欎綘鍙兘灝遍渶瑕佽嚜宸盠oadLibary璋冨叆DLL鏂囦歡錛岀劧鍚庡啀鎵嬪伐GetProcAddress鑾峰緱瀵瑰簲鍑芥暟浜嗐傛湁浜嗗鍏ュ簱錛屼綘鍙渶瑕侀摼鎺ュ鍏ュ簱鍚庢寜鐓уご鏂囦歡鍑芥暟鎺ュ彛鐨勫0鏄庤皟鐢ㄥ嚱鏁板氨鍙互浜嗐?br>    瀵煎叆搴撳拰闈欐佸簱鐨勫尯鍒緢澶э紝浠栦滑瀹炶川鏄笉涓鏍風殑涓滆タ銆傞潤鎬佸簱鏈韓灝卞寘鍚簡瀹為檯鎵ц浠g爜銆佺鍙瘋〃絳夌瓑錛岃屽浜庡鍏ュ簱鑰岃█錛屽叾瀹為檯鐨勬墽琛屼唬鐮佷綅浜庡姩鎬佸簱涓紝瀵煎叆搴撳彧鍖呭惈浜嗗湴鍧絎﹀彿琛ㄧ瓑錛岀‘淇濈▼搴忔壘鍒板搴斿嚱鏁扮殑涓浜涘熀鏈湴鍧淇℃伅銆?/font> <li><font face=Verdana>鍔ㄦ侀摼鎺ュ簱(dll)<br>涓鑸負鎻愰珮紼嬪簭鍙鎬э紝浣跨敤<font face=Verdana>#define DllExport __declspec(dllexport)</font>瀹忓畾涔塂ll涓渶瑕佸鍑虹殑鍑芥暟錛涘湪姣忎釜闇瑕佸鍑虹殑鍑芥暟鍓嶄嬌鐢―llExport錛屼緥濡?font face=Verdana>DllExport int multiple(int x,int y)</font><br>鐢熸垚涓涓狣ll鐨勬柟娉曪細1.浣跨敤cl.exe /c [filename]灝嗘簮鏂囦歡鐢熸垚搴撴枃浠?2.浣跨敤link.exe /dll [filename.obj]灝嗘obj鏂囦歡鐢熸垚dll<br>璋冪敤Dll鐨勬柟娉曚竴錛?. 浣跨敤extern鎸囧畾澶栭儴鍑芥暟鍚?2.鍦ㄧ▼搴忎腑鐩存帴浣跨敤灝嗚璋冪敤鐨凞ll鐨勫嚱鏁板悕 3.閾炬帴鏃跺姞鍏ヤ笂涓姝ラ涓敓鎴愮殑搴撴枃浠?.lib)</font> <li>鏂規硶浜岋細榪愯鏃跺姩鎬佸姞杞?br>C浠g爜紺轟緥錛?br>//lib.c<br><font face=Verdana>#define DllExport __declspec(dllexport)<br></font><font face=Verdana>DllExport int multiple(int x,int y)<br>{<br> return x*y;<br>}<br></font>//libCaller.c<br><font face=Verdana>#include "windows.h"<br>//extern  int multiple(int x,int y);<br>typedef UINT (CALLBACK* LPFNDLLFUNC1)(int,int);<br></font><font face=Verdana>HINSTANCE hf;<br>LPFNDLLFUNC1 func;<br>main()<br>{<br>     </font><font face=Verdana>hf= LoadLibrary("lib.dll");<br>     if(hf!=0)<br>     {<br>          func = (LPFNDLLFUNC1)GetProcAddress(hf,"multiple");<br>          printf("Multiple:%d\r\n",func(5,12));<br>          FreeLibrary(hf);<br>    }<br>}</font> <li>Windows涓殑.lib鏂囦歡鍒嗕袱縐嶇被鍨?br>1.闈欐佸簱鏂囦歡錛岀敤浜庣紪璇戞椂渚涘叾浠栧璞″紩鐢?2.鍔ㄦ侀摼鎺ュ簱鐨勫鍑烘枃浠躲傞摼鎺ユ椂浣跨敤錛屾棤闇浣跨敤LoadLibrary鍔ㄦ佸姞杞姐? <li><font face=Verdana>Link.exe宸ュ叿鍦ㄤ嬌鐢?def鏂囦歡鐢熸垚DLL鏃剁殑涓ょ鍛戒護琛岃鍙ワ細<br>1. 濡傛灉DEF鏂囦歡涓病鏈塋IBRARY璇彞錛岄渶瑕佸悓鏃舵寚瀹?DEF /DLL閫夐」<br>2. 濡傛灉DEF鏂囦歡涓湁LIBRARY璇彞錛屽彧闇鎸囧畾/DEF閫夐」鍗沖彲鐢熸垚DLL</font> <li><font face=Verdana>Microsoft Visult Studio寮鍙戝伐鍏蜂腑CL.exe宸ュ叿CL鐨勬剰鎬濆強Compile鍜孡ink</font> <li><font face=Verdana>鐢熸垚DLL鐨勬柟寮忥紙listed in recommended order of use錛夛細<br>1. 鍦ㄦ簮鏂囦歡涓嬌鐢╒C++鑷畾涔夊叧閿瓧__declspec(dllexport)<br>2. 浣跨敤鍖呭惈EXPORTS璇彞鐨?def鏂囦歡<br>3. 浣跨敤Link.exe宸ュ叿鐨?EXPORT閫夐」錛堝畾涔夊鍑哄嚱鏁幫級</font> <font face=Verdana> <li>//DEF婧愭枃浠禨ample<br>EXPORTS<br>add <li>//DLL婧愭枃浠禨ample<br>int add(int x,int y)<br>{<br> return x + y;<br>} <li>int substract(int x,int y)<br>{<br> return x-y;<br>} </li> </font> <p> </p> <p> </p> <p> </p> <p>鎴戞繪槸榧撳姳 C/C++ 鐨勫涔犺咃紝鍦ㄥ垰鎺ヨЕ榪欎釜紼嬪紡璇█鐨勬椂鍊欙紝鍏堜互 console mode錛圖OS-like錛夌▼寮忎負鐩爣銆傛崲璦涔嬶紝涓嶈涓寮濮嬪氨鎯沖啓 GUI 紼嬪紡銆佹兂寮瑙嗙獥銆佹兂鏈夌湬鐩寒涓界殑鐢婚潰 -- 閭e彧鏄湭璧板厛椋烇紝鎻犺嫍鍔╅暱緗簡銆?br>鎵璋?console 紼嬪紡錛屽氨鏄枃瀛楁ā寮忕殑紼嬪紡錛屾垜浠彲浠ュ湪鍏朵腑濂藉ソ鎶?C/C++ 鐨勮璦鏍瑰熀緇冨ソ錛岃屼笉浼氬垎蹇冩柤鍏朵粬鏆傛棤蹇呰鐨?GUI 鏋濊妭涓娿?br>鎴戜竴鐩翠互涓猴紝榪欐槸鐞嗘墍褰撶劧鐨勪簨鎯咃紝鍗翠篃涓鐩村彂鐜幫紝鏈変笉灝戝ぇ涓撻櫌鏍$殑澶т竴 C/C++ 璇劇▼錛屽悓瀛︿滑蹇呴』鍐欎釜灝忎綔瀹躲佸皬鐢誨銆佸皬綆楃洏鈹呭仛涓烘湡涓垨鏈熸湯浣滀笟銆?br>鏋滅劧涓栫晫涓嶈兘澶у悓錛屽悇浜虹湅娉曟畩寮?:)<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 鐜 鈽呪槄<br>鈼廋/C++ 緙栬瘧鍣ㄩ渶瑕佺殑鐜鍙樻暟璁懼畾<br>鍙ゆ棭浠ユ潵錛孭C 涓婄殑 C 緙栬瘧鍣紝灝遍渶瑕佷袱涓幆澧冨彉鏁幫細<br>LIB錛氳繖涓幆澧冨彉鏁板憡璇夌紪璇戝櫒璇達紝蹇呰鐨?libraries 鍦ㄥ摢閲岋紙鍝釜紓佺鐩綍涓嬶級<br>INCLUDE錛氬憡璇夌紪璇戝櫒璇達紝蹇呰鐨?header files 鍦ㄥ摢閲岋紙鍝釜紓佺鐩綍涓嬶級<br>鍙﹀錛屼負浜嗚鎴戜滑鑳藉鍦ㄤ換浣?working directory 閮藉彨寰楀埌緙栬瘧鍣紝褰撶劧鎴戜滑蹇呴』璁懼畾 PATH銆?br>浠庡彜鏃╀互鏉ワ紝涓鐩村埌鐜板湪錛孋/C++ 緙栬瘧鍣ㄩ兘闇瑕佽繖涓変釜鐜鍙樻暟銆?br>鈼忎互 Visual C++ 涓轟緥<br>浠?Visual C++ 涓轟緥錛屽鏋滃畨瑁呭緦鐨勬。妗堝竷灞濡備笅錛?br>C:\MSDEV\VC98\BIN : 榪欓噷鏀炬湁緙栬瘧鍣?CL.EXE<br>C:\MSDEV\VC98\INCLUDE : 榪欓噷鏀炬湁 C/C++ header files<br>C:\MSDEV\VC98\LIB : 榪欓噷鏀炬湁 C/C++ standard libraries<br>閭i航浣犲彲浠ュ啓涓涓壒嬈℃。濡備笅錛?br><small>set PATH=C:\MSDEV\VC98\BIN;C:\MSDEV\COMMON\MSDEV98\BIN<br>set INCLUDE=C:\MSDEV\VC98\INCLUDE<br>set LIB=C:\MSDEV\VC98\LIB</small><br>涔嬫墍浠ラ渶瑕佸彟澶栬瀹?PATH=C:\MSDEV\COMMON\MSDEV98\BIN錛屾槸鍥犱負緙栬瘧鍣?CL.EXE 鎵ц鏃墮渶瑕?MSPDB60.DLL錛岃屽畠琚畨瑁呮柤 C:\MSDEV\COMMON\MSDEV98\BIN 涔嬩腑銆?br>濡傛灉浣犲啓鐨勭▼寮忎笉鍙槸鍗曠函鐨?C/C++ 紼嬪紡錛岃繕鐢ㄥ埌浜?MFC錛屼竴鏍峰彲浠ュ湪 console mode 涓嬬紪璇戯紝榪欐椂鍊欎綘鐨勭幆澧冨彉鏁板簲璇ュ姝よ瀹氾細<br><small>set PATH=C:\MSDEV\VC98\BIN;C:\MSDEV\COMMON\MSDEV98\BIN<br>set INCLUDE=C:\MSDEV\VC98\INCLUDE;C:\MSDEV\VC98\MFC\INCLUDE<br>set LIB=C:\MSDEV\VC98\LIB;C:\MSDEV\VC98\MFC\LIB</small><br>澶氭寚瀹氫簡 MFC\INCLUDE 鍜?MFC\LIB錛屽氨鍙互璁╃紪璇戝櫒鍜岃仈緇撳櫒鎵懼埌 MFC 鐨?header files 鍜?libraries銆傚鏋滀綘榪橀渶瑕佺敤鍒?ATL錛屽氨寰楀湪 INCLUDE 鐜鍙樻暟涓啀鍔犱笂 C:\MSDEV\VC98\ATL\INCLUDE銆?br>鈼忎互 Borland C++Builder 涓轟緥<br>浠?Borland C++Builder 涓轟緥錛屽鏋滃畨瑁呭緦鐨勬。妗堝竷灞濡備笅錛?br>C:\BORLAND\CBuilder3\BIN : 榪欓噷鏀炬湁緙栬瘧鍣?BCC32.EXE<br>C:\BORLAND\CBuilder3\INCLUDE : 榪欓噷鏀炬湁 C/C++ header files<br>C:\BORLAND\CBuilder3\LIB : 榪欓噷鏀炬湁 C/C++ standard libraries<br>閭i航浣犲彲浠ュ啓涓涓壒嬈℃。濡備笅錛?br><small>set PATH=C:\BORLAND\CBuilder3\BIN<br>set INCLUDE=C:\BORLAND\CBuilder3\INCLUDE<br>set LIB=C:\BORLAND\CBuilder3\LIB</small><br>鈼忓浣曞湪 console 涓紪璇?C/C++ 紼嬪紡<br>棣栧厛錛屽紑鍚竴涓?DOS Box錛圖OS Prompt, DOS VM錛夛紝鐒跺緦鍦ㄨ DOS box 涓墽琛屼笂榪板啓濂界殑鎵規妗o紝瀹屾垚鐜鍙樻暟鐨勮瀹氥備綘鍙互鍐嶅湪 DOS 鎻愮ず鍙蜂笅閿叆 set 鍛戒護錛岀湅鐪嬬幆澧冨彉鏁扮殑璁懼畾鍐呭姝g‘涓庡惁銆?br>鐒跺緦灝卞彲浠ョ洿鎺ュ湪 DOS 鎻愮ず鍙蜂笅閿叆緙栬瘧鍣ㄥ悕縐幫紝寮濮嬬紪璇戜簡銆傚鏋滀綘浣跨敤 Visual C++錛屽氨榪欓航鍋氾細<br><small>C:\> CL test.cpp <enter></small><br>濡傛灉浣犱嬌鐢?C++Builder錛屽氨榪欓航鍋氾細<br><small>C:\> BCC32 test.cpp <enter></small><br>鑷蟲柤鐗規畩鎯呭喌涓嬮渶瑕佷粈楹界壒孌婄殑 options錛屽氨蹇呴』鑷繁鏌ヤ竴涓嬪暒銆傚彧瑕佹墽琛?CL /? 鎴?BCC32錛堝叾寰屼笉鍔犱換浣曞紩鏁幫級錛屼究鍙湅鍒版墍鏈夌殑 compile options銆?br>鈼忕紪璇戝櫒涓庤仈緇撳櫒鐨勫叧緋?br>鏃╂湡鐨勭紪璇戣繃紼嬩笌鑱旂粨榪囩▼鏄垎寮鐨勩傛崲鍙ヨ瘽璇存垜浠繀欏誨仛涓や釜鍔ㄤ綔錛?br><small>C:\> Cl test.cpp<br>C:\> LINK test.obj xxx 錛坸xx 浠h〃鍚勪釜蹇呰鐨?libraries錛?/small><br>鎴栨槸錛?br><small>C:\> BCC32 test.cpp<br>C:\> TLINK32 test.obj xxx 錛坸xx 浠h〃鍚勪釜蹇呰鐨?libraries錛?br></small><br>濡備粖鐨勭紪璇戣繃紼嬩笌鑱旂粨榪囩▼褰撶劧榪樻槸鍒嗗紑鐨勶紝浣嗘槸鎴戜滑鐨勫姩浣滃彧闇涓涓細<br><small>C:\> CL test.cpp</small><br>鎴栨槸錛?br><small>C:\> BCC32 test.cpp</small><br>榪欐槸鍥犱負緙栬瘧鍣ㄥ彉鑱槑浜嗭紝闄ら潪浣犳寚瀹?/c option錛堣〃紺哄彧緙栬瘧涓嶈仈緇擄級錛屽惁鍒欏畠渚胯嚜鍔ㄤ負浣犲懠鍙仈緇撳櫒榪涜鑱旂粨鍔ㄤ綔銆傝繃鍘諱互鏉ラ浠?programmer鐑︽伡鐨勩岃浣跨敤鍝簺 libraries銆嶇殑闂錛岀紪璇戝櫒涔熸湁浜嗚仾鏄庣殑瑙e喅鏂規錛氬畠灝嗙▼寮忎腑鐢ㄥ埌鐨?library functions 璁板綍璧鋒潵錛屽悓鏃朵篃褰曚笅瀹冧滑鎵灞炵殑library 鍚嶇О錛屾柤鏄仈緇撳櫒灝卞彲浠ヤ粠榪欎釜琛ㄦ牸涓煡閬撹鑱旂粨鍝簺 libraries 浜嗐?br>鈼忕幆澧冨彉鏁頒笌 DOS VM錛圴irtual Machine錛夌殑鍏崇郴<br>浣犲彲浠ュ悓鏃跺紑璧峰涓?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>浣嗘槸閫氬父澶у閮芥湁澶辮觸鐨勭粡楠岋紝寰楀埌 "<strong>Out of environment space</strong>" 鐨勯敊璇鎭傝繖鏄洜涓?VCVARS32.BAT 浣跨敤浠ヤ笅鍙ユ硶錛?br><small>set INCLUDE=%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%INCLUDE%<br>set LIB=%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB%</small><br>鎰忔濇槸鎶?INCLUDE 鐨勫師濮嬭瀹氾紙%INCLUDE%錛夊啀闄勫姞鍏朵粬璁懼畾錛屽茍鎶奓IB 鐨勫師濮嬭瀹氾紙%LIB%錛夊啀闄勫姞鍏朵粬璁懼畾銆傚鏋滃師濮嬭瀹氬凡緇忓緢闀匡紝澶氭潵榪欓航鍑犳錛屼究 "Out of environment space" 鍟︼紒<br>鍋氭硶涔嬩竴鏄皟楂樼幆澧冪┖闂寸殑澶у皬銆傝鍦?c:\config.sys 妗d腑鍔犱笂榪欒錛?br><small>shell=C:\COMMAND.COM C:\ /E:1024 /P</small><br>鍏朵腑 /E:1024 渚挎槸琛ㄧず灝嗙幆澧冪┖闂磋皟涓?1024 bytes銆傦紙涓嶅錛熷啀璋冿級<br>鍋氭硶涔嬩簩鏄笉瑕佷嬌鐢?VCVARS32.BAT 鐨勯偅縐嶃岄檮鍔犮嶅彞鍨嬶紝鏀圭敤鍓嶈堪鎴戜滑鑷繁鐨勬壒嬈℃。銆傝鐭ラ亾錛屾垜浠彲鑳芥湁濂藉嚑涓紪璇戝櫒鐜錛圴C銆丅CB銆丟++ 鈹咃級錛岄渶瑕佽疆鐣祴璇曟垜浠殑紼嬪紡錛涘鏋滀嬌鐢ㄣ岄檮鍔犮嶅彞鍨嬶紝澶氭潵鍑犳錛屽啀澶х殑鐜絀洪棿涔熶細娑堢(孌嗗敖銆?br>鏂規硶涓鍜屾柟娉曚簩瑕佸弻綆¢綈涓嬪敺銆?br>鈼忔湁浠諱綍瑙勬ā涓婄殑闄愬埗鍚楋紵<br>浣跨敤 console 妯″紡錛堟垨縐?command line 妯″紡錛夋潵緙栬瘧鑱旂粨紼嬪紡錛岀▼寮忕殑澶у皬鍙惁鏈変換浣曡妯′笂鐨勯檺鍒訛紵絳旀鏄病鏈夛紒<br>瀹冪殑緙虹偣鏄病鏈夊伐鍏峰府浣犵鐞嗘。妗堛佹病鏈夐璁懼艱浣犲皯鎵撳嚑涓瓧銆佹病鏈夊垎鏋愬伐鍏峰府浣犳暣鐞?objects錛岃浣犳祻瑙?objects銆乻ymbols鈹呫傛墍浠ヤ竴鏃︿綘鍩烘湰鍔熷浼氫簡錛岃寮濮嬩腑澶у瀷紼嬪紡鐨勮璁★紝褰撶劧浠ユ暣鍚堢幆澧冿紙IDE錛変負浣熾?br>鈼忎笉瑕佽浼?br>鎴戣繖涓嶆槸寮鍊掕濺錛岃澶у鍥炲埌鑼規瘺楗鐨勬椂浠o紝閮藉洖澶村幓鍋氬北欏舵礊浜恒傝屾槸鎴戣寰楋紝瀵規柤涓浣?C/C++ 鍒濆鑰咃紝鏁村悎鐜錛圛DE錛夌殑榪愮敤鎭愭曞甫鏉ヤ竴澶撮浘姘達紝涓嶅鍏堝湪 console mode 涓嬩綔涓氥備竴鏂歸潰澶氳璇嗕竴浜涚幆澧冭瀹氭柟闈㈢殑甯歌瘑錛屾弧濂界殑錛屼竴鏂歸潰姣旇緝鏂逛究濂界敤錛屼篃涓嶅繀鍐欎釜 1000 琛岀殑灝忓皬緇冧範榪樺緱鍚姩 浜斾簲鍔犲啘鐐紝涓鏂歸潰姹傜煡鐨勫姏閲忓彲浠ュ叏閮ㄦ斁鍦ㄨ璦鐨勭粌涔犱笂澶淬?br>絳夋湁浜嗕竴瀹氱殑紼嬪害錛屽啀浣跨敤鏁村悎鐜錛屽氨涓嶄細濡傚潬浜旈噷闆句簡銆?/p> <img src ="http://www.shnenglu.com/dawnbreak/aggbug/76947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dawnbreak/" target="_blank">pear_li</a> 2009-03-18 00:00 <a href="http://www.shnenglu.com/dawnbreak/articles/76947.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Windows涓?POSIX 綰跨▼緙栫▼http://www.shnenglu.com/dawnbreak/articles/76946.htmlpear_lipear_liTue, 17 Mar 2009 15:58:00 GMThttp://www.shnenglu.com/dawnbreak/articles/76946.htmlhttp://www.shnenglu.com/dawnbreak/comments/76946.htmlhttp://www.shnenglu.com/dawnbreak/articles/76946.html#Feedback0http://www.shnenglu.com/dawnbreak/comments/commentRss/76946.htmlhttp://www.shnenglu.com/dawnbreak/services/trackbacks/76946.html1. POSIX 鏍囧噯

        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>

2. Liniux涓嬬殑綰跨▼緙栫▼

        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)錛?

#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);
}

 瑕佺紪璇戣繖涓▼搴忥紝鍙渶鍏堝皢紼嬪簭瀛樹負 thread1.c錛岀劧鍚庤緭鍏ワ細

$ gcc thread1.c -o thread1 -lpthread

榪愯鍒欒緭鍏ワ細

$ ./thread1

3. Windows涓婸OSIX綰跨▼緙栫▼

       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>

3.1 綆鍗曚嬌鐢?/strong>

       涓婇潰鐨別xe鏂囦歡鏄竴涓嚜瑙e帇鏂囦歡錛岃В鍘嬪悗錛孭re-built.2鐩綍涓湁緙栬瘧鎵闇瑕佺殑澶存枃浠訛紙include瀛愮洰褰曪級鍜屽簱鏂囦歡錛坙ib瀛愮洰褰曪級銆?/p>

       涓涓畝鍗曠殑嫻嬭瘯紼嬪簭(main.cpp)錛?/p>

#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;
}
 

浣跨敤 cl.exe 緙栬瘧錛堜笉鐔熸倝 cl.exe 鐨勮鍙傝冿細http://blog.csdn.net/liuyongjin1984/archive/2008/01/07/2029405.aspx 鎴栬呭弬瑙佷笅闈?.2閮ㄥ垎錛夛細

銆?span style="COLOR: #000000">rem cl.bat

銆媍l.exe main.cpp  //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

 3.2 浣跨敤VC++ 6.0鎴朧isual Studio 2005鏉ヨ繍琛屼笂闈㈢殑紼嬪簭

鍏抽敭鏈変袱鐐癸細

1. 鏄皢澶存枃浠訛紙include瀛愮洰褰曪級鍜屽簱鏂囦歡錛坙ib瀛愮洰褰曪級涓殑鍐呭娣誨姞鍒癡C++ 6.0鎴朧isual Studio 2005寮鍙戠幆澧冨搴旂殑include鍜宭ib鐩綍涓嬨?/p>

鍏蜂綋鏉ヨ錛?strong>浠ユ坊鍔爄nclude鐩綍涓轟緥錛屾坊鍔爈ib鐩綍綾諱技錛夛細

鍥?錛歏C++ 6.0錛堟坊鍔爄nclude鐩綍錛氬伐鍏?-銆嬮夐」--銆嬬洰褰曪級

 

 

鍥?錛歏isual Studio 2005(娣誨姞include鐩綍錛歵ools--銆媜ptions)

 

 

2. 鎸囧畾link鏃惰榪炴帴鐨勫簱鐨勫悕縐幫紙pthreadVC2.lib錛?/strong>

鍥?錛歏C++ 6.0錛堝伐紼?-銆嬭緗?-銆嬭繛鎺ワ級

鍥?錛歏isual Studio 2005(project-->* property pages)

 

4. 涔︾睄鎺ㄨ崘
<< POSIX Multithread Programming Primer >>: http://download.csdn.net/source/237125



pear_li 2009-03-17 23:58 鍙戣〃璇勮
]]>
Reversing MS VC++ Part II: Classes, Methods and RTTIhttp://www.shnenglu.com/dawnbreak/articles/76231.htmlpear_lipear_liWed, 11 Mar 2009 07:37:00 GMThttp://www.shnenglu.com/dawnbreak/articles/76231.htmlhttp://www.shnenglu.com/dawnbreak/comments/76231.htmlhttp://www.shnenglu.com/dawnbreak/articles/76231.html#Feedback0http://www.shnenglu.com/dawnbreak/comments/commentRss/76231.htmlhttp://www.shnenglu.com/dawnbreak/services/trackbacks/76231.html闃呰鍏ㄦ枃

pear_li 2009-03-11 15:37 鍙戣〃璇勮
]]>
C++瀵硅薄鍐呭瓨妯″瀷http://www.shnenglu.com/dawnbreak/articles/76230.htmlpear_lipear_liWed, 11 Mar 2009 07:36:00 GMThttp://www.shnenglu.com/dawnbreak/articles/76230.htmlhttp://www.shnenglu.com/dawnbreak/comments/76230.htmlhttp://www.shnenglu.com/dawnbreak/articles/76230.html#Feedback0http://www.shnenglu.com/dawnbreak/comments/commentRss/76230.htmlhttp://www.shnenglu.com/dawnbreak/services/trackbacks/76230.html/*
 *C++涓潪澶氭佺被瀵硅薄鐨勫唴瀛樻槧鍍忔ā鍨?br> *
 *
 *
 */
#include <iostream>

using namespace std;

class rectangle
{
    public:
  rectangle():m_length(1), m_width(1){}
  ~rectangle(){}
  float GetLength() const
  {
      return m_length;
  }
  void SetLength(float length)
  {
      m_length = length;
  }
  float GetWidth() const
  {
      return m_width;
  }
  void SetWidth(float width)
  {
      m_width = width;
  }
  void Draw() const 
  {
      //...
      //...
      //...
  }
  static unsigned int GetCount()
  {
      return m_count;
  }

    protected:
  rectangle(const rectangle & copy)
  {
      //...
      //...
      //...
  }
  rectangle& operator=(const rectangle & assign)
  {
      //...
      //...
      //...
  }

    private:
  float m_length;
  float m_width;
  static unsigned int m_count;
};
int main()
{
    rectangle rect;
    rect.SetWidth(10);
    cout<<rect.GetWidth()<<endl;
    return 0;
}
/*
 *鏈夊涓嬭鍒欙細
闈為潤鎬佹暟鎹垚鍛樿鏀懼湪姣忎竴涓璞′綋鍐呬綔涓哄璞′笓鏈夌殑鏁版嵁鎴愬憳
闈欐佹暟鎹垚鍛樿鎻愬彇鍑烘潵鏀懼湪紼嬪簭鐨勯潤鎬佹暟鎹尯鍐咃紝涓鴻綾繪墍鏈夊璞″叡浜紝鍥犳鍙瓨鍦ㄤ竴浠姐?br>闈欐佸拰闈為潤鎬佹垚鍛樺嚱鏁版渶緇堥兘琚彁鍙栧嚭鏉ユ斁鍦ㄧ▼搴忕殑浠g爜孌典腑騫朵負璇ョ被鎵鏈夊璞″叡浜紝鍥犳姣忎竴涓垚鍛樺嚱鏁頒篃鍙兘瀛樺湪涓浠戒唬鐮佸疄浣撱?br>鍥犳錛屾瀯鎴愬璞℃湰韜殑鍙湁鏁版嵁錛屼換浣曟垚鍛樺嚱鏁伴兘涓嶉毝灞炰簬浠諱綍涓涓璞★紝闈為潤鎬佹垚鍛樺嚱鏁頒笌瀵硅薄鐨勫叧緋誨氨鏄粦瀹氾紝緇戝畾鐨勪腑浠嬪氨鏄痶his鎸囬拡銆?br>鎴愬憳鍑芥暟涓鴻綾繪墍鏈夊璞″叡浜紝涓嶄粎鏄浜庣畝鍖栬璦瀹炵幇銆佽妭鐪佸瓨鍌ㄧ殑鐩殑錛岃屼笖鏄負浜嗕嬌鍚岀被瀵硅薄鏈変竴鑷寸殑琛屼負銆傚悓綾誨璞$殑琛屼負铏界劧涓鑷達紝浣嗘槸鎿嶄綔涓嶅悓鐨勬暟鎹垚鍛樸?br> */



pear_li 2009-03-11 15:36 鍙戣〃璇勮
]]>閫氳繃閲嶈澆new鍜宒elete瀹炵幇綆鍗曠殑瀵硅薄姹?http://www.shnenglu.com/dawnbreak/articles/76229.htmlpear_lipear_liWed, 11 Mar 2009 07:33:00 GMThttp://www.shnenglu.com/dawnbreak/articles/76229.htmlhttp://www.shnenglu.com/dawnbreak/comments/76229.htmlhttp://www.shnenglu.com/dawnbreak/articles/76229.html#Feedback1http://www.shnenglu.com/dawnbreak/comments/commentRss/76229.htmlhttp://www.shnenglu.com/dawnbreak/services/trackbacks/76229.html閫氳繃閲嶈澆new鍜宒elete瀹炵幇綆鍗曠殑瀵硅薄姹?

瀵硅薄姹犵殑鐢ㄩ斿湪榪欓噷灝變笉浠嬬粛浜嗭紝鏈緥涓彧鏄叾涓涓畝鍗曠殑瀹炵幇銆?

#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;
}



pear_li 2009-03-11 15:33 鍙戣〃璇勮
]]>
C++瀵硅薄鍐呭瓨妯″瀷http://www.shnenglu.com/dawnbreak/articles/76224.htmlpear_lipear_liWed, 11 Mar 2009 06:36:00 GMThttp://www.shnenglu.com/dawnbreak/articles/76224.htmlhttp://www.shnenglu.com/dawnbreak/comments/76224.htmlhttp://www.shnenglu.com/dawnbreak/articles/76224.html#Feedback0http://www.shnenglu.com/dawnbreak/comments/commentRss/76224.htmlhttp://www.shnenglu.com/dawnbreak/services/trackbacks/76224.html

鐢變簬縐嶇鍘熷洜錛屾垜浠棤娉曚繚璇佹墍鏈夐氳繃new鍦╤eap涓敵璇風殑鍐呭瓨璧勬簮閮藉畨鍏ㄥ湴寰楀埌閲婃斁錛屼緥濡傦細

class base{...};
void f()
{
   base* ptr = new base;
   ...
   delete ptr;
}

榪欐牱涓緋誨垪鎿嶄綔涓紝鍦?..."涓彲鑳戒細鎶涘嚭寮傚父錛屾渶緇堝鑷磀elete鏃犳硶寰楀埌鎵ц錛屼簬鏄氨閫犳垚浜嗗唴瀛樻硠闇層傚敖綆℃垜浠彲浠ヨ娉曢伩鍏嶅湪"..."涓姏鍑哄紓甯革紝浣嗘槸錛屽浜庡悗鏉ョ淮鎶ゅ拰淇敼榪欐浠g爜浜嗕漢鍛樻潵璇達紝寰堝彲鑳藉姞鍏ヤ竴浜涙帶鍒舵祦錛屼粠鑰岃繃鏃╁湴浠庡嚱鏁頒粠涓繑鍥烇紝鍐呭瓨娉勯湶鍐嶆鍙戠敓銆?/p>

涓縐嶈В鍐充箣閬撳氨鏄紝灝嗚祫婧愬皝瑁呭湪涓涓被涓紝鍒╃敤綾葷殑鏋愭瀯鍑芥暟鏉ラ噴鏀捐璧勬簮錛岃繖鏍蜂竴鏉ワ紝鏃犺鏄綍縐嶆柟寮忛鍑篺()鍑芥暟鐨勪綔鐢ㄥ煙錛岀被鐨勬瀽鏋勫嚱鏁版繪槸浼氳璋冪敤錛屼粠鑰屾湁鏁堝湴閬垮厤浜嗚祫婧愭硠闇層?/p>

auto_ptr灝辨槸榪欑鏂規硶鐨勪竴縐嶅吀鍨嬪簲鐢ㄣ傚畠琚О涓烘櫤鑳芥寚閽堬紝鏄竴涓ā鏉跨被銆傚0鏄庝竴涓彧鑳芥寚閽堢殑鏂規硶鏄細auto_ptr ptr(new T);涓轟簡璇存槑auto_ptr鐨勭敤娉曪紝涓嬮潰鏄竴涓叿浣撶殑渚嬪瓙錛?/p>

#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;
}

linux涓嬶紝g++緙栬瘧鍣ㄧ殑杈撳嚭緇撴灉濡備笅錛?br>~$ g++ test.cpp -o test
~$ ./test
test_org():
demo()
test_auto():
demo()
~demo()



pear_li 2009-03-11 14:36 鍙戣〃璇勮
]]>
濡備綍媯嫻嬪唴瀛樻硠婕忊斺旈噸杞絥ew鍜宒eletehttp://www.shnenglu.com/dawnbreak/articles/76223.htmlpear_lipear_liWed, 11 Mar 2009 06:33:00 GMThttp://www.shnenglu.com/dawnbreak/articles/76223.htmlhttp://www.shnenglu.com/dawnbreak/comments/76223.htmlhttp://www.shnenglu.com/dawnbreak/articles/76223.html#Feedback0http://www.shnenglu.com/dawnbreak/comments/commentRss/76223.htmlhttp://www.shnenglu.com/dawnbreak/services/trackbacks/76223.html鏈枃鍙互琚嚜鐢辮漿杞斤紝浣嗘槸蹇呴』閬靛驚濡備笅鐗堟潈綰﹀畾錛?
1銆佷繚鐣欐湰綰﹀畾錛屽茍淇濈暀鍦ㄦ枃绔犵殑寮澶撮儴鍒嗐?
2銆佷笉鑳戒換鎰忎慨鏀規枃绔犲唴瀹癸紝鎴栬呭垹鑺傦紝澧炲姞銆傚鏋滆涓烘湰鏂囧唴瀹規湁涓嶅綋涔嬪闇瑕佷慨鏀癸紝璇?
涓庝綔鑰呰仈緋匯?
3銆佷笉鑳芥憳鎶勬湰鏂囩殑鍐呭錛屽繀欏誨叏鏂囧彂琛ㄦ垨鑰呭紩鐢ㄣ?
4銆佸繀欏諱繚鐣欎綔鑰呯講鍚嶃佹敞鏄庢枃绔犲嚭澶勩傦紙鏈枃鎺堟潈緇檞ww.linuxaid.com.cn錛?
5銆佸涓嶉伒瀹堟湰瑙勫畾錛屽垯鏃犳潈杞澆鏈枃銆?nbsp;
浣滆?
ariesram
鐢靛瓙閭歡鍦板潃
ariesram@linuxaid.com.cn, 鎴?nbsp;ariesram@may10.ca
鏈枃鍙婃湰浜烘墍鏈夋枃绔犲潎鏀墮泦鍦╞ambi.may10.ca/~ariesram/articles/涓?
鏈枃鎺堟潈緇檞ww.linuxaid.com.cn銆?

姝f枃錛?
鎴戞浘緇忓弬涓庤繃涓涓瘮杈冨ぇ鐨勯」鐩紝鍦ㄨ繖涓」鐩噷闈紝鎴戜滑娌℃湁涓涓畬鍏ㄧ‘瀹氱殑璁捐鏂囨。錛屾墍浠ョ▼搴忕殑瀹炵幇甯稿父鍙樺姩銆傝櫧鐒舵垜浠湁涓涓瘮杈冪伒媧葷殑妗嗘灦錛屼絾鏄粠紼嬪簭鐨勮搴︽潵璁詫紝瀹冧嬌鎴戜滑鐨勭▼搴忛潪甯哥殑娣蜂貢銆傜洿鍒板彂甯冪殑鏃ユ湡涓磋繎錛屾垜浠繕娌℃湁涓涓ǔ瀹氱殑鍙互鐢ㄦ潵鍋歛lpha嫻嬭瘯鐨勭増鏈傛墍浠ユ垜浠繀欏誨敖蹇殑鍒犻櫎鎺夋棤鐢ㄧ殑浠g爜錛岃榪欎釜鐗堟湰瓚沖鐨勭ǔ瀹氥備絾鏄紝鍦ㄨ繖涓病鏈夎凍澶熻鑼冪殑杞歡鍏徃錛屾垜浠病鏈夋椂闂翠篃娌℃湁瓚沖鐨勭簿鍔涙潵鍋氳竟鐣屾祴璇曚箣綾葷殑宸ヤ綔銆傛墍浠ユ垜浠彧鑳介噰鐢ㄥ彉閫氱殑鍔炴硶銆傚湪杞歡涓渶澶х殑闂灝辨槸鍐呭瓨娉勬紡銆傚洜涓哄線寰鍑虹幇榪欐牱鐨勬儏鍐碉紝鎴戜滑鍦ㄤ竴孌典唬鐮佷腑鍒嗛厤浜嗗唴瀛橈紝浣嗘槸鍗存病鏈夐噴鏀懼畠銆傝繖閫犳垚浜嗗緢澶х殑闂銆傛垜浠渶瑕佷竴涓畝鍗曠殑瑙e喅鏂規錛岃兘澶熺畝鍗曠殑緙栬瘧榪涜繖涓」鐩紝鍦ㄨ繍琛岀殑鏃跺欙紝瀹冭兘澶熶駭鐢熶竴涓病鏈夎閲婃斁鐨勫唴瀛樼殑鍒楄〃錛岀敤榪欎釜鍒楄〃錛屾垜浠兘澶熸敼姝g▼搴忕殑閿欒銆傝繖灝辨槸鎴戜滑縐頒箣涓哄唴瀛樿窡韙殑鏂規硶銆傞鍏堬紝鎴戜滑闇瑕佷竴縐嶄唬鐮侊紝鑳藉琚姞鍏ュ埌婧愪唬鐮佷腑鍘伙紝鑰屼笖榪欑浠g爜鑳藉琚噸鐢ㄣ備唬鐮侀噸鐢ㄦ槸涓縐嶅緢閲嶈鐨勭壒鎬э紝鑳藉鑺傜渷澶ч噺鐨勬椂闂村拰閲戦挶浠ュ強紼嬪簭鍛樼殑鍔沖姩銆傚彟澶栵紝鎴戜滑鐨勮繖縐嶄唬鐮佸繀欏葷畝鍗曪紝鍥犱負鎴戜滑褰撴椂宸茬粡娌℃湁閭d箞澶氱殑鏃墮棿鍜岀簿鍔涘幓瀹屽叏閲嶇湅涓閬嶆墍鏈夌殑浠g爜鏉ラ噸鏂扮紪鍐欎互鍙婃敼姝i敊璇粠鑰屼嬌鍐呭瓨璺熻釜鑳藉璧蜂綔鐢ㄣ?

濂藉湪錛屾垜浠昏兘澶熸壘鍒拌В鍐崇殑鍔炴硶銆傞鍏堬紝鎴戜滑媯鏌ヤ簡浠g爜錛屽彂鐜版墍鏈夌殑浠g爜閮芥槸鐢╪ew鏉ュ垎閰嶅唴瀛橈紝鐢╠elete鏉ラ噴鏀懼唴瀛樸傞偅涔堬紝鎴戜滑鑳藉鐢ㄤ竴涓叏紼嬫浛鎹紝鏉ユ浛鎹㈡帀鎵鏈夌殑new鍜宒elete鎿嶄綔絎﹀悧錛熶笉鑳姐傚洜涓轟唬鐮佺殑瑙勬ā澶ぇ浜嗭紝閭f牱鍋氶櫎浜嗘氮璐規椂闂存病鏈夊埆鐨勪換浣曞ソ澶勩傚ソ鍦ㄦ垜浠殑婧愪唬鐮佹槸鐢–++鏉ュ啓鎴愮殑錛屾墍浠ワ紝榪欐剰鍛崇潃娌℃湁蹇呰鏇挎崲鎺夋墍鏈夌殑new鍜宒elete,鑰屽彧鐢ㄩ噸杞借繖涓や釜鎿嶄綔絎︺傚浜嗭紝鍊肩敤閲嶈澆榪欎袱涓搷浣滅錛屾垜浠氨鑳藉湪鍒嗛厤鍜岄噴鏀懼唴瀛樹箣鍓嶅仛鐐逛粈涔堛傝繖鏄竴涓粷瀵圭殑濂芥秷鎭傛垜浠篃鐭ラ亾璇ュ浣曞幓鍋氥傚洜涓猴紝MFC涔熸槸榪欎箞鍋氱殑銆傛垜浠渶瑕佸仛鐨勬槸錛氳窡韙墍鏈夌殑鍐呭瓨鍒嗛厤鍜屼氦浜掑紩鐢ㄤ互鍙婂唴瀛橀噴鏀俱傛垜浠殑婧愪唬鐮佷嬌鐢╒isual C++鍐欐垚錛屽綋鐒惰繖縐嶈В鍐蟲柟娉曚篃鍙互寰堣交鏉劇殑浣跨敤鍦ㄥ埆鐨凜++浠g爜閲岄潰銆傝鍋氱殑絎竴浠朵簨鎯呮槸閲嶈澆new鍜宒elete鎿嶄綔絎︼紝瀹冧滑灝嗕細鍦ㄦ墍鏈夌殑浠g爜涓浣跨敤鍒般傛垜浠湪stdafx.h涓紝鍔犲叆錛?
#ifdef _DEBUG
inline void * __cdecl operator new(unsigned int size, 
const char *file, int line)
{
};

inline void __cdecl operator delete(void *p)
{
};
#endif
榪欐牱錛屾垜浠氨閲嶈澆浜唍ew鍜宒elete鎿嶄綔絎︺傛垜浠敤$ifdef鍜?endif鏉ュ寘浣忚繖涓や釜閲嶈澆鎿嶄綔絎︼紝榪欐牱錛岃繖涓や釜鎿嶄綔絎﹀氨涓嶄細鍦ㄥ彂甯冪増鏈腑鍑虹幇銆傜湅涓鐪嬭繖孌典唬鐮侊紝浼氬彂鐜幫紝new鎿嶄綔絎︽湁涓変釜鍙傛暟錛屽畠浠槸錛屽垎閰嶇殑鍐呭瓨澶у皬錛屽嚭鐜扮殑鏂囦歡鍚嶏紝鍜岃鍙楓傝繖瀵逛簬瀵繪壘鍐呭瓨娉勬紡鏄繀闇鐨勫拰閲嶈鐨勩傚惁鍒欙紝灝變細闇瑕佸緢澶氭椂闂村幓瀵繪壘瀹冧滑鍑虹幇鐨勭‘鍒囧湴鏂廣傚姞鍏ヤ簡榪欐浠g爜錛屾垜浠殑璋冪敤new()鐨勪唬鐮佷粛鐒舵槸鎸囧悜鍙帴鍙椾竴涓弬鏁扮殑new鎿嶄綔絎︼紝鑰屼笉鏄繖涓帴鍙椾笁涓弬鏁扮殑鎿嶄綔絎︺傚彟澶栵紝鎴戜滑涔熶笉鎯寵褰曟墍鏈夌殑new鎿嶄綔絎︾殑璇彞鍘誨寘鍚玙_FILE__鍜宊_LINE__鍙傛暟銆傛垜浠渶瑕佸仛鐨勬槸鑷姩鐨勮鎵鏈夌殑鎺ュ彈涓涓弬鏁扮殑new鎿嶄綔絎﹁皟鐢ㄦ帴鍙椾笁涓弬鏁扮殑new鎿嶄綔絎︺傝繖涓鐐瑰彲浠ョ敤涓鐐圭偣灝忕殑鎶宸у幓鍋氾紝渚嬪涓嬮潰鐨勮繖涓孌靛畯瀹氫箟錛?
#ifdef _DEBUG
#define DEBUG_NEW new(__FILE__, __LINE__)
#else
#define DEBUG_NEW new
#endif
#define new DEBUG_NEW
鐜板湪鎴戜滑鎵鏈夌殑鎺ュ彈涓涓弬鏁扮殑new鎿嶄綔絎﹂兘鎴愪負浜嗘帴鍙椾笁涓弬鏁扮殑new鎿嶄綔絎﹀彿錛宊_FILE__鍜宊_LINE__琚緙栬瘧鍣ㄨ嚜鍔ㄧ殑鎻掑叆鍒板叾涓簡銆傜劧鍚庯紝灝辨槸浣滃疄闄呯殑璺熻釜浜嗐傛垜浠渶瑕佸姞鍏ヤ竴浜涗緥紼嬪埌鎴戜滑鐨勯噸杞界殑鍑芥暟涓幓錛岃瀹冧滑鑳藉瀹屾垚鍒嗛厤鍐呭瓨鍜岄噴鏀懼唴瀛樼殑宸ヤ綔銆傝繖鏍鋒潵鍋氾紝 #ifdef _DEBUG
inline void * __cdecl operator new(unsigned int size,
const char *file, int line)
{
void *ptr = (void *)malloc(size);
AddTrack((DWORD)ptr, size, file, line);
return(ptr);
};
inline void __cdecl operator delete(void *p)
{
RemoveTrack((DWORD)p);
free(p);
};
#endif
鍙﹀錛岃繕闇瑕佺敤鐩稿悓鐨勬柟娉曟潵閲嶈澆new[]鍜宒elete[]鎿嶄綔絎︺傝繖閲屽氨鐪佺暐鎺夊畠浠簡銆?
鏈鍚庯紝鎴戜滑闇瑕佹彁渚涗竴濂楀嚱鏁癆ddTrack()鍜孯emoveTrack()銆傛垜鐢⊿TL鏉ョ淮鎶ゅ瓨鍌ㄥ唴瀛樺垎閰嶈褰曠殑榪炴帴琛ㄣ?
榪欎袱涓嚱鏁板涓嬶細
typedef struct {
DWORD address;
DWORD size;
char file[64];
DWORD line;
} ALLOC_INFO;

typedef list<ALLOC_INFO*> AllocList;

AllocList *allocList;

void AddTrack(DWORD addr, DWORD asize, const char *fname, DWORD lnum)
{
ALLOC_INFO *info;

if(!allocList) {
allocList = new(AllocList);
}

info = new(ALLOC_INFO);
info->address = addr;
strncpy(info->file, fname, 63);
info->line = lnum;
info->size = asize;
allocList->insert(allocList->begin(), info);
};

void RemoveTrack(DWORD addr)
{
AllocList::iterator i;

if(!allocList)
return;
for(i = allocList->begin(); i != allocList->end(); i++)
{
if((*i)->address == addr)
{
allocList->remove((*i));
break;
}
}
};
鐜板湪錛屽湪鎴戜滑鐨勭▼搴忛鍑轟箣鍓嶏紝allocList瀛樺偍浜嗘病鏈夎閲婃斁鐨勫唴瀛樺垎閰嶃備負浜嗙湅鍒板畠浠槸浠涔堝拰鍦ㄥ摢閲岃鍒嗛厤鐨勶紝鎴戜滑闇瑕佹墦鍗板嚭allocList涓殑鏁版嵁銆傛垜浣跨敤浜哣isual C++涓殑Output紿楀彛鏉ュ仛榪欎歡浜嬫儏銆?
void DumpUnfreed()
{
AllocList::iterator i;
DWORD totalSize = 0;
char buf[1024];

if(!allocList)
return;

for(i = allocList->begin(); i != allocList->end(); i++) {
sprintf(buf, "%-50s: LINE %d, ADDRESS %d %d unfreed ",
(*i)->file, (*i)->line, (*i)->address, (*i)->size);
OutputDebugString(buf);
totalSize += (*i)->size;
}
sprintf(buf, "----------------------------------------------------------- ");
OutputDebugString(buf);
sprintf(buf, "Total Unfreed: %d bytes ", totalSize);
OutputDebugString(buf);
};
鐜板湪鎴戜滑灝辨湁浜嗕竴涓彲浠ラ噸鐢ㄧ殑浠g爜錛岀敤鏉ョ洃嫻嬭窡韙墍鏈夌殑鍐呭瓨娉勬紡浜嗐傝繖孌典唬鐮佸彲浠ョ敤鏉ュ姞鍏ュ埌鎵鏈夌殑欏圭洰涓幓銆傝櫧鐒跺畠涓嶄細璁╀綘鐨勭▼搴忕湅璧鋒潵鏇村ソ錛屼絾鏄搗鐮佸畠鑳藉甯姪浣犳鏌ラ敊璇紝璁╃▼搴忔洿鍔犵殑紼沖畾銆?

pear_li 2009-03-11 14:33 鍙戣〃璇勮
]]>
C++鐨勭被鍨嬭漿鎹㈢錛歴tatic_cast銆乨ynamic_cast銆乺einterpret_cast銆佸拰const_cast 寰堝叏闈?/title><link>http://www.shnenglu.com/dawnbreak/articles/68122.html</link><dc:creator>pear_li</dc:creator><author>pear_li</author><pubDate>Fri, 28 Nov 2008 17:53:00 GMT</pubDate><guid>http://www.shnenglu.com/dawnbreak/articles/68122.html</guid><wfw:comment>http://www.shnenglu.com/dawnbreak/comments/68122.html</wfw:comment><comments>http://www.shnenglu.com/dawnbreak/articles/68122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/dawnbreak/comments/commentRss/68122.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/dawnbreak/services/trackbacks/68122.html</trackback:ping><description><![CDATA[<div id="hvzpftn" class="postText"> <p style="font-family: 鏂板畫浣?"><font size="2">浣跨敤鏍囧噯C++鐨勭被鍨嬭漿鎹㈢錛歴tatic_cast銆乨ynamic_cast銆乺einterpret_cast銆佸拰const_cast銆?/font></p> <p style="font-family: 鏂板畫浣?"><font size="2">3.1 static_cast<br>鐢ㄦ硶錛歴tatic_cast < type-id > ( expression )      <br>璇ヨ繍綆楃鎶奺xpression杞崲涓簍ype-id綾誨瀷錛屼絾娌℃湁榪愯鏃剁被鍨嬫鏌ユ潵淇濊瘉杞崲鐨勫畨鍏ㄦс傚畠涓昏鏈夊涓嬪嚑縐嶇敤娉曪細<br>鈶犵敤浜庣被灞傛緇撴瀯涓熀綾誨拰瀛愮被涔嬮棿鎸囬拡鎴栧紩鐢ㄧ殑杞崲銆?br>銆銆榪涜涓婅杞崲錛堟妸瀛愮被鐨勬寚閽堟垨寮曠敤杞崲鎴愬熀綾昏〃紺猴級鏄畨鍏ㄧ殑錛?br>銆銆榪涜涓嬭杞崲錛堟妸鍩虹被鎸囬拡鎴栧紩鐢ㄨ漿鎹㈡垚瀛愮被琛ㄧず錛夋椂錛岀敱浜庢病鏈夊姩鎬佺被鍨嬫鏌ワ紝鎵浠ユ槸涓嶅畨鍏ㄧ殑銆?br>鈶$敤浜庡熀鏈暟鎹被鍨嬩箣闂寸殑杞崲錛屽鎶奿nt杞崲鎴恈har錛屾妸int杞崲鎴恊num銆傝繖縐嶈漿鎹㈢殑瀹夊叏鎬т篃瑕佸紑鍙戜漢鍛樻潵淇濊瘉銆?br>鈶㈡妸絀烘寚閽堣漿鎹㈡垚鐩爣綾誨瀷鐨勭┖鎸囬拡銆?br>鈶f妸浠諱綍綾誨瀷鐨勮〃杈懼紡杞崲鎴恦oid綾誨瀷銆?/font></p> <p style="font-family: 鏂板畫浣?"><font size="2">娉ㄦ剰錛歴tatic_cast涓嶈兘杞崲鎺塭xpression鐨刢onst銆乿olitale銆佹垨鑰卂_unaligned灞炴с?/font></p> <p style="font-family: 鏂板畫浣?"><br><font size="2">3.2 dynamic_cast<br>鐢ㄦ硶錛歞ynamic_cast < type-id > ( expression )<br>璇ヨ繍綆楃鎶奺xpression杞崲鎴恡ype-id綾誨瀷鐨勫璞°俆ype-id蹇呴』鏄被鐨勬寚閽堛佺被鐨勫紩鐢ㄦ垨鑰卾oid *錛?br>濡傛灉type-id鏄被鎸囬拡綾誨瀷錛岄偅涔坋xpression涔熷繀欏繪槸涓涓寚閽堬紝濡傛灉type-id鏄竴涓紩鐢紝閭d箞expression涔熷繀欏繪槸涓涓紩鐢ㄣ?/font></p> <p style="font-family: 鏂板畫浣?"><font size="2">dynamic_cast涓昏鐢ㄤ簬綾誨眰嬈¢棿鐨勪笂琛岃漿鎹㈠拰涓嬭杞崲錛岃繕鍙互鐢ㄤ簬綾諱箣闂寸殑浜ゅ弶杞崲銆?br>鍦ㄧ被灞傛闂磋繘琛屼笂琛岃漿鎹㈡椂錛宒ynamic_cast鍜宻tatic_cast鐨勬晥鏋滄槸涓鏍風殑錛?br>鍦ㄨ繘琛屼笅琛岃漿鎹㈡椂錛宒ynamic_cast鍏鋒湁綾誨瀷媯鏌ョ殑鍔熻兘錛屾瘮static_cast鏇村畨鍏ㄣ?br>class B{<br>public:<br>       int m_iNum;<br>       virtual void foo();<br>};</font></p> <p style="font-family: 鏂板畫浣?"><font size="2">class D:public B{<br>    public:<br>       char *m_szName[100];<br>};</font></p> <p style="font-family: 鏂板畫浣?"><font size="2">void func(B *pb){<br>    D *pd1 = static_cast<D *>(pb);<br>    D *pd2 = dynamic_cast<D *>(pb);<br>}</font></p> <p style="font-family: 鏂板畫浣?"><font size="2">鍦ㄤ笂闈㈢殑浠g爜孌典腑錛屽鏋減b鎸囧悜涓涓狣綾誨瀷鐨勫璞★紝pd1鍜宲d2鏄竴鏍風殑錛屽茍涓斿榪欎袱涓寚閽堟墽琛孌綾誨瀷鐨勪換浣曟搷浣滈兘鏄畨鍏ㄧ殑錛?br>浣嗘槸錛屽鏋減b鎸囧悜鐨勬槸涓涓狟綾誨瀷鐨勫璞★紝閭d箞pd1灝嗘槸涓涓寚鍚戣瀵硅薄鐨勬寚閽堬紝瀵瑰畠榪涜D綾誨瀷鐨勬搷浣滃皢鏄笉瀹夊叏鐨勶紙濡傝闂甿_szName錛夛紝<br>鑰宲d2灝嗘槸涓涓┖鎸囬拡銆?/font></p> <p style="font-family: 鏂板畫浣?"><font size="2">鍙﹀瑕佹敞鎰忥細B瑕佹湁铏氬嚱鏁幫紝鍚﹀垯浼氱紪璇戝嚭閿欙紱static_cast鍒欐病鏈夎繖涓檺鍒躲?br>榪欐槸鐢變簬榪愯鏃剁被鍨嬫鏌ラ渶瑕佽繍琛屾椂綾誨瀷淇℃伅錛岃岃繖涓俊鎭瓨鍌ㄥ湪綾葷殑铏氬嚱鏁拌〃錛?br>鍏充簬铏氬嚱鏁拌〃鐨勬蹇碉紝璇︾粏鍙<Inside c++ object model>錛変腑錛屽彧鏈夊畾涔変簡铏氬嚱鏁扮殑綾繪墠鏈夎櫄鍑芥暟琛紝<br>娌℃湁瀹氫箟铏氬嚱鏁扮殑綾繪槸娌℃湁铏氬嚱鏁拌〃鐨勩?/font></p> <p style="font-family: 鏂板畫浣?"><font size="2">鍙﹀錛宒ynamic_cast榪樻敮鎸佷氦鍙夎漿鎹紙cross cast錛夈傚涓嬩唬鐮佹墍紺恒?br>class A{<br>public:<br>        int m_iNum;<br>        virtual void f(){}<br>};</font></p> <p style="font-family: 鏂板畫浣?"><font size="2">class B:public A{<br>};</font></p> <p style="font-family: 鏂板畫浣?"><font size="2">class D:public A{<br>};</font></p> <p style="font-family: 鏂板畫浣?"><font size="2">void foo(){<br>    B *pb = new B;<br>    pb->m_iNum = 100;</font></p> <p style="font-family: 鏂板畫浣?"><font size="2">    D *pd1 = static_cast<D *>(pb);    //compile error<br>    D *pd2 = dynamic_cast<D *>(pb);  //pd2 is NULL<br>    delete pb;<br>}</font></p> <p style="font-family: 鏂板畫浣?"><font size="2">鍦ㄥ嚱鏁癴oo涓紝浣跨敤static_cast榪涜杞崲鏄笉琚厑璁哥殑錛屽皢鍦ㄧ紪璇戞椂鍑洪敊錛涜屼嬌鐢?dynamic_cast鐨勮漿鎹㈠垯鏄厑璁哥殑錛岀粨鏋滄槸絀烘寚閽堛?/font></p> <p style="font-family: 鏂板畫浣?"><br><font size="2">3.3 reinpreter_cast<br>鐢ㄦ硶錛歳einpreter_cast<type-id> (expression)<br>type-id蹇呴』鏄竴涓寚閽堛佸紩鐢ㄣ佺畻鏈被鍨嬨佸嚱鏁版寚閽堟垨鑰呮垚鍛樻寚閽堛?br>瀹冨彲浠ユ妸涓涓寚閽堣漿鎹㈡垚涓涓暣鏁幫紝涔熷彲浠ユ妸涓涓暣鏁拌漿鎹㈡垚涓涓寚閽堬紙鍏堟妸涓涓寚閽堣漿鎹㈡垚涓涓暣鏁幫紝<br>鍦ㄦ妸璇ユ暣鏁拌漿鎹㈡垚鍘熺被鍨嬬殑鎸囬拡錛岃繕鍙互寰楀埌鍘熷厛鐨勬寚閽堝鹼級銆?/font></p> <p style="font-family: 鏂板畫浣?"><font size="2">璇ヨ繍綆楃鐨勭敤娉曟瘮杈冨銆?/font></p> <p style="font-family: 鏂板畫浣?"><font size="2">3.4 const_cast <br>鐢ㄦ硶錛歝onst_cast<type_id> (expression)<br>璇ヨ繍綆楃鐢ㄦ潵淇敼綾誨瀷鐨刢onst鎴杤olatile灞炴с傞櫎浜哻onst 鎴杤olatile淇グ涔嬪錛?type_id鍜宔xpression鐨勭被鍨嬫槸涓鏍風殑銆?br>甯擱噺鎸囬拡琚漿鍖栨垚闈炲父閲忔寚閽堬紝騫朵笖浠嶇劧鎸囧悜鍘熸潵鐨勫璞★紱<br>甯擱噺寮曠敤琚漿鎹㈡垚闈炲父閲忓紩鐢紝騫朵笖浠嶇劧鎸囧悜鍘熸潵鐨勫璞★紱甯擱噺瀵硅薄琚漿鎹㈡垚闈炲父閲忓璞°?/font></p> <p style="font-family: 鏂板畫浣?"><font size="2">Voiatile鍜宑onst綾昏瘯銆備婦濡備笅涓渚嬶細<br>class B{<br>public:<br>     int m_iNum;<br>}<br>void foo(){<br> const B b1;<br> b1.m_iNum = 100;            //comile error<br> B b2 = const_cast<B>(b1);<br> b2. m_iNum = 200;           //fine<br>}<br>涓婇潰鐨勪唬鐮佺紪璇戞椂浼氭姤閿欙紝鍥犱負b1鏄竴涓父閲忓璞★紝涓嶈兘瀵瑰畠榪涜鏀瑰彉錛?br>浣跨敤const_cast鎶婂畠杞崲鎴愪竴涓父閲忓璞★紝灝卞彲浠ュ瀹冪殑鏁版嵁鎴愬憳浠繪剰鏀瑰彉銆傛敞鎰忥細b1鍜宐2鏄袱涓笉鍚岀殑瀵硅薄銆?/font></p> </div><img src ="http://www.shnenglu.com/dawnbreak/aggbug/68122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/dawnbreak/" target="_blank">pear_li</a> 2008-11-29 01:53 <a href="http://www.shnenglu.com/dawnbreak/articles/68122.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <a href="http://www.shnenglu.com/">青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品</a> <div style="position:fixed;left:-9000px;top:-9000px;"><font id="pjuwb"></font><button id="pjuwb"><pre id="pjuwb"></pre></button><sub id="pjuwb"></sub><tbody id="pjuwb"><var id="pjuwb"><address id="pjuwb"></address></var></tbody><listing id="pjuwb"><label id="pjuwb"><strong id="pjuwb"></strong></label></listing><wbr id="pjuwb"><small id="pjuwb"><tbody id="pjuwb"></tbody></small></wbr><ins id="pjuwb"><xmp id="pjuwb"></xmp></ins><style id="pjuwb"></style><label id="pjuwb"><em id="pjuwb"><li id="pjuwb"></li></em></label><samp id="pjuwb"></samp><menu id="pjuwb"><input id="pjuwb"></input></menu><pre id="pjuwb"><tbody id="pjuwb"><tfoot id="pjuwb"><button id="pjuwb"></button></tfoot></tbody></pre><form id="pjuwb"></form><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"><sup id="pjuwb"></sup></label></style></i><li id="pjuwb"><table id="pjuwb"><abbr id="pjuwb"></abbr></table></li><video id="pjuwb"></video><dfn id="pjuwb"></dfn><progress id="pjuwb"></progress><strong id="pjuwb"></strong><mark id="pjuwb"></mark><em id="pjuwb"></em><tbody id="pjuwb"><p id="pjuwb"><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike></p></tbody><option id="pjuwb"></option><strike id="pjuwb"></strike><u id="pjuwb"></u><td id="pjuwb"><center id="pjuwb"><tr id="pjuwb"></tr></center></td><em id="pjuwb"><mark id="pjuwb"><em id="pjuwb"><tt id="pjuwb"></tt></em></mark></em><strong id="pjuwb"></strong><wbr id="pjuwb"></wbr><s id="pjuwb"></s><strong id="pjuwb"></strong><legend id="pjuwb"></legend><nav id="pjuwb"></nav><dl id="pjuwb"><th id="pjuwb"><dl id="pjuwb"></dl></th></dl><noframes id="pjuwb"><ins id="pjuwb"></ins></noframes><font id="pjuwb"></font><strike id="pjuwb"><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"></label></style></i></strike><output id="pjuwb"></output><thead id="pjuwb"><pre id="pjuwb"></pre></thead><source id="pjuwb"></source><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem><pre id="pjuwb"><span id="pjuwb"><pre id="pjuwb"><big id="pjuwb"></big></pre></span></pre><cite id="pjuwb"><fieldset id="pjuwb"><s id="pjuwb"><rt id="pjuwb"></rt></s></fieldset></cite><big id="pjuwb"><progress id="pjuwb"><big id="pjuwb"></big></progress></big><samp id="pjuwb"><delect id="pjuwb"></delect></samp><dl id="pjuwb"></dl><strike id="pjuwb"><nav id="pjuwb"><dl id="pjuwb"><strong id="pjuwb"></strong></dl></nav></strike><tbody id="pjuwb"><b id="pjuwb"><optgroup id="pjuwb"><rp id="pjuwb"></rp></optgroup></b></tbody><em id="pjuwb"></em><xmp id="pjuwb"><blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote></xmp> <i id="pjuwb"><abbr id="pjuwb"><i id="pjuwb"><abbr id="pjuwb"></abbr></i></abbr></i><center id="pjuwb"><acronym id="pjuwb"><center id="pjuwb"></center></acronym></center><pre id="pjuwb"></pre><ul id="pjuwb"><thead id="pjuwb"></thead></ul><blockquote id="pjuwb"><pre id="pjuwb"><sup id="pjuwb"></sup></pre></blockquote><acronym id="pjuwb"></acronym><big id="pjuwb"><s id="pjuwb"></s></big><th id="pjuwb"></th><th id="pjuwb"></th><tbody id="pjuwb"></tbody><thead id="pjuwb"><strike id="pjuwb"></strike></thead><th id="pjuwb"><dl id="pjuwb"><wbr id="pjuwb"></wbr></dl></th><dl id="pjuwb"><strong id="pjuwb"></strong></dl><abbr id="pjuwb"><noframes id="pjuwb"><noscript id="pjuwb"></noscript></noframes></abbr><td id="pjuwb"><ol id="pjuwb"></ol></td><li id="pjuwb"><noscript id="pjuwb"><abbr id="pjuwb"></abbr></noscript></li><small id="pjuwb"><bdo id="pjuwb"><nav id="pjuwb"></nav></bdo></small><style id="pjuwb"></style><optgroup id="pjuwb"><table id="pjuwb"></table></optgroup><center id="pjuwb"><tr id="pjuwb"><dfn id="pjuwb"></dfn></tr></center><th id="pjuwb"></th><u id="pjuwb"></u><tfoot id="pjuwb"><legend id="pjuwb"><i id="pjuwb"></i></legend></tfoot><mark id="pjuwb"></mark><meter id="pjuwb"></meter><nav id="pjuwb"></nav><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><nobr id="pjuwb"></nobr><sub id="pjuwb"><th id="pjuwb"><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem></th></sub><thead id="pjuwb"><sub id="pjuwb"></sub></thead><ul id="pjuwb"><address id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></address></ul><dfn id="pjuwb"></dfn><pre id="pjuwb"></pre><input id="pjuwb"><cite id="pjuwb"><fieldset id="pjuwb"></fieldset></cite></input><u id="pjuwb"><form id="pjuwb"><u id="pjuwb"></u></form></u><kbd id="pjuwb"><em id="pjuwb"><mark id="pjuwb"></mark></em></kbd><tr id="pjuwb"></tr><del id="pjuwb"><form id="pjuwb"><address id="pjuwb"></address></form></del><tfoot id="pjuwb"><legend id="pjuwb"><ol id="pjuwb"><dl id="pjuwb"></dl></ol></legend></tfoot><menu id="pjuwb"><nobr id="pjuwb"><th id="pjuwb"><nobr id="pjuwb"></nobr></th></nobr></menu><fieldset id="pjuwb"></fieldset><pre id="pjuwb"><blockquote id="pjuwb"><samp id="pjuwb"></samp></blockquote></pre><xmp id="pjuwb"><sup id="pjuwb"><pre id="pjuwb"></pre></sup></xmp><span id="pjuwb"><progress id="pjuwb"></progress></span><font id="pjuwb"></font><var id="pjuwb"><abbr id="pjuwb"></abbr></var><strong id="pjuwb"><label id="pjuwb"><i id="pjuwb"><legend id="pjuwb"></legend></i></label></strong><tr id="pjuwb"><em id="pjuwb"><em id="pjuwb"><output id="pjuwb"></output></em></em></tr><thead id="pjuwb"><strike id="pjuwb"></strike></thead> <acronym id="pjuwb"></acronym><i id="pjuwb"></i><tt id="pjuwb"></tt><rt id="pjuwb"><source id="pjuwb"><rt id="pjuwb"></rt></source></rt><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike><del id="pjuwb"></del><font id="pjuwb"><output id="pjuwb"><ins id="pjuwb"><output id="pjuwb"></output></ins></output></font><kbd id="pjuwb"><tr id="pjuwb"><kbd id="pjuwb"></kbd></tr></kbd><pre id="pjuwb"><sup id="pjuwb"><delect id="pjuwb"><samp id="pjuwb"></samp></delect></sup></pre><samp id="pjuwb"></samp><track id="pjuwb"></track><tr id="pjuwb"></tr><center id="pjuwb"></center><fieldset id="pjuwb"></fieldset><i id="pjuwb"></i><td id="pjuwb"></td><rt id="pjuwb"></rt><object id="pjuwb"></object><pre id="pjuwb"><progress id="pjuwb"><sub id="pjuwb"><thead id="pjuwb"></thead></sub></progress></pre><kbd id="pjuwb"><tr id="pjuwb"><option id="pjuwb"></option></tr></kbd><output id="pjuwb"><ins id="pjuwb"></ins></output><ol id="pjuwb"></ol><source id="pjuwb"></source><strong id="pjuwb"></strong><ruby id="pjuwb"></ruby><sub id="pjuwb"><meter id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></meter></sub><pre id="pjuwb"></pre><center id="pjuwb"></center><tr id="pjuwb"><tbody id="pjuwb"><xmp id="pjuwb"><dd id="pjuwb"></dd></xmp></tbody></tr><video id="pjuwb"></video><pre id="pjuwb"></pre><form id="pjuwb"><optgroup id="pjuwb"></optgroup></form><samp id="pjuwb"></samp><kbd id="pjuwb"></kbd><strong id="pjuwb"><option id="pjuwb"></option></strong><object id="pjuwb"></object><abbr id="pjuwb"><noframes id="pjuwb"><abbr id="pjuwb"></abbr></noframes></abbr><ul id="pjuwb"><del id="pjuwb"><button id="pjuwb"><pre id="pjuwb"></pre></button></del></ul><abbr id="pjuwb"></abbr><strong id="pjuwb"><code id="pjuwb"><strong id="pjuwb"></strong></code></strong><option id="pjuwb"></option><optgroup id="pjuwb"><bdo id="pjuwb"><code id="pjuwb"></code></bdo></optgroup><mark id="pjuwb"><em id="pjuwb"><font id="pjuwb"></font></em></mark><acronym id="pjuwb"><code id="pjuwb"></code></acronym><dl id="pjuwb"></dl><em id="pjuwb"></em><object id="pjuwb"><input id="pjuwb"><object id="pjuwb"></object></input></object><output id="pjuwb"><dd id="pjuwb"></dd></output><option id="pjuwb"><button id="pjuwb"><option id="pjuwb"></option></button></option><small id="pjuwb"></small></div> <a href="http://221080.com" target="_blank">一本色道久久88综合日韩精品</a>| <a href="http://www-132377.com" target="_blank">久久视频在线免费观看</a>| <a href="http://bnb-gndc.com" target="_blank">欧美福利影院</a>| <a href="http://y65c.com" target="_blank">欧美国产高清</a>| <a href="http://329374.com" target="_blank">亚洲一区二区三区免费观看</a>| <a href="http://7788444.com" target="_blank">日韩亚洲欧美一区</a>| <a href="http://wnboke.com" target="_blank">国产欧美精品一区二区色综合</a>| <a href="http://hkbsi.com" target="_blank">欧美与黑人午夜性猛交久久久</a>| <a href="http://ssss96.com" target="_blank">亚洲视频在线观看三级</a>| <a href="http://wltaste.com" target="_blank">国产日产欧美a一级在线</a>| <a href="http://749996.com" target="_blank">浪潮色综合久久天堂</a>| <a href="http://77smsm.com" target="_blank">欧美搞黄网站</a>| <a href="http://95gun.com" target="_blank">久久www免费人成看片高清</a>| <a href="http://y9z8.com" target="_blank">久久精品国产99精品国产亚洲性色 </a>| <a href="http://888nei.com" target="_blank">欧美日韩亚洲一区二</a>| <a href="http://7kz6.com" target="_blank">亚洲综合视频1区</a>| <a href="http://aqdav81.com" target="_blank">欧美在线看片</a>| <a href="http://6168138.com" target="_blank">99精品视频网</a>| <a href="http://sththg.com" target="_blank">性欧美暴力猛交另类hd</a>| <a href="http://www92y.com" target="_blank">亚洲国产一区二区三区在线播 </a>| <a href="http://114mz.com" target="_blank">夜夜嗨av一区二区三区</a>| <a href="http://www-77663.com" target="_blank">国产亚洲欧美日韩精品</a>| <a href="http://2456yo.com" target="_blank">亚洲国产精品久久人人爱蜜臀</a>| <a href="http://moonshile.com" target="_blank">嫩草国产精品入口</a>| <a href="http://86808a.com" target="_blank">欧美亚洲一区二区在线</a>| <a href="http://kpd034.com" target="_blank">麻豆91精品</a>| <a href="http://99chiji1.com" target="_blank">欧美一级淫片aaaaaaa视频</a>| <a href="http://dddd30.com" target="_blank">久久久噜噜噜</a>| <a href="http://caosee.com" target="_blank">先锋影音久久久</a>| <a href="http://ss2ssc.com" target="_blank">欧美国产精品v</a>| <a href="http://0000zz.com" target="_blank">久久国产主播精品</a>| <a href="http://yzstbjt.com" target="_blank">欧美日韩国产黄</a>| <a href="http://2589999.com" target="_blank">美女视频一区免费观看</a>| <a href="http://sifeksa.com" target="_blank">欧美亚韩一区</a>| <a href="http://tristooges.com" target="_blank">欧美激情一区二区三区全黄</a>| <a href="http://596361.com" target="_blank">国产精品久久久久av</a>| <a href="http://cibocentre.com" target="_blank">欧美成人午夜剧场免费观看</a>| <a href="http://wilcherish.com" target="_blank">国产精品乱码一区二区三区</a>| <a href="http://5767j.com" target="_blank">亚洲电影在线看</a>| <a href="http://timonna.com" target="_blank">国产一区二区在线观看免费播放</a>| <a href="http://dddd30.com" target="_blank">亚洲精品国产精品乱码不99</a>| <a href="http://mmpzyw.com" target="_blank">极品尤物一区二区三区</a>| <a href="http://tuokuba520.com" target="_blank">欧美大片在线看</a>| <a href="http://9lunli.com" target="_blank">午夜精品久久久久久久久久久久久</a>| <a href="http://coerverbeijing.com" target="_blank">亚洲一区二区四区</a>| <a href="http://y9z8.com" target="_blank">日韩一级在线观看</a>| <a href="http://baoyou118.com" target="_blank">久久久xxx</a>| <a href="http://66669801.com" target="_blank">久久成人18免费网站</a>| <a href="http://www5xzz1.com" target="_blank">欧美日韩国产精品成人</a>| <a href="http://qvod777.com" target="_blank">欧美激情一区二区三区</a>| <a href="http://dgxinshidai.com" target="_blank">一区在线观看</a>| <a href="http://aberyco.com" target="_blank">欧美一区二区三区的</a>| <a href="http://845821.com" target="_blank">亚洲你懂的在线视频</a>| <a href="http://budanbao.com" target="_blank">欧美精品在线免费</a>| <a href="http://889028.com" target="_blank">亚洲国产1区</a>| <a href="http://www-5013.com" target="_blank">亚洲电影免费在线观看</a>| <a href="http://739822.com" target="_blank">久久精品国产久精国产思思</a>| <a href="http://seqing9.com" target="_blank">久久av一区二区三区</a>| <a href="http://2225101.com" target="_blank">国产精品久久久久久av福利软件 </a>| <a href="http://439368.com" target="_blank">欧美精品日韩一本</a>| <a href="http://6w7y.com" target="_blank">欧美顶级艳妇交换群宴</a>| <a href="http://551692.com" target="_blank">在线成人激情黄色</a>| <a href="http://193youwu.com" target="_blank">久久亚洲影院</a>| <a href="http://taotuango.com" target="_blank">欧美福利网址</a>| <a href="http://5418002.com" target="_blank">亚洲精品日日夜夜</a>| <a href="http://ddixx.com" target="_blank">欧美日韩999</a>| <a href="http://www18818.com" target="_blank">99热精品在线</a>| <a href="http://chongpiapia.com" target="_blank">亚洲欧美日韩精品一区二区</a>| <a href="http://038226.com" target="_blank">国产精品黄页免费高清在线观看</a>| <a href="http://48488a.com" target="_blank">一区二区精品国产</a>| <a href="http://559dd.com" target="_blank">午夜亚洲性色福利视频</a>| <a href="http://72966t.com" target="_blank">国产精品青草综合久久久久99</a>| <a href="http://fuqiba.com" target="_blank">亚洲性感激情</a>| <a href="http://gzpurefaith.com" target="_blank">久久se精品一区精品二区</a>| <a href="http://xingzhiyin85.com" target="_blank">国产精品一区二区a</a>| <a href="http://5599912.com" target="_blank">欧美一级欧美一级在线播放</a>| <a href="http://yjizz08.com" target="_blank">久久久久久高潮国产精品视</a>| <a href="http://junmatek.com" target="_blank">国内久久婷婷综合</a>| <a href="http://yp8882.com" target="_blank">蜜桃av久久久亚洲精品</a>| <a href="http://3597777.com" target="_blank">亚洲第一毛片</a>| <a href="http://xyyssa.com" target="_blank">亚洲自拍三区</a>| <a href="http://www3344cao.com" target="_blank">国产日韩欧美在线看</a>| <a href="http://338pv.com" target="_blank">久久久久久综合网天天</a>| <a href="http://www-42189.com" target="_blank">欧美激情一区二区三区全黄</a>| <a href="http://2387463.com" target="_blank">中国成人在线视频</a>| <a href="http://ylnnc.com" target="_blank">国产免费观看久久</a>| <a href="http://119553.com" target="_blank">久久青草福利网站</a>| <a href="http://cancerrxa.com" target="_blank">亚洲精品欧美在线</a>| <a href="http://chaxiangmall.com" target="_blank">香蕉成人啪国产精品视频综合网</a>| <a href="http://www11111111.com" target="_blank">国产日韩欧美日韩</a>| <a href="http://mm77gg.com" target="_blank">欧美成人蜜桃</a>| <a href="http://sewuyueyue.com" target="_blank">亚洲一区二区视频在线观看</a>| <a href="http://2456yo.com" target="_blank">噜噜噜91成人网</a>| <a href="http://739822.com" target="_blank">亚洲图片激情小说</a>| <a href="http://baidijs.com" target="_blank">国产资源精品在线观看</a>| <a href="http://hgx123.com" target="_blank">欧美激情在线观看</a>| <a href="http://mishangmi.com" target="_blank">亚洲曰本av电影</a>| <a href="http://961318.com" target="_blank">欧美第十八页</a>| <a href="http://qqszdq.com" target="_blank">久久国产精品久久久</a>| <a href="http://667939.com" target="_blank">亚洲免费精彩视频</a>| <a href="http://dayomall.com" target="_blank">国产日韩亚洲欧美综合</a>| <a href="http://ddnwater.com" target="_blank">欧美高清视频在线播放</a>| <a href="http://797298.com" target="_blank">亚洲欧美日韩精品综合在线观看</a>| <a href="http://215920.com" target="_blank">免费av成人在线</a>| <a href="http://www-787788.com" target="_blank">亚洲视屏在线播放</a>| <a href="http://ythbhg.com" target="_blank">亚洲高清视频在线观看</a>| <a href="http://342889.com" target="_blank">欧美午夜久久</a>| <a href="http://wanmajc.com" target="_blank">免播放器亚洲一区</a>| <a href="http://xzvaz.com" target="_blank">韩国av一区二区三区在线观看</a>| <a href="http://132653.com" target="_blank">欧美亚洲第一页</a>| <a href="http://6k7a.com" target="_blank">久久国产精品72免费观看</a>| <a href="http://ww4477.com" target="_blank">亚洲毛片视频</a>| <a href="http://004ttt.com" target="_blank">欧美成人激情在线</a>| <a href="http://budanbao.com" target="_blank">欧美亚洲综合久久</a>| <a href="http://wwwlywbb.com" target="_blank">99视频在线精品国自产拍免费观看</a>| <a href="http://www280999.com" target="_blank">国产欧美一区二区视频</a>| <a href="http://www-440447.com" target="_blank">欧美裸体一区二区三区</a>| <a href="http://aaa798.com" target="_blank">久久久精品日韩欧美</a>| <a href="http://bnb-gndc.com" target="_blank">亚洲夜晚福利在线观看</a>| <a href="http://ynzhuoyi.com" target="_blank">91久久综合亚洲鲁鲁五月天</a>| <a href="http://www-800778.com" target="_blank">久久综合中文字幕</a>| <a href="http://coolpaly.com" target="_blank">欧美一区二视频</a>| <a href="http://122332.com" target="_blank">亚洲免费人成在线视频观看</a>| <a href="http://www993997.com" target="_blank">亚洲人成人99网站</a>| <a href="http://800716.com" target="_blank">黄色资源网久久资源365</a>| <a href="http://qqx123.com" target="_blank">国产精品亚洲片夜色在线</a>| <a href="http://749996.com" target="_blank">欧美—级a级欧美特级ar全黄</a>| <a href="http://ydy8.com" target="_blank">久久亚洲国产成人</a>| <a href="http://aimashe.com" target="_blank">欧美在线欧美在线</a>| <a href="http://hbdfgq.com" target="_blank">亚洲——在线</a>| <a href="http://esdzu.com" target="_blank">亚洲影院在线观看</a>| <a href="http://132653.com" target="_blank">在线中文字幕日韩</a>| <a href="http://qscxx3.com" target="_blank">亚洲靠逼com</a>| <a href="http://8eeeccc.com" target="_blank">最新日韩中文字幕</a>| <a href="http://kdy444.com" target="_blank">亚洲国产99精品国自产</a>| <a href="http://aotaotao.com" target="_blank">欧美xxxx在线观看</a>| <a href="http://ncyy4.com" target="_blank">老司机亚洲精品</a>| <a href="http://ywy99.com" target="_blank">麻豆乱码国产一区二区三区</a>| <a href="http://xunlei520.com" target="_blank">久久久久久久综合日本</a>| <a href="http://928uc.com" target="_blank">久久激情久久</a>| <a href="http://exsecular.com" target="_blank">久久精品国产精品亚洲综合</a>| <a href="http://608u.com" target="_blank">久久成人精品无人区</a>| <a href="http://guanghezixun.com" target="_blank">午夜精品久久久久久久久久久久</a>| <a href="http://798200.com" target="_blank">亚洲一区在线看</a>| <a href="http://03qt.com" target="_blank">亚洲欧美在线aaa</a>| <a href="http://bjjxgcsxy.com" target="_blank">性做久久久久久久久</a>| <a href="http://ridenimbus.com" target="_blank">亚欧美中日韩视频</a>| <a href="http://18loutv.com" target="_blank">久久精品91久久香蕉加勒比</a>| <a href="http://951738.com" target="_blank">久久国产直播</a>| <a href="http://www224558.com" target="_blank">美女精品网站</a>| <a href="http://b1768.com" target="_blank">91久久国产综合久久蜜月精品 </a>| <a href="http://whmingtong.com" target="_blank">亚洲日本中文字幕</a>| <a href="http://www-444454.com" target="_blank">亚洲精品国产系列</a>| <a href="http://poqsoft.com" target="_blank">一区二区三区高清视频在线观看</a>| <a href="http://911mmm.com" target="_blank">一区二区欧美在线</a>| <a href="http://335848.com" target="_blank">亚洲一区图片</a>| <a href="http://1588vip.com" target="_blank">久久精品国产一区二区电影</a>| <a href="http://www-401313.com" target="_blank">久久婷婷久久一区二区三区</a>| <a href="http://0999555.com" target="_blank">免费影视亚洲</a>| <a href="http://jafzjz.com" target="_blank">欧美视频中文一区二区三区在线观看 </a>| <a href="http://kanebocos.com" target="_blank">中文精品在线</a>| <a href="http://www-067.com" target="_blank">欧美一级视频精品观看</a>| <a href="http://my6557.com" target="_blank">久久久久女教师免费一区</a>| <a href="http://zyjzz.com" target="_blank">美女精品在线观看</a>| <a href="http://buyiker.com" target="_blank">欧美日韩国产首页</a>| <a href="http://cancerrxa.com" target="_blank">国产精品试看</a>| <a href="http://by99969.com" target="_blank">亚洲国产成人91精品</a>| <a href="http://xss521.com" target="_blank">99riav国产精品</a>| <a href="http://www280999.com" target="_blank">香蕉成人久久</a>| <a href="http://zz-777.com" target="_blank">欧美成人在线网站</a>| <a href="http://nebnb89.com" target="_blank">99视频精品全部免费在线</a>| <a href="http://17vx.com" target="_blank">亚洲欧美日韩国产精品</a>| <a href="http://13501680.com" target="_blank">久久综合导航</a>| <a href="http://avicpharm.com" target="_blank">欧美性大战久久久久久久蜜臀</a>| <a href="http://05511253.com" target="_blank">国产欧美日韩视频一区二区三区 </a>| <a href="http://www227ee.com" target="_blank">最新69国产成人精品视频免费</a>| <a href="http://6633kj.com" target="_blank">亚洲视频在线看</a>| <a href="http://59812mh.com" target="_blank">久久乐国产精品</a>| <a href="http://feiniao168.com" target="_blank">亚洲精品国产精品乱码不99</a>| <a href="http://winkwink333.com" target="_blank">亚洲一区免费网站</a>| <a href="http://444398.com" target="_blank">中国女人久久久</a>| <a href="http://555hhu.com" target="_blank">久久久视频精品</a>| <a href="http://am3757.com" target="_blank">欧美福利在线观看</a>| <a href="http://jnhrjixie.com" target="_blank">亚洲一区中文</a>| <a href="http://xmzszx.com" target="_blank">欧美~级网站不卡</a>| <a href="http://5e5b7g.com" target="_blank">国产精品亚洲片夜色在线</a>| <a href="http://444398.com" target="_blank">亚洲国内精品在线</a>| <a href="http://www-11688.com" target="_blank">欧美一区二区三区免费在线看 </a>| <a href="http://kanebocos.com" target="_blank">久久综合中文字幕</a>| <a href="http://5yy6.com" target="_blank">一本色道久久综合狠狠躁的推荐</a>| <a href="http://609t.com" target="_blank">久久亚洲春色中文字幕久久久</a>| <a href="http://cn1898.com" target="_blank">欧美午夜视频一区二区</a>| <a href="http://pron12.com" target="_blank">亚洲国产精品久久</a>| <a href="http://changjiucf.com" target="_blank">久久成年人视频</a>| <a href="http://6633kj.com" target="_blank">一本色道久久99精品综合</a>| <a href="http://free18teen.com" target="_blank">乱中年女人伦av一区二区</a>| <a href="http://138128.com" target="_blank">国产日韩av在线播放</a>| <a href="http://9486322.com" target="_blank">亚洲一区二区精品视频</a>| <a href="http://hafenchen.com" target="_blank">亚洲第一毛片</a>| <a href="http://www-37277.com" target="_blank">久久久久久香蕉网</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>