锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
浣嗕笉鍚屾搷浣滅郴緇熺殑鍔ㄦ佸簱鐢變簬鏍煎紡 涓嶅悓錛屽湪闇瑕佷笉鍚屾搷浣滅郴緇熻皟鐢ㄦ椂闇瑕佽繘琛屽姩鎬佸簱紼嬪簭縐繪銆傛湰鏂囧垎鏋愬拰姣旇緝浜嗕袱縐嶆搷浣滅郴緇熷姩鎬佸簱鎶鏈紝騫剁粰鍑轟簡灝哣isual C++緙栧埗鐨勫姩鎬佸簱縐繪鍒癓inux涓婄殑鏂規(guī)硶鍜岀粡楠屻?
1銆佸紩璦
鍔ㄦ佸簱錛圖ynamic Link Library abbr錛孌LL錛夋妧鏈槸紼嬪簭璁捐涓粡甯擱噰鐢ㄧ殑鎶鏈傚叾鐩殑鍑忓皯紼嬪簭鐨勫ぇ灝忥紝鑺傜渷絀洪棿錛屾彁楂樻晥鐜囷紝鍏鋒湁寰堥珮鐨勭伒媧繪с?
閲囩敤鍔ㄦ佸簱鎶鏈浜庡崌綰ц蔣浠剁増鏈洿鍔犲鏄撱備笌闈欐佸簱錛圫tatic Link Library錛変笉鍚岋紝鍔ㄦ佸簱閲岄潰鐨勫嚱鏁頒笉鏄墽琛岀▼搴忔湰韜殑涓閮ㄥ垎錛岃屾槸鏍規(guī)嵁鎵ц闇瑕佹寜闇杞藉叆錛屽叾鎵ц浠g爜鍙互鍚屾椂鍦ㄥ涓▼搴忎腑鍏變韓銆?
鍦?Windows鍜孡inux鎿嶄綔緋葷粺涓紝閮藉彲閲囩敤榪欑鏂瑰紡榪涜杞歡璁捐錛屼絾浠栦滑鐨勮皟鐢ㄦ柟寮忎互鍙婄▼搴忕紪鍒舵柟寮忎笉灝界浉鍚屻傛湰鏂囬鍏堝垎鏋愪簡鍦ㄨ繖涓ょ鎿嶄綔緋葷粺涓氬父閲囩敤鐨勫姩鎬佸簱璋冪敤鏂規(guī)硶浠ュ強紼嬪簭緙栧埗鏂瑰紡錛岀劧鍚庡垎鏋愭瘮杈冧簡榪欎袱縐嶆柟寮忕殑涓嶅悓涔嬪錛屾渶鍚庢牴鎹疄闄呯Щ妞嶇▼搴忕粡楠岋紝浠嬬粛浜嗗皢VC++緙栧埗鐨刉indows鍔ㄦ佸簱縐繪鍒癓inux涓嬬殑鏂規(guī)硶銆?
2銆佸姩鎬佸簱鎶鏈?
2.1 Windows鍔ㄦ佸簱鎶鏈?
鍔ㄦ侀摼鎺ュ簱鏄疄鐜癢indows搴旂敤紼嬪簭鍏變韓璧勬簮銆佽妭鐪佸唴瀛樼┖闂淬佹彁楂樹嬌鐢ㄦ晥鐜囩殑涓涓噸瑕佹妧鏈墜孌點傚父瑙佺殑鍔ㄦ佸簱鍖呭惈澶栭儴鍑芥暟鍜岃祫婧愶紝涔熸湁涓浜涘姩鎬佸簱鍙寘鍚祫婧愶紝濡俉indows瀛椾綋璧勬簮鏂囦歡錛岀О涔嬩負璧勬簮鍔ㄦ侀摼鎺ュ簱銆傞氬父鍔ㄦ佸簱浠?dll錛?drv銆?fon絳変綔涓哄悗緙銆?
鐩稿簲鐨剋indows闈欐佸簱閫氬父浠?lib緇撳熬錛學indows鑷繁灝卞皢涓浜涗富瑕佺殑緋葷粺鍔熻兘浠ュ姩鎬佸簱妯″潡鐨勫艦寮忓疄鐜般?
Windows鍔ㄦ佸簱鍦ㄨ繍琛屾椂琚郴緇熷姞杞藉埌榪涚▼鐨勮櫄鎷熺┖闂翠腑錛屼嬌鐢ㄤ粠璋冪敤榪涚▼鐨勮櫄鎷熷湴鍧絀洪棿鍒嗛厤鐨勫唴瀛橈紝鎴愪負璋冪敤榪涚▼鐨勪竴閮ㄥ垎銆侱LL涔熷彧鑳借璇ヨ繘紼嬬殑綰跨▼鎵璁塊棶銆侱LL鐨勫彞鏌勫彲浠ヨ璋冪敤榪涚▼浣跨敤錛涜皟鐢ㄨ繘紼嬬殑鍙ユ焺鍙互琚獶LL浣跨敤銆?
DLL 妯″潡涓寘鍚悇縐嶅鍑哄嚱鏁幫紝鐢ㄤ簬鍚戝鐣屾彁渚涙湇鍔°侱LL鍙互鏈夎嚜宸辯殑鏁版嵁孌碉紝浣嗘病鏈夎嚜宸辯殑鍫嗘爤錛屼嬌鐢ㄤ笌璋冪敤瀹冪殑搴旂敤紼嬪簭鐩稿悓鐨勫爢鏍堟ā寮忥紱涓涓狣LL鍦ㄥ唴瀛樹腑鍙湁涓涓疄渚嬶紱DLL瀹炵幇浜嗕唬鐮佸皝瑁呮э紱DLL鐨勭紪鍒朵笌鍏蜂綋鐨勭紪紼嬭璦鍙婄紪璇戝櫒鏃犲叧錛屽彲浠ラ氳繃DLL鏉ュ疄鐜版販鍚堣璦緙栫▼銆侱LL鍑芥暟涓殑浠g爜鎵鍒涘緩鐨勪換浣曞璞★紙鍖呮嫭鍙橀噺錛夐兘褰掕皟鐢ㄥ畠鐨勭嚎紼嬫垨榪涚▼鎵鏈夈?
鏍規(guī)嵁璋冪敤鏂瑰紡鐨勪笉鍚岋紝瀵瑰姩鎬佸簱鐨勮皟鐢ㄥ彲鍒嗕負闈欐佽皟鐢ㄦ柟寮忓拰鍔ㄦ佽皟鐢ㄦ柟寮忋?
(1) 闈欐佽皟鐢紝涔熺О涓洪殣寮忚皟鐢紝鐢辯紪璇戠郴緇熷畬鎴愬DLL鐨勫姞杞藉拰搴旂敤紼嬪簭緇撴潫鏃禗LL鍗歌澆鐨勭紪鐮侊紙Windows緋葷粺璐熻矗瀵笵LL璋冪敤嬈℃暟鐨勮鏁幫級錛岃皟鐢ㄦ柟寮忕畝鍗曪紝鑳藉婊¤凍閫氬父鐨勮姹傘傞氬父閲囩敤鐨勮皟鐢ㄦ柟寮忔槸鎶婁駭鐢熷姩鎬佽繛鎺ュ簱鏃朵駭鐢熺殑.LIB鏂囦歡鍔犲叆鍒板簲鐢ㄧ▼搴忕殑宸ョ▼涓紝鎯充嬌鐢―LL涓殑鍑芥暟鏃訛紝鍙』鍦ㄦ簮鏂囦歡涓0鏄庝竴涓嬨?
LIB鏂囦歡鍖呭惈浜嗘瘡涓涓狣LL瀵煎嚭鍑芥暟鐨勭鍙峰悕鍜屽彲閫夋嫨鐨勬爣璇嗗彿浠ュ強DLL鏂囦歡鍚嶏紝涓嶅惈鏈夊疄闄呯殑浠g爜銆侺ib鏂囦歡鍖呭惈鐨勪俊鎭繘鍏ュ埌鐢熸垚鐨勫簲鐢ㄧ▼搴忎腑錛岃璋冪敤鐨凞LL鏂囦歡浼氬湪搴旂敤紼嬪簭鍔犺澆鏃跺悓鏃跺姞杞藉湪鍒板唴瀛樹腑銆?
(2)鍔ㄦ佽皟鐢紝鍗蟲樉寮忚皟鐢ㄦ柟寮忥紝鏄敱緙栫▼鑰呯敤API鍑芥暟鍔犺澆鍜屽嵏杞紻LL鏉ヨ揪鍒拌皟鐢―LL鐨勭洰鐨勶紝姣旇緝澶嶆潅錛屼絾鑳芥洿鍔犳湁鏁堝湴浣跨敤鍐呭瓨錛屾槸緙栧埗澶у瀷搴旂敤紼嬪簭鏃剁殑閲嶈鏂瑰紡銆傚湪Windows緋葷粺涓紝涓庡姩鎬佸簱璋冪敤鏈夊叧鐨勫嚱鏁板寘鎷細
①LoadLibrary錛堟垨MFC 鐨凙fxLoadLibrary錛夛紝瑁呰澆鍔ㄦ佸簱銆?
②GetProcAddress錛岃幏鍙栬寮曞叆鐨勫嚱鏁幫紝灝嗙鍙峰悕鎴栨爣璇嗗彿杞崲涓篋LL鍐呴儴鍦板潃銆?
③FreeLibrary錛堟垨MFC鐨凙fxFreeLibrary錛夛紝閲婃斁鍔ㄦ侀摼鎺ュ簱銆?
鍦?windows涓垱寤哄姩鎬佸簱涔熼潪甯告柟渚垮拰綆鍗曘傚湪Visual C++涓紝鍙互鍒涘緩涓嶇敤MFC鑰岀洿鎺ョ敤C璇█鍐欑殑DLL紼嬪簭錛屼篃鍙互鍒涘緩鍩轟簬MFC綾誨簱鐨凞LL紼嬪簭銆傛瘡涓涓狣LL蹇呴』鏈変竴涓叆鍙g偣錛屽湪VC++ 涓紝DllMain鏄竴涓己鐪佺殑鍏ュ彛鍑芥暟銆侱llMain璐熻矗鍒濆鍖?Initialization)鍜岀粨鏉?Termination)宸ヤ綔銆?
鍔ㄦ佸簱杈撳嚭鍑芥暟涔熸湁涓ょ綰﹀畾錛屽垎鍒槸鍩轟簬璋冪敤綰﹀畾鍜屽悕瀛椾慨楗扮害瀹氥侱LL紼嬪簭瀹氫箟鐨勫嚱鏁板垎涓哄唴閮ㄥ嚱鏁板拰瀵煎嚭鍑芥暟錛屽姩鎬佸簱瀵煎嚭鐨勫嚱鏁頒緵鍏跺畠紼嬪簭妯″潡璋冪敤銆傞氬父鍙互鏈変笅闈㈠嚑縐嶆柟娉曞鍑哄嚱鏁幫細
①閲囩敤妯″潡瀹氫箟鏂囦歡鐨凟XPORT閮ㄥ垎鎸囧畾瑕佽緭鍏ョ殑鍑芥暟鎴栬呭彉閲忋?
②浣跨敤MFC鎻愪緵鐨勪慨楗扮鍙穇declspec(dllexport)銆?
③浠ュ懡浠よ鏂瑰紡錛岄噰鐢?EXPORT鍛戒護琛岃緭鍑烘湁鍏沖嚱鏁般?
鍦╳indows鍔ㄦ佸簱涓紝鏈夋椂闇瑕佺紪鍐欐ā鍧楀畾涔夋枃浠?.DEF)錛屽畠鏄敤浜庢弿榪癉LL灞炴х殑妯″潡璇彞緇勬垚鐨勬枃鏈枃浠躲?
2.2 Linux鍏變韓瀵硅薄鎶鏈?
鍦?Linux鎿嶄綔緋葷粺涓紝閲囩敤浜嗗緢澶氬叡浜璞℃妧鏈紙Shared Object錛夛紝铏界劧瀹冨拰Windows閲岀殑鍔ㄦ佸簱鐩稿搴旓紝浣嗗畠騫朵笉縐頒負鍔ㄦ佸簱銆傜浉搴旂殑鍏變韓瀵硅薄鏂囦歡浠?so浣滀負鍚庣紑錛屼負浜嗘柟渚匡紝鍦ㄦ湰鏂囦腑錛屽璇ユ蹇典笉榪涜涓撻棬鍖哄垎銆侺inux緋葷粺鐨?lib浠ュ強鏍囧噯鍥懼艦鐣岄潰鐨?usr/X11R6/lib絳夌洰褰曢噷闈紝灝辨湁璁稿浠o緇撳熬鐨勫叡浜璞°?
鍚屾牱錛屽湪Linux涓嬶紝涔熸湁闈欐佸嚱鏁板簱榪欑璋冪敤鏂瑰紡錛岀浉搴旂殑鍚庣紑浠?a緇撴潫銆侺inux閲囩敤璇ュ叡浜璞℃妧鏈互鏂逛究紼嬪簭闂村叡浜紝鑺傜渷紼嬪簭鍗犳湁絀洪棿錛屽鍔犵▼搴忕殑鍙墿灞曟у拰鐏墊椿鎬с侺inux榪樺彲浠ラ氳繃LD-PRELOAD鍙橀噺璁╁紑鍙戜漢鍛樺彲浠ヤ嬌鐢ㄨ嚜宸辯殑紼嬪簭搴撲腑鐨勬ā鍧楁潵鏇挎崲緋葷粺妯″潡銆?
鍚?Windows緋葷粺涓鏍鳳紝鍦↙inux涓垱寤哄拰浣跨敤鍔ㄦ佸簱鏄瘮杈冨鏄撶殑浜嬫儏錛屽湪緙栬瘧鍑芥暟搴撴簮紼嬪簭鏃跺姞涓?shared閫夐」鍗沖彲錛岃繖鏍鋒墍鐢熸垚鐨勬墽琛岀▼搴忓氨鏄姩鎬侀摼鎺ュ簱銆傞氬父榪欐牱鐨勭▼搴忎互so涓哄悗緙錛屽湪Linux鍔ㄦ佸簱紼嬪簭璁捐榪囩▼涓紝閫氬父嫻佺▼鏄紪鍐欑敤鎴風殑鎺ュ彛鏂囦歡錛岄氬父鏄?h鏂囦歡錛岀紪鍐欏疄闄呯殑鍑芥暟鏂囦歡錛屼互.c鎴?cpp涓哄悗緙錛屽啀緙栧啓makefile鏂囦歡銆傚浜庤緝?yōu)畯鐨勫姩鎬佸簱紼嬪簭鍙互涓嶇敤濡傛錛屼絾榪欐牱璁捐浣跨▼搴忔洿鍔犲悎鐞嗐?
緙栬瘧鐢熸垚鍔ㄦ佽繛鎺ュ簱鍚庯紝榪涜屽彲浠ュ湪紼嬪簭涓繘琛岃皟鐢ㄣ傚湪Linux涓紝鍙互閲囩敤澶氱璋冪敤鏂瑰紡錛屽悓Windows鐨勭郴緇熺洰褰?..\system32絳?涓鏍鳳紝鍙互灝嗗姩鎬佸簱鏂囦歡鎷瘋礉鍒?lib鐩綍鎴栬呭湪/lib鐩綍閲岄潰寤虹珛絎﹀彿榪炴帴錛屼互渚挎墍鏈夌敤鎴蜂嬌鐢ㄣ?
涓嬮潰浠嬬粛Linux璋冪敤鍔ㄦ佸簱緇忓父浣跨敤鐨勫嚱鏁幫紝浣嗗湪浣跨敤鍔ㄦ佸簱鏃訛紝婧愮▼搴忓繀欏誨寘鍚玠lfcn.h澶存枃浠訛紝璇ユ枃浠跺畾涔夎皟鐢ㄥ姩鎬侀摼鎺ュ簱鐨勫嚱鏁扮殑鍘熷瀷銆?
(1)_鎵撳紑鍔ㄦ侀摼鎺ュ簱錛歞lopen錛屽嚱鏁板師鍨媣oid *dlopen (const char *filename, int flag); dlopen鐢ㄤ簬鎵撳紑鎸囧畾鍚嶅瓧(filename)鐨勫姩鎬侀摼鎺ュ簱錛屽茍榪斿洖鎿嶄綔鍙ユ焺銆?
(2)鍙栧嚱鏁版墽琛屽湴鍧錛歞lsym錛屽嚱鏁板師鍨嬩負: void *dlsym(void *handle, char *symbol); dlsym鏍規(guī)嵁鍔ㄦ侀摼鎺ュ簱鎿嶄綔鍙ユ焺(handle)涓庣鍙?symbol)錛岃繑鍥炵鍙峰搴旂殑鍑芥暟鐨勬墽琛屼唬鐮佸湴鍧銆?
(3)鍏抽棴鍔ㄦ侀摼鎺ュ簱錛歞lclose錛屽嚱鏁板師鍨嬩負: int dlclose (void *handle); dlclose鐢ㄤ簬鍏抽棴鎸囧畾鍙ユ焺鐨勫姩鎬侀摼鎺ュ簱錛屽彧鏈夊綋姝ゅ姩鎬侀摼鎺ュ簱鐨勪嬌鐢ㄨ鏁頒負0鏃?鎵嶄細鐪熸琚郴緇熷嵏杞姐?
(4)鍔ㄦ佸簱閿欒鍑芥暟錛歞lerror錛屽嚱鏁板師鍨嬩負: const char *dlerror(void); 褰撳姩鎬侀摼鎺ュ簱鎿嶄綔鍑芥暟鎵ц澶辮觸鏃訛紝dlerror鍙互榪斿洖鍑洪敊淇℃伅錛岃繑鍥炲間負NULL鏃惰〃紺烘搷浣滃嚱鏁版墽琛屾垚鍔熴?
鍦ㄥ彇鍒板嚱鏁版墽琛屽湴鍧鍚庯紝灝卞彲浠ュ湪鍔ㄦ佸簱鐨勪嬌鐢ㄧ▼搴忛噷闈㈡牴鎹姩鎬佸簱鎻愪緵鐨勫嚱鏁版帴鍙e0鏄庤皟鐢ㄥ姩鎬佸簱閲岄潰鐨勫嚱鏁般傚湪緙栧啓璋冪敤鍔ㄦ佸簱鐨勭▼搴忕殑makefile鏂囦歡鏃訛紝闇瑕佸姞鍏ョ紪璇戦夐」-rdynamic鍜?ldl銆?
闄や簡閲囩敤榪欑鏂瑰紡緙栧啓鍜岃皟鐢ㄥ姩鎬佸簱涔嬪錛孡inux鎿嶄綔緋葷粺涔熸彁渚涗簡涓縐嶆洿涓烘柟渚跨殑鍔ㄦ佸簱璋冪敤鏂瑰紡錛屼篃鏂逛究浜嗗叾瀹冪▼搴忚皟鐢紝榪欑鏂瑰紡涓嶹indows緋葷粺鐨勯殣寮忛摼鎺ョ被浼箋傚叾鍔ㄦ佸簱鍛藉悕鏂瑰紡涓?#8220;lib*.so.*”銆傚湪榪欎釜鍛藉悕鏂瑰紡涓紝絎竴涓?琛ㄧず鍔ㄦ侀摼鎺ュ簱鐨勫簱鍚嶏紝絎簩涓?閫氬父琛ㄧず璇ュ姩鎬佸簱鐨勭増鏈彿錛屼篃鍙互娌℃湁鐗堟湰鍙楓?
鍦ㄨ繖縐嶈皟鐢ㄦ柟寮忎腑錛岄渶瑕佺淮鎶ゅ姩鎬侀摼鎺ュ簱鐨勯厤緗枃浠?etc /ld.so.conf鏉ヨ鍔ㄦ侀摼鎺ュ簱涓虹郴緇熸墍浣跨敤錛岄氬父灝嗗姩鎬侀摼鎺ュ簱鎵鍦ㄧ洰褰曞悕榪藉姞鍒板姩鎬侀摼鎺ュ簱閰嶇疆鏂囦歡涓傚鍏鋒湁X window紿楀彛緋葷粺鍙戣鐗堣鏂囦歡涓兘鍏鋒湁/usr/X11R6/lib錛屽畠鎸囧悜X window紿楀彛緋葷粺鐨勫姩鎬侀摼鎺ュ簱鎵鍦ㄧ洰褰曘?
涓轟簡浣垮姩鎬侀摼鎺ュ簱鑳戒負緋葷粺鎵鍏變韓錛岃繕闇榪愯鍔ㄦ侀摼鎺ュ簱鐨勭鐞嗗懡浠?/sbin/ldconfig銆傚湪緙栬瘧鎵寮曠敤鐨勫姩鎬佸簱鏃訛紝鍙互鍦╣cc閲囩敤 –l鎴?L閫夐」鎴栫洿鎺ュ紩鐢ㄦ墍闇鐨勫姩鎬侀摼鎺ュ簱鏂瑰紡榪涜緙栬瘧銆傚湪Linux閲岄潰錛屽彲浠ラ噰鐢╨dd鍛戒護鏉ユ鏌ョ▼搴忎緷璧栧叡浜簱銆?
3銆佷袱縐嶇郴緇熷姩鎬佸簱姣旇緝鍒嗘瀽
Windows鍜孡inux閲囩敤鍔ㄦ侀摼鎺ュ簱鎶鏈洰鐨勬槸鍩烘湰涓鑷寸殑錛屼絾鐢變簬鎿嶄綔緋葷粺鐨勪笉鍚岋紝浠栦滑鍦ㄨ澶氭柟闈㈣繕鏄笉灝界浉鍚岋紝涓嬮潰浠庝互涓嬪嚑涓柟闈㈣繘琛岄槓榪般?
(1) 鍔ㄦ佸簱紼嬪簭緙栧啓錛屽湪Windows緋葷粺涓嬬殑鎵ц鏂囦歡鏍煎紡鏄疨E鏍煎紡錛屽姩鎬佸簱闇瑕佷竴涓狣llMain鍑芥暟浣滀負鍒濆鍖栫殑浜哄彛錛岄氬父鍦ㄥ鍑哄嚱鏁扮殑澹版槑鏃墮渶瑕佹湁 _declspec(dllexport)鍏抽敭瀛椼侺inux涓嬬殑gcc緙栬瘧鐨勬墽琛屾枃浠墮粯璁ゆ槸ELF鏍煎紡錛屼笉闇瑕佸垵濮嬪寲鍏ュ彛錛屼害涓嶉渶瑕佸埌鍑芥暟鍋氱壒鍒0鏄庯紝緙栧啓姣旇緝鏂逛究銆?
(2)鍔ㄦ佸簱緙栬瘧錛屽湪windows緋葷粺涓嬮潰錛屾湁鏂逛究鐨勮皟璇曠紪璇戠幆澧冿紝閫氬父涓嶇敤鑷繁鍘葷紪鍐檓akefile鏂囦歡錛屼絾鍦╨inux涓嬮潰錛岄渶瑕佽嚜宸卞姩鎵嬪幓緙栧啓makefile鏂囦歡錛屽洜姝わ紝蹇呴』鎺屾彙涓瀹氱殑makefile緙栧啓鎶宸э紝鍙﹀錛岄氬父Linux緙栬瘧瑙勫垯鐩稿涓ユ牸銆?
(3)鍔ㄦ佸簱璋冪敤鏂歸潰錛學indows鍜孡inux瀵瑰叾涓嬬紪鍒剁殑鍔ㄦ佸簱閮藉彲浠ラ噰鐢ㄦ樉寮忚皟鐢ㄦ垨闅愬紡璋冪敤錛屼絾鍏蜂綋鐨勮皟鐢ㄦ柟寮忎篃涓嶅敖鐩稿悓銆?
(4) 鍔ㄦ佸簱杈撳嚭鍑芥暟鏌ョ湅錛屽湪Windows涓紝鏈夎澶氬伐鍏峰拰杞歡鍙互榪涜鏌ョ湅DLL涓墍杈撳嚭鐨勫嚱鏁幫紝渚嬪鍛戒護琛屾柟寮忕殑dumpbin浠ュ強VC++宸ュ叿涓殑 DEPENDS紼嬪簭銆傚湪Linux緋葷粺涓氬父閲囩敤nm鏉ユ煡鐪嬭緭鍑哄嚱鏁幫紝涔熷彲浠ヤ嬌鐢╨dd鏌ョ湅紼嬪簭闅愬紡閾炬帴鐨勫叡浜璞℃枃浠躲?
(5)瀵規(guī)搷浣滅郴緇熺殑渚濊禆錛岃繖涓ょ鍔ㄦ佸簱榪愯渚濊禆浜庡悇鑷殑鎿嶄綔緋葷粺錛屼笉鑳借法騫沖彴浣跨敤銆傚洜姝わ紝瀵逛簬瀹炵幇鐩稿悓鍔熻兘鐨勫姩鎬佸簱錛屽繀欏諱負涓ょ涓嶅悓鐨勬搷浣滅郴緇熸彁渚涗笉鍚岀殑鍔ㄦ佸簱鐗堟湰銆?
4銆佸姩鎬佸簱縐繪鏂規(guī)硶
濡傛灉瑕佺紪鍒跺湪涓や釜緋葷粺涓兘鑳戒嬌鐢ㄧ殑鍔ㄦ侀摼鎺ュ簱錛岄氬父浼氬厛閫夋嫨鍦╓indows鐨刅C++鎻愪緵鐨勮皟璇曠幆澧冧腑瀹屾垚鍒濆鐨勫紑鍙戯紝姣曠珶VC++鎻愪緵鐨勫浘褰㈠寲緙栬緫鍜岃皟璇曠晫闈㈡瘮vi鍜実cc鏂逛究璁稿銆傚畬鎴愭祴璇曚箣鍚庯紝鍐嶈繘琛屽姩鎬佸簱鐨勭▼搴忕Щ妞嶃?
閫氬父gcc榛樿鐨勭紪璇戣鍒欐瘮VC++榛樿鐨勭紪璇戣鍒欎弗鏍鹼紝鍗充嬌鍦╒C++涓嬮潰娌℃湁浠諱綍璀﹀憡閿欒鐨勭▼搴忓湪gcc璋冭瘯涓篃浼氬嚭鐜拌澶氳鍛婇敊璇紝鍙互鍦╣cc涓噰鐢?w閫夐」鍏抽棴璀﹀憡閿欒銆?
涓嬮潰緇欏嚭紼嬪簭縐繪闇瑕侀伒寰殑瑙勫垯浠ュ強緇忛獙銆?
(1) 灝介噺涓嶈鏀瑰彉鍘熸湁鍔ㄦ佸簱澶存枃浠剁殑欏哄簭銆傞氬父鍦–/C++璇█涓紝澶存枃浠剁殑欏哄簭鏈夌浉褰撶殑鍏崇郴銆傚彟澶栬櫧鐒禖/C++璇█鍖哄垎澶у皬鍐欙紝浣嗗湪鍖呭惈澶存枃浠舵椂錛孡inux蹇呴』涓庡ご鏂囦歡鐨勫ぇ灝忓啓鐩稿悓錛屽洜涓篹xt2鏂囦歡緋葷粺瀵規(guī)枃浠跺悕鏄ぇ灝忓啓鏁忔劅錛屽惁鍒欎笉鑳芥紜紪璇戯紝鑰屽湪Windows涓嬮潰錛屽ご鏂囦歡澶у皬鍐欏彲浠ユ紜紪璇戙?
(2)涓嶅悓緋葷粺鐙湁鐨勫ご鏂囦歡銆傚湪Windows緋葷粺涓紝閫氬父浼氬寘鎷?windows.h澶存枃浠訛紝濡傛灉璋冪敤搴曞眰鐨勯氫俊鍑芥暟錛屽垯浼氬寘鍚玾insock..h澶存枃浠躲傚洜姝ゅ湪縐繪鍒癓inux緋葷粺鏃訛紝瑕佹敞閲婃帀榪欎簺Windows緋葷粺鐙湁鐨勫ご鏂囦歡浠ュ強涓浜泈indows緋葷粺鐨勫父閲忓畾涔夎鏄庯紝澧炲姞Linux閮藉簳灞傞氫俊鐨勬敮鎸佺殑澶存枃浠剁瓑銆?
(3) 鏁版嵁綾誨瀷銆俈C++鍏鋒湁璁稿鐙湁鐨勬暟鎹被鍨嬶紝濡俖_int16錛宊_int32錛孴RUE錛孲OCKET絳夛紝gcc緙栬瘧鍣ㄤ笉鏀寔瀹冧滑銆傞氬父鍋氭硶鏄渶瑕佸皢 windows.h鍜宐asetypes.h涓榪欎簺鏁版嵁榪涜瀹氫箟鐨勮鍙ュ鍒跺埌涓涓ご鏂囦歡涓紝鍐嶅湪Linux涓寘鍚繖涓ご鏂囦歡銆備緥濡傚皢濂楁帴瀛楃殑綾誨瀷涓?SOCKET鏀逛負int銆?
(4)鍏抽敭瀛椼俈C++涓叿鏈夎澶氭爣鍑咰涓墍娌℃湁閲囩敤鐨勫叧閿瓧錛屽BOOL錛孊YTE錛孌WORD錛宊_asm絳夛紝閫氬父鍦ㄤ負浜嗙Щ妞嶆柟渚匡紝灝介噺涓嶄嬌鐢ㄥ畠浠紝濡傛灉瀹炲湪鏃犳硶閬垮厤鍙互閲囩敤#ifdef 鍜?endif涓篖INUX鍜學INDOWS緙栧啓涓や釜鐗堟湰銆?
(5) 鍑芥暟鍘熷瀷鐨勪慨鏀廣傞氬父濡傛灉閲囩敤鏍囧噯鐨凜/C++璇█緙栧啓鐨勫姩鎬佸簱錛屽熀鏈笂涓嶇敤鍐嶉噸鏂扮紪鍐欏嚱鏁幫紝浣嗗浜庣郴緇熻皟鐢ㄥ嚱鏁幫紝鐢變簬涓ょ緋葷粺鐨勫尯鍒紝闇瑕佹敼鍙樺嚱鏁扮殑璋冪敤鏂瑰紡絳夛紝濡傚湪Linux緙栧埗鐨勭綉緇滈氫俊鍔ㄦ佸簱涓紝鐢╟lose()鍑芥暟浠f浛windows鎿嶄綔緋葷粺涓嬬殑closesocket()鍑芥暟鏉ュ叧闂鎺ュ瓧銆傚彟澶栧湪Linux涓嬫病鏈夋枃浠跺彞鏌勶紝瑕佹墦寮鏂囦歡鍙敤open鍜宖open鍑芥暟錛屽叿浣撹繖涓や釜鍑芥暟鐨勭敤娉曞彲鍙傝冩枃鐚甗2]銆?
(6)makefile 鐨勭紪鍐欍傚湪windows涓嬮潰閫氬父鐢盫C++緙栬瘧鍣ㄦ潵璐熻矗璋冭瘯錛屼絾gcc闇瑕佽嚜宸卞姩鎵嬬紪鍐檓akefile鏂囦歡錛屼篃鍙互鍙傜収VC++鐢熸垚鐨?makefile鏂囦歡銆傚浜庡姩鎬佸簱縐繪錛岀紪璇戝姩鎬佸簱鏃墮渶瑕佸姞鍏?shared閫夐」銆傚浜庨噰鐢ㄦ暟瀛﹀嚱鏁幫紝濡傚箓綰ф暟鐨勭▼搴忥紝鍦ㄨ皟鐢ㄥ姩鎬佸簱鏄紝闇瑕佸姞鍏?lm銆?
(7)鍏跺畠涓浜涢渶瑕佹敞鎰忕殑鍦版柟
①紼嬪簭璁捐緇撴瀯鍒嗘瀽錛屽浜庣Щ妞嶅畠浜虹紪鍐欑殑鍔ㄦ佸簱紼嬪簭錛岀▼搴忕粨鏋勫垎鏋愭槸蹇呬笉鍙皯鐨勬楠わ紝閫氬父鍦ㄥ姩鎬佸簱紼嬪簭涓紝涓嶄細鍖呭惈鐣岄潰絳夋搷浣滐紝鎵浠ョ浉瀵瑰鏄撲竴浜涖?
②鍦↙inux涓紝瀵規(guī)枃浠舵垨鐩綍鐨勬潈闄愬垎涓烘嫢鏈夎呫佺兢緇勩佸叾瀹冦傛墍浠ュ湪瀛樺彇鏂囦歡鏃訛紝瑕佹敞鎰忓鏂囦歡鏄榪樻槸鍐欐搷浣滐紝濡傛灉鏄鏂囦歡榪涜鍐欐搷浣滐紝瑕佹敞鎰忎慨鏀規(guī)枃浠舵垨鐩綍鐨勬潈闄愶紝鍚﹀垯鏃犳硶瀵規(guī)枃浠惰繘琛屽啓銆?
③ 鎸囬拡鐨勪嬌鐢紝瀹氫箟涓涓寚閽堝彧緇欏畠鍒嗛厤鍥涗釜瀛楄妭鐨勫唴瀛橈紝濡傛灉瑕佸鎸囬拡鎵鎸囧悜鐨勫彉閲忚祴鍊鹼紝蹇呴』鐢╩alloc鍑芥暟涓哄畠鍒嗛厤鍐呭瓨鎴栦笉鎶婂畠瀹氫箟涓烘寚閽堣屽畾涔変負鍙橀噺鍗沖彲錛岃繖鐐瑰湪linux涓嬮潰姣攚indows緙栬瘧涓ユ牸銆傚悓鏍風粨鏋勪笉鑳藉湪鍑芥暟涓紶鍊鹼紝濡傛灉瑕佸湪鍑芥暟涓繘琛岀粨鏋勪紶鍊鹼紝蹇呴』鎶婂嚱鏁頒腑鐨勭粨鏋勫畾涔変負緇撴瀯鎸囬拡銆?
④璺緞鏍囪瘑絎︼紝鍦↙inux涓嬫槸“/”錛屽湪Windows涓嬫槸“\”錛屾敞鎰弚indows鍜孡inux鐨勫鍔ㄦ佸簱鎼滅儲璺緞鐨勪笉鍚屻?
⑤緙栫▼鍜岃皟璇曟妧宸ф柟闈€傚涓嶅悓鐨勮皟璇曠幆澧冩湁涓嶅悓鐨勮皟璇曟妧宸э紝鍦ㄨ繖閲屼笉澶氬彊榪般?
5銆佺粨鏉熻
鏈枃緋葷粺鍒嗘瀽浜唚indows鍜孡inux鍔ㄦ佸簱瀹炵幇鍜屼嬌鐢ㄦ柟寮忥紝浠庣▼搴忕紪鍐欍佺紪璇戙佽皟鐢ㄤ互鍙婂鎿嶄綔緋葷粺渚濊禆絳夋柟闈㈢患鍚堝垎鏋愭瘮杈冧簡榪欎袱縐嶈皟鐢ㄦ柟寮忕殑涓嶅悓涔嬪錛屾牴鎹疄闄呯▼搴忕Щ妞嶇粡楠岋紝緇欏嚭浜嗗皢VC++緙栧埗鐨刉indows鍔ㄦ佸簱縐繪鍒癓inux涓嬬殑鏂規(guī)硶浠ュ強闇瑕佹敞鎰忕殑闂錛屽悓鏃跺茍緇欏嚭浜嗙▼搴忕ず渚嬬墖鏂紝瀹為檯鍦ㄧ▼搴忕Щ妞嶈繃紼嬩腑錛岀敱浜庣郴緇熺殑璁捐絳夋柟闈紝鍙兘縐繪璧鋒潵闇瑕佹敞鎰忕殑鏂歸潰榪滄瘮涓婇潰澶嶆潅錛屾湰鏂囬氳繃鎬葷粨褰掔撼榪涜屼負涓嶅悓鎿嶄綔緋葷粺紼嬪簭縐繪鎻愪緵浜嗘湁鎰忕殑緇忛獙鍜屾妧宸с?/p>
(鏈枃鏉ユ簮浜巌nternet錛屾劅璋㈠師鍒涗綔鑰?
--------------------------------------------------------------------------
unix鍏蜂綋緙栬瘧鐨勪緥瀛愶細
婧愭枃浠朵負main.c, x.c, y.c, z.c,澶存枃浠朵負x.h,y.h,z.h
# 澹扮О鍔ㄤ唬榪炴帴搴擄紝鍋囪鍚嶇О涓簂ibtest.so
gcc x.c y.c z.c -fPIC -shared -o libtest.so
# 灝唌ain.c鍜屽姩鎬佽繛鎺ュ簱榪涜榪炴帴鐢熸垚鍙墽琛屾枃浠?
gcc main.c -L. -ltest -o main
# 杈撳嚭LD_LIBRARY_PATH鐜鍙橀噺錛屼竴杈瑰姩鎬佸簱瑁呰澆鍣ㄨ兘澶熸壘鍒伴渶瑕佺殑鍔ㄦ佸簱
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
# 嫻嬭瘯鏄惁鍔ㄦ佽繛鎺ワ紝濡傛灉鍒楀嚭libtest.so錛岄偅涔堝簲璇ユ槸榪炴帴姝e父浜?
ldd main
-fPIC錛氳〃紺虹紪璇戜負浣嶇疆鐙珛鐨勪唬鐮侊紝涓嶇敤姝ら夐」鐨勮瘽緙栬瘧鍚庣殑浠g爜鏄綅緗浉鍏崇殑鎵浠ュ姩鎬佽澆鍏ユ椂鏄?nbsp; 榪?nbsp; 浠g爜鎷瘋礉鐨勬柟寮忔潵婊¤凍涓嶅悓榪涚▼鐨勯渶瑕侊紝鑰屼笉鑳借揪鍒扮湡姝d唬鐮佹鍏變韓鐨勭洰鐨勩?
-L.錛氳〃紺鴻榪炴帴鐨勫簱鍦ㄥ綋鍓嶇洰褰曚腑
-ltest錛氱紪璇戝櫒鏌ユ壘鍔ㄦ佽繛鎺ュ簱鏃舵湁闅愬惈鐨勫懡鍚嶈鍒欙紝鍗沖湪緇欏嚭鐨勫悕瀛楀墠闈㈠姞涓妉ib錛屽悗闈㈠姞涓?so鏉ョ‘瀹氬簱鐨勫悕縐?
LD_LIBRARY_PATH錛氳繖涓幆澧冨彉閲忔寚紺哄姩鎬佽繛鎺ュ櫒鍙互瑁呰澆鍔ㄦ佸簱鐨勮礬寰勩?
褰撶劧濡傛灉鏈塺oot鏉冮檺鐨勮瘽錛屽彲浠ヤ慨鏀?etc/ld.so.conf鏂囦歡錛岀劧鍚庤皟鐢?
/sbin/ldconfig鏉ヨ揪鍒板悓鏍風殑鐩殑錛屼笉榪囧鏋滄病鏈塺oot鏉冮檺錛岄偅涔堝彧鑳介噰鐢ㄨ緭鍑篖D_LIBRARY_PATH鐨勬柟娉曚簡銆?/p>
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/yang_lang/archive/2010/10/08/5926486.aspx
Jon Pincus
Microsoft Corporation
鎽樿錛?/strong>璁ㄨ閿欒澶勭悊鑼冧緥浠ュ強涓庡涓寖渚嬬浉鍏寵仈鐨勯櫡闃憋紝騫舵彁渚涗簡涓や釜綆鍗曚絾鑷沖叧閲嶈鐨勬湁鍏抽敊璇儏鍐靛鐞嗙殑鍘熷垯銆?/p>
鏈夎兘鍔涚殑紼嬪簭鍛樿兘澶熺紪鍐欏湪鏈彂鐢熷紓甯告儏鍐墊椂姝e父榪愯鐨勪唬鐮併備嬌紼嬪簭鍛樺嚭綾繪嫈钀冪殑鎶鑳戒箣涓鏄兘澶熺紪鍐欏湪鍙戠敓閿欒鍜屽嚭鐜?#8220;鎰忓浜嬩歡”鏃朵粛鐒惰兘緇х畫榪愯鐨勪唬鐮併傜劧鑰岋紝鏈“鎰忓浜嬩歡”浼氱粰浜轟竴縐嶉敊璇殑鍗拌薄銆傚鏋滄?zhèn)ㄧ殑浠g爜宓屽叆鍦ㄤ竴涓箍娉涘垎甯冪殑鎴愬姛浜у搧涓紝閭d箞鎮(zhèn)ㄥ簲璇ラ鏂欏埌浠g爜鍙兘鍙戠敓鐨勫悇縐嶅紓甯革紙涓斿彲鎬曪級鐨勬儏鍐點傝綆楁満灝嗚楀敖鍐呭瓨錛屾枃浠舵湭濡傛?zhèn)ㄦ墍鎰垮湴瀛樺湪浜庡簲璇ュ瓨鍦ㄧ殑鍦版柟錛屼粠鏈け璐ョ殑鍑芥暟鏈夊彲鑳藉湪鏂扮増鏈殑鎿嶄綔緋葷粺涓け璐ワ紝絳夌瓑錛屼笉涓鑰岃凍銆傚鏋滄?zhèn)ㄥ笇鏈涗唬鐮佽兘鐟艟l彲闈犲湴榪愯錛岄偅涔堝氨闇瑕侀瑙佹墍鏈夎繖浜涗簨浠躲?/p>
鏈枃璁ㄨ鐨勭壒瀹氱被鍒殑寮傚父浜嬩歡鏄敊璇儏鍐點傞敊璇儏鍐靛茍娌℃湁涓涓噯紜殑瀹氫箟銆傜洿瑙傚湴璁詫紝瀹冨氨鏄寚閫氬父鑳藉鎴愬姛鐨勪簨鎯呭茍鏈垚鍔熴傚唴瀛樺垎閰嶅け璐ュ氨鏄竴涓吀鍨嬬ず渚嬨傞氬父錛岀郴緇熸湁澶ч噺鍐呭瓨鍙互婊¤凍闇姹傦紝浣嗘槸鍋跺皵璁$畻鏈轟篃鍙兘浼氱敱浜庢煇縐嶅師鍥犺岀壒鍒箒蹇欙紝渚嬪錛岃繍琛屽ぇ鍨嬬殑鐢?shù)瀛愯〃鏍艰绠楀Q屾垨鑰呭湪 Internet 涓栫晫涓湁浜烘鍦ㄥ璇ヨ綆楁満鍙戝姩鎷掔粷鏈嶅姟鏀誨嚮銆傚鏋滄?zhèn)ㄨ缂栧啓鋼Q鎰忕被鍨嬬殑閲嶈緇勪歡銆佹湇鍔℃垨搴旂敤紼嬪簭錛岄偅涔堝氨闇瑕侀瑙佸埌榪欑鎯呭喌銆?/p>
鏈枃閲囩敤鐨勭紪鐮佺ず渚嬪熀浜?C/C++錛屼絾涓鑸師鍒欐槸鐙珛浜庣紪紼嬭璦鐨勩傚嵆浣夸笉浣跨敤 C/C++ 浠g爜錛屼嬌鐢ㄥ縐嶈璦鐨勭▼搴忓憳涔熷簲璇ヨ浣忚繖涓鐐廣備緥濡傦紝PC Week 涓懼姙鐨勯粦瀹㈢珵璧?(Hackpcweek.com) 鐨勮幏鑳滆咃紝灝辨槸鍒╃敤鏌愪簺 Perl CGI 浠g爜涓鏌ヨ繑鍥炰唬鐮佺殑澶辮觸錛屾潵閮ㄥ垎鍦板 Apache 鏈嶅姟鍣ㄥ彂璧鋒敾鍑匯傛湁鍏寵繘涓姝ョ殑淇℃伅錛岃鍙傞槄 http://www.zdnet.com/eweek/stories/general/0,11011,2350744,00.html 涓婄殑鏂囩珷銆?/p>
浠諱綍閲嶈鐨勮蔣浠墮儴鍒嗛兘浼氫笌鍏朵粬鐨勫眰鍜岀粍浠惰繘琛屼氦浜掋傜紪鍐欏鐞嗛敊璇殑浠g爜鐨勭涓姝ワ紝鏄簡瑙e綋閿欒鍙戠敓鏃剁郴緇熺殑鍏朵綑閮ㄥ垎姝e湪鎵ц鍝簺鎿嶄綔銆傛湰鏂囩殑鍏朵綑閮ㄥ垎灝嗚璁洪敊璇鐞嗚寖渚嬶紝鐒跺悗璁ㄨ涓庡涓寖渚嬬浉鍏寵仈鐨勯櫡闃便傛湰鏂囪繕鍖呮嫭浜嗕袱涓畝鍗曚絾鑷沖叧閲嶈鐨勬湁鍏抽敊璇儏鍐靛鐞嗙殑鍘熷垯銆?/p>
鏃犺浣曟椂鍙戠敓閿欒鎯呭喌錛岄兘闇瑕佽冭檻涓変釜鐙珛鐨勯棶棰橈細媯嫻嬮敊璇儏鍐點佹姤鍛婇敊璇儏鍐典互鍙婂閿欒鎯呭喌浣滃嚭鍝嶅簲銆傞氬父錛屽鐞嗚繖浜涢棶棰樼殑鑱岃矗鍒嗘暎鍦ㄤ唬鐮佺殑涓嶅悓緇勪歡鎴栧眰涓備緥濡傦紝媯嫻嬬郴緇熸槸鍚﹀唴瀛樹笉瓚蟲槸鎿嶄綔緋葷粺鐨勫伐浣溿傚唴瀛樺垎閰嶅嚱鏁扮殑宸ヤ綔鏄皢榪欑鎯呭喌鎶ュ憡緇欏畠鐨勮皟鐢ㄦ柟銆備緥濡傦紝VirtualAlloc 浼氳繑鍥?NULL錛孧icrosoft 鍩虹綾誨簱 (MFC) 榪愮畻絎ew 浼氬紩鍙?strong>CMemoryException *鏈〉鍐呭
綆浠?/a>
閿欒澶勭悊鑼冧緥 澶氫釜 API 綰﹀畾鐨勯棶棰?/a>
鏈夊叧閿欒鎯呭喌鐨勪袱涓畝鍗曞師鍒?/a>
灝忕粨 綆浠?/h3>
閿欒澶勭悊鑼冧緥
鍥犱負涓嶅悓鐨勫眰鍜岀粍浠墮渶瑕佺浉浜掑崗浣滀互澶勭悊榪欎簺閿欒錛屾墍浠ョ涓姝ユ槸瀹氫箟鐗規(guī)畩璇嶆眹錛屽嵆錛屾墍鏈夌粍浠跺叡鍚岄伒瀹堢殑綰﹀畾銆傞仐鎲劇殑鏄紝鍦?C銆丆++ 鎴栧叾浠栦換浣曡璦涓兘娌℃湁鍗曚竴涓斿畾涔夊畬鍠勭殑綰﹀畾銆傜浉鍙嶏紝鍗村瓨鍦ㄨ澶氱害瀹氾紝騫朵笖姣忕綰﹀畾閮芥湁鍚勮嚜鐨勪紭緙虹偣銆?/p>
涓嬮潰鍒楀嚭浜嗕竴浜涙渶甯哥敤鐨勭害瀹氾細
榪斿洖涓涓?/strong> BOOL 鍊間互鎸囩ず鎴愬姛鎴栧け璐ャ?/strong>Windows API 鍜?MFC 涓殑寰堝璋冪敤閮借繑鍥?TRUE 浠ユ寚紺烘垚鍔燂紝榪斿洖 FALSE 浠ユ寚紺哄け璐ャ傝繖縐嶆柟娉曟棦濂藉張綆鍗曘備絾闂鍦ㄤ簬錛岃鏂規(guī)硶涓嶅澶辮觸榪涜瑙i噴錛屼篃涓嶅尯鍒嗕笉鍚岀被鍨嬬殑鎴愬姛鎴栧け璐ャ傦紙褰撲嬌鐢?Windows API 鏃訛紝鎮(zhèn)ㄥ彲浠ヤ嬌鐢?span class=Apple-converted-space>
榪斿洖鐘舵併?/strong>閬楁喚鐨勬槸錛岄殢鐫 Windows API 鐨勫彉鍖栵紝璇ョ害瀹氬嚭鐜頒簡涓ょ涓嶅悓鐨勬牱寮忋侰OM 鍑芥暟榪斿洖 HRESULT錛欻RESULT >= 0錛堜緥濡傦紝S_OK錛夎〃紺烘垚鍔燂紝HRESULT < 0錛堜緥濡傦紝E_FAIL錛夎〃紺哄け璐ャ傚叾浠栧嚱鏁幫紙渚嬪錛?strong>Registry 鍑芥暟錛夊垯榪斿洖 WINERROR.H 涓畾涔夌殑閿欒浠g爜銆傚湪璇ョ害瀹氫腑錛孍RROR_SUCCESS (0) 鏄敮涓鐨勬垚鍔熷鹼紝鎵鏈夊叾浠栧奸兘琛ㄧず鍚勭褰㈠紡鐨勫け璐ャ傝繖縐嶄笉涓鑷存湁鍙兘閫犳垚鍚勭鍚勬牱鐨勬販涔便傛洿緋熺硶鐨勬槸錛屽?0錛堝畠鍦?Boolean 鏍峰紡鐨勮繑鍥炲肩害瀹氫腑琛ㄧず澶辮觸錛夊湪姝ゅ琛ㄧず鎴愬姛銆傚叾鍚庢灉灝嗗湪鍚庨潰榪涜璁ㄨ銆傚湪浠諱綍浜嬩歡涓紝鐘舵佽繑鍥炴柟娉曢兘鍏鋒湁浼樺娍 鈥?涓嶅悓鐨勫煎彲浠ヨ〃紺轟笉鍚岀被鍨嬬殑澶辮觸錛堟垨鑰呭浜?HRESULT 鑰岃█錛岃〃紺烘垚鍔燂級銆?/p>
榪斿洖涓涓?/strong> NULL 鎸囬拡銆?/strong>C 鏍峰紡鍐呭瓨鍒嗛厤鍑芥暟錛堜緥濡傦紝HeapAlloc銆?strong>VirtualAlloc銆?strong>GlobalAlloc 鍜?span class=Apple-converted-space> malloc錛夐氬父榪斿洖涓涓?NULL 鎸囬拡銆傚彟涓涓ず渚嬫槸 C 鏍囧噯搴撶殑 fopen 鍑芥暟銆備笌 BOOL 榪斿洖鍊肩浉鍚岋紝榪橀渶瑕佸叾浠栦竴浜涙満鍒舵潵鍖哄垎涓嶅悓縐嶇被鐨勫け璐ャ?/p>
榪斿洖涓涓?/strong> “ 涓嶅彲鑳界殑鍊?/strong> ” 銆?/strong>璇ュ奸氬父涓?0錛堝浜庢暣鏁幫紝濡?span class=Apple-converted-space> GetWindowsDirectory錛夋垨 –1錛堝浜庢寚閽堟垨闀垮害錛屽 C 鏍囧噯搴撶殑 fgets 鍑芥暟錛夈侼ULL 鎸囬拡綰﹀畾鐨勬硾鍖栨槸瀹冩壘鍒版煇涓?鈥?渚嬬▼閲囩敤鍏朵粬鏂瑰紡灝嗘棤娉曡繑鍥炶鍊鹼紝騫朵笖璁╄鍊艱〃紺洪敊璇傚洜涓洪氬父娌℃湁涓績妯″紡錛屾墍浠ュ湪灝嗚鏂規(guī)硶鎵╁睍鍒板ぇ鍨?API 鏃朵細鍦ㄦ煇縐嶇▼搴︿笂鍑虹幇闂銆?/p>
寮曞彂 C++ 寮傚父銆?/strong>瀵逛簬綰補鐨?C++ 紼嬪簭鏉ヨ錛岃綰﹀畾鍙鎮(zhèn)ㄤ嬌鐢ㄨ璦鍔熻兘鏉ヨ幏鐩娿侭obby Schmidt 鏈榪戞挵鍐欑殑鏈夊叧寮傚父鐨?#8220;Deep C++”緋誨垪鏂囩珷璇︾粏璁ㄨ浜嗚繖浜涢棶棰樸傜劧鑰岋紝灝嗚鏂規(guī)硶涓庢棫寮忕殑 C 浠g爜鎴栬呬笌 COM 緇撳悎鍙兘浼氬甫鏉ラ棶棰樸傚浜?COM 鏂規(guī)硶鑰岃█錛屽紩鍙?C++ 寮傚父鏄潪娉曠殑銆傛澶栵紝C++ 寮傚父鏄紑閿鐩稿杈冨ぇ鐨勪竴縐嶆満鍒躲傚鏋滄搷浣滄湰韜殑浠峰間笉楂橈紝閭d箞榪囧ぇ鐨勫紑閿閫氬父浼氭姷娑堟墍鑾峰緱鐨勫ソ澶勩?/p>
寮曞彂緇撴瀯鍖栧紓甯搞?/strong>榪欓噷鐨勬敞鎰忎簨欏規(guī)伆涓?C++ 寮傚父鐩稿弽銆傝鏂規(guī)硶瀵逛簬 C 浠g爜鑰岃█闈炲父鏁存磥錛屼絾涓?C++ 鐨勪氦浜掓т笉澶ソ銆傚悓鏍鳳紝璇ユ柟娉曚笉鑳戒笌 COM 鏈夋晥鍦扮粨鍚堛?/p>
娉?/strong> 濡傛灉鎮(zhèn)ㄨ閫夌敤杈冩棫鐨勪唬鐮佸熀錛岄偅涔堟?zhèn)ㄦ湁鏃朵細鐪嬪?#8220;鍘熺敓鐨勫紓甯稿鐞嗘満鍒?#8221;銆侰++ 緙栬瘧鍣ㄥ彧鏄湪鏈榪戞墠寮濮嬫瘮杈冨ソ鍦板鐞嗗紓甯搞傚湪榪囧幓錛屽紑鍙戜漢鍛樼粡甯稿熀浜?Windows 緇撴瀯鍖栧紓甯稿鐞?(SEH) 鎴?C 搴撶殑 setjmp/longjmp 鏈哄埗鏉ユ瀯寤轟粬浠嚜宸辯殑鏈哄埗銆傚鏋滄?zhèn)ㄥ凡缁従lф壙浜嗚繖浜涗唬鐮佸熀涓殑涓涓紝鍒欓渶瑕佽嚜鎷呴闄╋紝閲嶆柊緙栧啓瀹冨彲鑳芥槸鏈濂界殑閫夋嫨銆傚惁鍒欙紝鏈濂界敱緇忛獙闈炲父涓板瘜鐨勭▼搴忓憳鏉ュ鐞嗐?/p>
閿欒澶勭悊鏄換浣?API 瀹氫箟鐨勫叧閿儴鍒嗐傛棤璁烘?zhèn)ㄦ槸瑕佽璁?API 榪樻槸浣跨敤浠栦漢璁捐鐨?API錛岄兘鏄姝ゃ傚浜?API 瀹氫箟鑰岃█錛岄敊璇涓鴻寖渚嬩笌綾誨畾涔夋垨鍛藉悕鏂規(guī)鍚屾牱閲嶈銆備緥濡傦紝MFC API 闈炲父鏄庣‘鍦拌瀹氫簡鍦ㄨ祫婧愬垎閰嶅け璐ユ椂鍝簺鍑芥暟寮曞彂鍝簺寮傚父錛屼互鍙婂摢浜涘嚱鏁拌繑鍥?BOOL 鎴愬姛/澶辮觸璋冪敤銆侫PI 鐨勮璁¤呮槑紜湴灝嗘煇浜涙兂娉曟鍏ヨ繖涓瑙勫畾錛岀敤鎴烽渶瑕佺悊瑙e叾鎰忓浘騫舵寜鐓у凡緇忔瀯寤虹殑瑙勫垯榪涜鎿嶄綔銆?/p>
濡傛灉鎮(zhèn)ㄨ浣跨敤鐜版湁鐨?API錛屽垯蹇呴』澶勭悊鎵鏈夌幇鏈夌害瀹氥傚鏋滄?zhèn)ㄨ璁捐?API錛屽垯搴旇閫夌敤鑳藉涓庢?zhèn)ㄥ凡缁忎娇鐢ㄧ?API 鐩擱傚簲鐨勭害瀹氥?/p>
濡傛灉鎮(zhèn)ㄨ浣跨敤澶氫釜 API錛屽垯閫氬父瑕佷嬌鐢ㄥ涓害瀹氥傛煇浜涚害瀹氱粍鍚堝彲浠ュ緢濂藉湴宸ヤ綔錛屽洜涓鴻繖浜涚害瀹氬緢闅炬販娣嗐備絾鏄紝鏌愪簺綰﹀畾緇勫悎鍗村緢瀹規(guī)槗鍑洪敊銆傛湰鏂囨墍璁ㄨ鐨勮澶氱壒瀹氶櫡闃卞氨鏄敱浜庡瓨鍦ㄨ繖浜涗笉涓鑷磋岄犳垚鐨勩?/p>
娣風敤鍜屽尮閰嶄笉鍚岀殑 API 綰﹀畾閫氬父鏄棤娉曢伩鍏嶇殑錛屼絾榪欓潪甯稿鏄撳嚭閿欍備竴浜涘疄渚嬫槸鏄捐屾槗瑙佺殑銆備緥濡傦紝濡傛灉鎮(zhèn)ㄥ皾璇曞湪鍚屼竴涓彲鎵ц鏂囦歡涓販鐢?Windows SEH 鍜?C++ 寮傚父錛屽垯寰堝彲鑳戒細澶辮觸銆傚叾浠栫ず渚嬫洿涓哄井濡欍傚叾涓竴涓弽澶嶅嚭鐜扮殑鐗瑰畾紺轟緥灝變笌 HRESULT 鏈夊叧錛屽茍涓旀槸浠ヤ笅紺轟緥鐨勬煇縐嶅彉浣擄細 璇ョず渚嬩負浣曟槸閿欒鐨勶紵FAILED 鏄竴涓?HRESULT 鏍峰紡鐨勫畯錛屽洜姝ゅ畠浼氭鏌ュ叾鍙傛暟鏄惁灝忎簬 0銆備互涓嬫槸瀹冪殑瀹氫箟錛堟憳鑷?winerror.h錛夛細 鍥犱負 FALSE 琚畾涔変負 0錛屾墍浠?FAILED(FALSE) == 0 鏄繚鍙嶇洿瑙夌殑錛岃繖鏃犻』澶氳█銆傝屼笖錛屽洜涓鴻瀹氫箟宓屽叆浜嗗己鍒惰漿鎹紝鎵浠ュ嵆浣挎?zhèn)ㄤ娇鐢ㄨ鍛娋Uу埆 4錛屼篃涓嶄細鑾峰緱緙栬瘧鍣ㄨ鍛娿?/p>
褰撴?zhèn)ㄥ鐞?BOOL 鏃訛紝涓嶅簲璇ヤ嬌鐢ㄥ畯錛屼絾搴旇榪涜鏄懼紡媯鏌ワ細 鐩稿弽錛屽綋鎮(zhèn)ㄥ鐞?HRESULT 鏃訛紝鍒欏簲璇ュ緇堜嬌鐢?SUCCEEDED 鍜?FAILED 瀹忋?/p>
榪欐槸涓涓伓鎬ч敊璇紝鍥犱負瀹冨緢瀹規(guī)槗琚拷鐣ャ傚鏋?span class=Apple-converted-space> CoDoIt 榪斿洖 S_OK錛屽垯嫻嬭瘯灝嗘垚鍔熷畬鎴愩備絾鏄紝濡傛灉 CoDoIt 榪斿洖鏌愪釜鍏朵粬鎴愬姛鐘舵侊紝浼氭庢牱鍛紵閭f牱錛宧r > 0錛屾墍浠?!hr == 0錛沬f 嫻嬭瘯澶辮觸錛屼唬鐮佸皢榪斿洖瀹為檯涓婂茍鏈彂鐢熺殑閿欒銆?/p>
涓嬮潰鏄彟涓涓ず渚嬶細 浜轟滑鏈夋椂浼氭彃璇濊 ISomething::DoIt 鍦ㄦ垚鍔熸椂鎬繪槸榪斿洖 S_OK錛屽洜姝ゆ渶鍚庝袱涓唬鐮佺墖孌佃偗瀹氶兘娌℃湁闂銆備絾鏄紝榪欎笉鏄竴涓畨鍏ㄧ殑鍋囪銆侰OM 鎺ュ彛鐨勮鏄庨潪甯告竻妤氥傚嚱鏁板湪鎴愬姛鏃跺彲浠ヨ繑鍥炰換浣曟垚鍔熷鹼紝鍥犳 ISomething::DoIt 鐨勪紬澶氬疄鐜拌呬腑鐨勪換浣曚竴涓兘鍙兘閫夋嫨榪斿洖鏌愪釜鍊鹼紝渚嬪 S_FALSE銆傚湪榪欑鎯呭喌涓嬶紝鎮(zhèn)ㄧ殑浠g爜灝嗕腑姝㈣繍琛屻?/p>
姝g‘鐨勮В鍐蟲柟妗堟槸浣跨敤瀹忥紝榪欎篃灝辨槸瀹忓瓨鍦ㄧ殑鍘熷洜銆?/p>
鍥犱負宸茬粡寮曞嚭浜?HRESULT 鐨勪富棰橈紝鎵浠ョ幇鍦ㄦ槸鎻愰啋鎮(zhèn)?S_FALSE 鐗規(guī)х殑澶уソ鏃舵満錛?/p>
瀹冩槸涓涓垚鍔熶唬鐮侊紝鑰屼笉鏄竴涓け璐ヤ唬鐮侊紝鍥犳 SUCCEEDED(S_FALSE) == 1銆?/p>
瀹冭瀹氫箟涓?1錛岃屼笉鏄?0錛屽洜姝?S_FALSE == TRUE銆?/p>
鏈夎澶氱畝鍗曠殑鏂規(guī)硶鍙互浣夸唬鐮佹洿鍙潬鍦板鐞嗛敊璇儏鍐點傜浉鍙嶏紝浜轟滑涓嶆効鎰忓仛鐨勮澶氱畝鍗曚簨鎯呬細浣夸唬鐮佸湪鍙戠敓閿欒鎯呭喌鏃跺彉寰楄剢寮卞拰涓嶅彲闈犮?/p>
娌℃湁姣旇繖鏇寸畝鍗曠殑浜嬫儏浜嗐傚嚑涔庢墍鏈夊嚱鏁伴兘鎻愪緵鏌愮琛ㄦ槑瀹冧滑鏄垚鍔熻繕鏄け璐ョ殑鎸囩ず錛屼絾濡傛灉鎮(zhèn)ㄤ笉媯鏌ュ畠浠紝鍒欒繖涓鐐規(guī)病鏈変換浣曠敤澶勩傝繖鑳芥湁澶氬洶闅懼憿錛熷彲浠ュ皢鍏惰涓轟竴涓崼鐢熼棶棰樸傛?zhèn)ㄧ煡閬撳湪鍚冧笢瑗夸箣鍓嶅簲璇z楁墜錛屼絾鎮(zhèn)ㄥ彲鑳藉茍涓嶆繪槸榪欐牱鍋氥傝繖涓庢鏌ヨ繑鍥炲肩殑閬撶悊鐩稿悓銆?/p>
涓嬮潰鏄竴涓秹鍙婂埌 GetWindowsDirectory 鍑芥暟鐨勭畝鍗曡屽疄鐢ㄧ殑紺轟緥銆侻SDN 鏂囨。娓呮鍦拌鏄庝簡 GetWindowsDirectory 鐨勯敊璇涓猴細 濡傛灉璇ュ嚱鏁板け璐ワ紝鍒欒繑鍥炲間負 0銆傝鑾峰緱鎵╁睍鐨勯敊璇俊鎭紝璇瘋皟鐢?span class=Apple-converted-space> GetLastError 鍑芥暟銆?/p>
瀹為檯涓婏紝鏂囨。涓啓寰楅潪甯告竻妤氥?/p>
涓嬮潰鏄竴涓垽鏂?Windows 鐩綍椹葷暀鍦ㄥ摢涓┍鍔ㄥ櫒涓殑浠g爜鐗囨銆?/p>
濡傛灉 GetWindowsDirectory 澶辮觸錛屼細鍙戠敓浠涔堟儏鍐靛憿錛燂紙濡傛灉鎮(zhèn)ㄤ笉鐩鎬俊 GetWindowsDirectory 浼氬け璐ワ紝榪欏彧鏄?zhèn)ㄦ殏鏃剁殑瑙傜倧V傦級濂斤紝璇ヤ唬鐮佷笉媯鏌ヨ繑鍥炲鹼紝鍥犳鍒嗛厤緇?cDriveLetter 鐨勫兼湭鍒濆鍖栥傛湭鍒濆鍖栫殑鍐呭瓨鍙互鍏鋒湁浠繪剰鍊箋傚疄闄呬笂錛岃浠g爜灝嗛殢鏈洪夋嫨椹卞姩鍣ㄣ傝繖鏍峰仛鍑犱箮涓嶅彲鑳芥槸姝g‘鐨勩?/p>
姝g‘鐨勫仛娉曟槸媯鏌ラ敊璇姸鎬併?/p>
榪欑鎯呭喌榪樿兘鍙戠敓鍚楋紵涓嶆鏌ヨ繑鍥炲肩殑鏈甯歌鍊熷彛鏄?#8220;鎴戠煡閬撻偅涓嚱鏁扮粷瀵逛笉浼氬け璐?#8221;銆?strong>GetWindowsDirectory澶氫釜 API 綰﹀畾鐨勯棶棰?/h3>
extern BOOL DoIt();
BOOL ok;
ok = DoIt(...);
if (FAILED(ok)) // WRONG!!!
return;
#define FAILED(Status) ((HRESULT)(Status)<0)
BOOL ok;
ok = DoIt(...);
if (! ok)
return;
HRESULT hr;
hr = ISomething->DoIt(...);
if (! hr) // WRONG!!!
return;
HRESULT hr;
hr = ISomething->DoIt(...);
if (hr == S_OK) // STILL WRONG!!!
return;
HRESULT hr;
hr = ISomething->DoIt(...);
if (FAILED(hr))
return;
鏈夊叧閿欒鎯呭喌鐨勪袱涓畝鍗曞師鍒?/h3>
鎬繪槸媯鏌ヨ繑鍥炵姸鎬?/h4>
Return Values
TCHAR cDriveLetter;
TCHAR szWindowsDir[MAX_PATH];
GetWindowsDirectory(szWindowsDir, MAX_PATH);
cDriveLetter = szWindowsDir[0]; // WRONG!!!
...
TCHAR cDriveLetter;
TCHAR szWindowsDir[MAX_PATH];
if (GetWindowsDirectory(szWindowsDir, MAX_PATH))
{
cDriveLetter = szWindowsDir[0];
...
}
鐜板湪 Windows 緇堢鏈嶅姟鍣ㄥ嚭鐜頒簡錛岃鍒ゆ柇鍗曚釜鐢ㄦ埛鐨?Windows 鐩綍鍙樺緱鏇翠負澶嶆潅銆?strong>GetWindowsDirectory 蹇呴』瀹屾垚鏇村鐨勫伐浣滐紝鍙兘鍖呮嫭鍒嗛厤鍐呭瓨銆傝屼笖錛屽洜涓哄紑鍙戣繖涓鍑芥暟鐨勫紑鍙戜漢鍛橀潪甯歌礋璐d換錛屾墍浠ヤ粬瀹屾垚浜嗘紜殑宸ヤ綔騫舵鏌ュ唴瀛樺垎閰嶆槸鍚︽垚鍔燂紝濡傛灉涓嶆垚鍔燂紝鍒欒繑鍥炴弿榪板畬鏁寸殑閿欒鐘舵併?/p>
榪欏氨瀵艱嚧浜嗗彟澶栦竴浜涢棶棰橈細濡傛灉 GetWindowsDirectory 鍦ㄥけ璐ユ椂宸茬粡灝嗗畠鐨勮緭鍑哄垵濮嬪寲涓虹┖瀛楃涓詫紝鏄惁浼氭湁鎵甯姪錛熺瓟妗堟槸鍚﹀畾鐨勩傜粨鏋滀笉浼氭槸鏈垵濮嬪寲鐨勶紝浣嗗畠浠粛灝嗘槸綺楀績澶ф剰鐨勫簲鐢ㄧ▼搴忔墍鏈浘鏂欏埌鐨勪笢瑗褲傚亣璁炬?zhèn)ㄥ呬h湁涓涓敱 cDriveLetter – 'A' ; 绱㈠紩鐨勬暟緇勶紝閭d箞鐜板湪璇ョ儲寮曞皢紿佺劧鍙樹負璐熷箋?/p>
鍗充嬌緇堢鏈嶅姟鍣ㄥ浜庢?zhèn)ㄤ笉鏄棶棰樺Q屼絾鍚屾牱鐨勬儏鍐靛彲鑳戒細鍙戠敓鍦?Windows API 鐨勪換浣曟湭鏉ュ疄鐜頒腑銆傛?zhèn)ㄥ笇鏈浖泚姝㈡鍦ㄥ紑鍙戠殑搴旂敤紼嬪簭鍦ㄥ皢鏉ョ増鏈殑鎿嶄綔緋葷粺鎴栨浛浠e疄鐜幫紙濡?Embedded NT錛変腑榪愯鍚楋紵涓縐嶈壇濂界殑涔犳儻鏄浣忎互涓嬩簨瀹烇細浠g爜緇忓父鍦ㄥ叾棰勬湡鐨勫埌鏈熸棩涔嬪悗緇х畫鐢熷瓨銆?/p>
鏈夋椂錛屾鏌ヨ繑鍥炲兼槸涓嶅鐨勩傝鑰冭檻 Windows API ReadFile銆傛?zhèn)ňl忓父浼氱湅鍒板涓嬩唬鐮侊細
LONG buffer[CHUNK_SIZE]; ReadFile(hFile, (LPVOID)buffer, CHUNK_SIZE*sizeof(LONG), &cbRead, NULL); if (buffer[0] == 0) // DOUBLY WRONG!!! ...
濡傛灉璇誨彇鎿嶄綔澶辮觸錛岃鏄庣紦鍐插尯鐨勫唴瀹規(guī)槸鏈垵濮嬪寲鐨勩傚鏁版儏鍐典笅瀹冨彲鑳戒負闆訛紝浣嗚繖涓鐐瑰茍涓嶇‘瀹氥?/p>
璇誨彇鏂囦歡澶辮觸鐨勫師鍥犳湁璁稿銆備緥濡傦紝璇ユ枃浠跺彲鑳芥槸榪滅▼鏂囦歡錛岃岀綉緇滃彲鑳藉彂鐢熸晠闅溿傚嵆浣垮畠鏄湰鍦版枃浠訛紝紓佺洏涔熷彲鑳芥伆濂戒笉鍚堟椂瀹滃湴鎹熷潖銆傚鏋滄槸榪欑鎯呭喌錛屽垯鏂囦歡鐨勬牸寮忓彲鑳藉畬鍏ㄤ笉鍚屼簬棰勬湡鏍煎紡銆備粬浜哄彲鑳芥棤鎰忎腑鎴栧埆鏈夌敤蹇冨湴鏇挎崲浜嗘?zhèn)ㄨ湄撳簲璇ュ瓨鍦ㄤ簬鏌愪釜浣嵕|殑鏂囦歡錛屾垨鑰呰鏂囦歡鍙兘鍙湁涓涓瓧鑺傘傛洿涓哄鎬殑浜嬫儏宸茬粡鍙戠敓浜嗐?/p>
瑕佸鐞嗚繖涓鎯呭喌錛屾?zhèn)ㄤ笉浣嗛渶瑕佹鏌ヨ鍙栨搷浣滄槸鍚︽垚鍔燂紝榪樺繀欏繪鏌ヤ互紜繚鎮(zhèn)ㄥ凡緇忚鍙栦簡姝g‘鏁伴噺鐨勫瓧鑺傘?/p>
LONG buffer[CHUNK_SIZE];
BOOL ok;
ok = ReadFile(hFile, (LPVOID)buffer,
CHUNK_SIZE*sizeof(LONG), &cbRead, NULL);
if (ok && cbRead > sizeof(LONG)) {
if (buffer[0] == 0)
...
}
else
// handle the read failure; for example
...
鏃犲焊璁寵█錛屼笂榪頒唬鐮佹湁鐐瑰効澶嶆潅銆備絾鏄紝緙栧啓鍙潬鐨勪唬鐮佽姣旂紪鍐欏茍涓嶆繪槸鑳藉姝e父宸ヤ綔鐨勪唬鐮佹洿涓哄鏉傘傚涓婅堪浠g爜浜х敓鎬ц兘鏂歸潰鐨勭枒闂槸寰堟甯哥殑銆傝櫧鐒舵坊鍔犱簡鍑犱釜嫻嬭瘯錛屼絾鍦ㄥ叏灞涓婁笅鏂囷紙鍑芥暟璋冪敤銆佺鐩樻搷浣滐紝鑷沖皯澶嶅埗 CHUNK_SIZE * sizeof(LONG) 涓瓧鑺傦級涓紝鍏跺獎鍝嶆槸鏋佸皬鐨勩?/p>
閫氬父錛屾瘡褰撻渶瑕佽繘琛岃繑鍥炲兼鏌ユ椂錛屾繪槸娑夊強鍒頒竴涓嚱鏁拌皟鐢紝鍥犳鎬ц兘寮閿涓嶅お閲嶈銆傚湪鏌愪簺鎯呭喌涓嬶紝緙栬瘧鍣ㄥ彲鑳戒細鍐呰仈璇ュ嚱鏁幫紝浣嗘槸濡傛灉鍙戠敓榪欑琛屼負錛屽茍涓旂敱浜庤繑鍥炲父鏁拌屽疄闄呬笂涓嶉渶瑕佹鏌ヨ繑鍥炲兼椂錛岀紪璇戝櫒浼氬皢嫻嬭瘯浼樺寲鎺夈?/p>
璇氱劧錛岃繕鏄湁涓浜涚壒孌婃儏鍐碉細鎮(zhèn)ㄩ氳繃鍒犻櫎榪斿洖鍊兼鏌ヨ岃妭鐪佺殑灝戞暟 CPU 寰幆鑷沖叧閲嶈錛涚紪璇戝櫒鏃犳硶涓烘?zhèn)ㄦ彁渚涘府鍔╁Q涙?zhèn)ㄦ帶鍒朵簡瑕佽皟鐢ㄧ殑鍑芥暟鐨勮湄撱傚湪涓婅堪鎯呭喌涓嬶紝鐪佺暐涓浜涜繑鍥炲兼鏌ユ槸鏈夋剰涔夌殑銆傚鏋滄?zhèn)ㄨ湄撹嚜宸卞浜幘c諱技鐨勬儏褰紝鍒欏簲璇ヤ笌鍏朵粬寮鍙戜漢鍛樿繘琛岃璁猴紝閲嶆柊瀹¤鐪熸鐨勬ц兘鎶樿》錛岀劧鍚庯紝濡傛灉鎮(zhèn)ㄤ粛鐒剁‘淇¤繖鏍峰仛鏄紜殑錛屽垯鍦ㄤ唬鐮佷腑姣忎釜鐪佺暐榪斿洖鍊兼鏌ョ殑鍦版柟鍔犱笂鏄庣‘鐨勬敞閲婏紝璇存槑鎮(zhèn)ㄧ殑鍐沖畾騫惰瘉鏄庡畠鐨勬紜с?/p>
鏃犺鏄嬌鐢?span class=Apple-converted-space> HeapAlloc銆?strong>VirtualAlloc銆?strong>IMalloc::Alloc銆?strong>SysAllocString銆?strong>GlobalAlloc銆?strong>malloc 榪樻槸浠諱綍 C++ 榪愮畻絎?new錛屾?zhèn)ㄩ兘涓嶈兘鎯冲綋鐒跺湴璁や负鍐呭瓨鍒嗛厤鎴愬姛銆傚悓鏍風殑閬撶悊涔熼傜敤浜庡叾浠栧悇縐嶈祫婧愶紝鍖呮嫭 GDI 瀵硅薄銆佹枃浠躲佹敞鍐岃〃欏圭瓑絳夈?/p>
涓嬮潰鏄竴涓緢濂界殑鐙珛浜庡鉤鍙扮殑閿欒浠g爜紺轟緥錛岃繖浜涗唬鐮佹槸鍦?C 鏍囧噯搴撶殑鍩虹涓婄紪鍐欑殑錛?/p>
char *str; str = (char *)malloc(MAX_PATH); str[0] = 0; // WRONG!!! ...
鍦ㄦ渚嬩腑錛屽鏋滃唴瀛樿楀敖錛屽垯 malloc 灝嗚繑鍥?NULL錛岃?str 鐨勫弽寮曠敤灝嗘槸 NULL 鎸囬拡鐨勫弽寮曠敤銆傝繖浼氶犳垚璁塊棶鍐茬獊錛屼粠鑰屽鑷寸▼搴忓穿婧冦傞櫎闈炴?zhèn)ㄦ槸鍦ㄥ唴鏍告ā寮忎笅杩愯锛堜緥濡傚Q岃澶囬┍鍔ㄧ▼搴忥級錛屽惁鍒欒闂啿紿佸皢瀵艱嚧钃濆睆鎴栧彲鍒╃敤鐨勫畨鍏ㄦ紡媧炪?/p>
瑙e喅鏂規(guī)闈炲父綆鍗曘傛鏌ヨ繑鍥炲兼槸鍚︿負 NULL錛屽茍鎵ц姝g‘鐨勬搷浣溿?/p>
char *str;
str = (char *)malloc(MAX_PATH);
if (str != NULL)
{
str[0] = 0;
...
}
涓庤繑鍥炲兼鏌ヤ竴鏍鳳紝璁稿浜虹浉淇″疄闄呬笂涓嶄細鍙戠敓鍐呭瓨鍒嗛厤闂銆傝瘹鐒訛紝璇ラ棶棰樺茍涓嶆繪槸鍙戠敓錛屼絾榪欏茍涓嶆剰鍛崇潃瀹冩案榪滀笉浼氬彂鐢熴傚鏋滄?zhèn)ㄨ鎴愬崈涓婁竾锛堟垨鏁颁互鐧句竾锛夌殑鐢ㄦ埊偪愯鎮(zhèn)ㄧ殑枋Y浠訛紝鍗充嬌璇ラ棶棰樻瘡鏈堜粎瀵規(guī)瘡涓敤鎴峰彂鐢熶竴嬈★紝鍚庢灉涔熸槸涓ラ噸鐨勩?/p>
璁稿浜虹浉淇★紝鍦ㄥ唴瀛樿楀敖鏃跺仛浠涔堥兘鏄棤鎵璋撶殑銆傜▼搴忓簲璇ラ鍑恒備絾鏄紝榪欏湪璁稿鏂歸潰閮戒笉閫傜敤銆傞鍏堬紝鍋囪紼嬪簭鍦ㄥ唴瀛樿楀敖鏃墮鍑猴紝閭d箞灝嗕笉浼氫繚瀛樻暟鎹枃浠躲傚叾嬈★紝浜轟滑閫氬父鏈熸湜鏈嶅姟鍜屽簲鐢ㄧ▼搴忚兘澶熼暱鏈熻繍琛岋紝鍥犳瀹冧滑鑳藉鍦ㄥ唴瀛樻殏鏃朵笉瓚蟲椂緇х畫姝e父榪愯鏄嚦鍏抽噸瑕佺殑銆傜涓夛紝瀵逛簬鍦ㄥ祵鍏ュ紡鐜涓繍琛岀殑杞歡鑰岃█錛岄鍑轟笉鏄彲琛岀殑閫夋嫨銆傚鐞嗗唴瀛樺垎閰嶅彲鑳介潪甯擱夯鐑︼紝浣嗚繖浠朵簨鎯呭繀欏誨仛銆?/p>
鏈夋椂錛屾剰澶栫殑 NULL 鎸囬拡鍙兘涓嶄細瀵艱嚧紼嬪簭宕╂簝錛屼絾榪欎粛鐒朵笉鏄歡濂戒簨鎯呫?/p>
HBITMAP hBitmap; HBITMAP hOldBitmap; hBitmap = CreateBitmap(. . .); hOldBitmap = SelectObject(hDC, hBitmap); // WRONG!!! ...
SelectObject 鐨勬枃妗e湪瀵?NULL 浣嶅浘鎵ц鍝簺鎿嶄綔鏂歸潰鍚硦涓嶆竻銆傝繖鍙兘涓嶄細瀵艱嚧宕╂簝錛屼絾瀹冩樉鐒舵槸涓嶅彲闈犵殑銆備唬鐮佸緢鍙兘鍑轟簬鏌愮鍘熷洜鑰屽垱寤轟綅鍥撅紝騫跺笇鏈涚敤瀹冩潵榪涜涓浜涚粯鍥懼伐浣溿備絾鏄紝鍥犱負瀹冩湭鑳藉垱寤轟綅鍥撅紝鎵浠ョ粯鍥炬搷浣滃皢涓嶄細鍙戠敓銆傚嵆浣夸唬鐮佹病鏈夊穿婧冿紝榪欓噷涔熸槑鏄懼瓨鍦ㄤ竴涓敊璇傚悓鏍鳳紝鎮(zhèn)ㄩ渶瑕佽繘琛屾鏌ャ?/p>
HBITMAP hBitmap;
HBITMAP hOldBitmap;
hBitmap = CreateBitmap(. . .);
if (hBitmap != NULL)
{
hOldBitmap = SelectObject(hDC, hBitmap);
...
}
else
...
褰撴?zhèn)ㄤ娇鐢?C++ 榪愮畻絎?new 鏃訛紝浜嬫儏寮濮嬪彉寰楁洿鍔犳湁瓚c備緥濡傦紝濡傛灉鎮(zhèn)ㄨ浣跨敤 MFC錛屽垯鍏ㄥ眬榪愮畻絎?new 灝嗗湪鍐呭瓨鑰楀敖鏃跺紩鍙戜竴涓紓甯搞傝繖鎰忓懗鐫鎮(zhèn)ㄤ笉鑳芥墽琛屼互涓嬫搷浣滐細
int *ptr1; int *ptr2; ptr1 = new int[10]; ptr2 = new int[10]; // WRONG!!!!
濡傛灉絎簩嬈″唴瀛樺垎閰嶅紩鍙戝紓甯革紝鍒欑涓嬈″垎閰嶇殑鍐呭瓨灝嗘硠婕忋傚鏋滄?zhèn)ㄧ殑浠g爜宓屽叆鍒盀畣瑕侀暱鏈煒q愯鐨勬湇鍔℃垨搴旂敤紼嬪簭涓紝鍒欒繖浜涙硠婕忎細绱Н璧鋒潵銆?/p>
鍙槸鎹曟崏寮傚父鏄笉澶熺殑錛屾?zhèn)ㄧ殑寮傚父澶勭悊浠g爜杩樺繀椤绘槸姝<嫯鐨勩備笉瑕佹帀鍒頒笅闈㈣繖涓浜虹殑闄烽槺涓細
int *ptr1;
int *ptr2;
try {
ptr1 = new int[10];
ptr2 = new int[10];
}
catch (CMemoryException *ex) {
delete [] ptr1; // WRONG!!!
delete [] ptr2; // WRONG!!!
}
濡傛灉絎竴嬈″唴瀛樺垎閰嶅紩鍙戜簡寮傚父錛屾?zhèn)畣鎹曟崏璇ュ紓甯稿Q屼絾瑕佸垹闄や竴涓湭鍒濆鍖栫殑鎸囬拡銆傚鏋滄?zhèn)ō憶_騫歌繍錛岃繖灝嗗鑷村嵆鏃惰闂啿紿佸拰宕╂簝銆傛洿鏈夊彲鑳界殑鏄紝瀹冨皢瀵艱嚧鍫嗘崯鍧忥紝浠庤岄犳垚鏁版嵁鎹熷潖鍜?鎴栧湪灝嗘潵闅句互璋冭瘯鐨勫穿婧冦傚敖鍔涘垵濮嬪寲涓嬪垪鍙橀噺鏄煎緱鐨勶細
int *ptr1 = 0;
int *ptr2 = 0;
try {
ptr1 = new int[10];
ptr2 = new int[10];
}
catch (CMemoryException *ex) {
delete [] ptr1;
delete [] ptr2;
}
搴旇鎸囧嚭鐨勬槸錛孋++ 榪愮畻絎?new 鏈夎澶氬井濡欎箣澶勩傛?zhèn)ㄥ彲浠ョ敤澶毧U嶄笉鍚岀殑鏂瑰紡鏉ヤ慨鏀瑰叏灞榪愮畻絎?new 鐨勮涓恒備笉鍚岀殑綾誨彲浠ュ叿鏈夊畠浠嚜宸辯殑榪愮畻絎?new錛屽茍涓斿鏋滄?zhèn)ㄤ笉鋴社?MFC錛屽垯鍙兘浼氱湅鍒頒笉鍚岀殑榛樿琛屼負銆備緥濡傦紝鍦ㄥ唴瀛樺垎閰嶅け璐ユ椂榪斿洖 NULL錛岃屼笉鏄紩鍙戝紓甯搞傛湁鍏寵涓婚鐨勮緇嗕俊鎭紝璇峰弬闃?Bobby Schmidt 鐨?#8220;Deep C++”緋誨垪鏂囩珷涓湁鍏沖鐞嗗紓甯哥殑絎?7 閮ㄥ垎銆?/p>
濡傛灉鎮(zhèn)ㄨ緙栧啓鍙潬鐨勪唬鐮侊紝鍒欒嚦鍏抽噸瑕佺殑涓鐐規(guī)槸浠庝竴寮濮嬪氨鑰冭檻濡備綍澶勭悊寮傚父浜嬩歡銆傛?zhèn)ㄤ笉鑳戒簨鍚庡啀鑰冭檻瀵瑰紓甯鎬簨浠剁殑澶勭悊銆傚湪鑰冭檻姝ょ被浜嬩歡鏃訛紝閿欒澶勭悊鏄竴涓叧閿殑鏂歸潰銆?/p>
閿欒澶勭悊寰堥毦姝g‘鎵ц銆傚敖綆℃湰鏂囧彧鏄矖嫻呭湴璁ㄨ浜嗚繖涓闂錛屼絾鍏朵腑浠嬬粛鐨勫師鍒欏瀹氫簡涓涓己澶х殑鍩虹銆傝璁頒綇浠ヤ笅瑕佺偣錛?/p>
鍦ㄨ璁″簲鐢ㄧ▼搴忥紙鎴?API錛夋椂錛屽簲棰勫厛鑰冭檻鎮(zhèn)ㄥ枩嬈㈢殑閿欒澶勭悊鑼冧緥銆?/p>
鍦ㄤ嬌鐢?API 鏃訛紝搴斾簡瑙e畠鐨勯敊璇鐞嗚寖渚嬨?/p>
濡傛灉鎮(zhèn)ㄥ浜庡瓨鍦ㄥ涓敊璇鐞嗚寖渚嬬殑鎯呭喌涓嬶紝璇瘋鎯曞彲鑳介犳垚娣蜂貢鐨勬牴婧愩?/p>
鎬繪槸媯鏌ヨ繑鍥炵姸鎬併?/p>
鎬繪槸媯鏌ュ唴瀛樺垎閰嶃?/p>
濡傛灉鎮(zhèn)ㄦ墽琛屼簡涓婅堪鎵鏈夋搷浣滐紝灝辮兘澶熺紪鍐欏嚭鍙潬鐨勫簲鐢ㄧ▼搴忋?/span>
鍏充簬C++涓紓甯哥殑浜夎浣曞叾澶氫篃錛屼絾寰寰鏄竴浜涗笉鍚堜簨瀹炵殑璇В銆傚紓甯告浘緇忔槸涓涓毦浠ョ敤濂界殑璇█鐗規(guī)э紝騫歌繍鐨勬槸錛岄殢鐫C++紺懼尯緇忛獙鐨勭Н绱紝浠婂ぉ鎴戜滑宸茬粡鏈夎凍澶熺殑鐭ヨ瘑杞繪澗緙栧啓寮傚父瀹夊叏鐨勪唬鐮佷簡錛岃屼笖緙栧啓寮傚父瀹夊叏鐨勪唬鐮佷竴鑸篃涓嶄細瀵規(guī)ц兘閫犳垚褰卞搷銆?span lang=EN-US>
銆銆浣跨敤寮傚父榪樻槸榪斿洖閿欒鐮侊紵榪欐槸涓簤璁轟笉浼戠殑璇濋銆傚ぇ瀹朵竴瀹氬惉璇磋繃榪欐牱鐨勮娉曪細鍙湁鍦ㄧ湡姝e紓甯哥殑鏃跺欙紝鎵嶄嬌鐢ㄥ紓甯搞傞偅浠涔堟槸“鐪熸寮傚父鐨勬椂鍊?span lang=EN-US>”錛熷湪鍥炵瓟榪欎釜闂浠ュ墠錛岃鎴戜滑鍏堢湅涓鐪嬬▼搴忚璁′腑鐨勪笉鍙樺紡鍘熺悊銆?span lang=EN-US>
銆銆瀵硅薄灝辨槸灞炴ц仛鍚堝姞鏂規(guī)硶錛屽浣曞垽瀹氫竴涓璞$殑灞炴ц仛鍚堟槸涓嶆槸澶勪簬閫昏緫涓婃紜殑鐘舵佸憿錛熻繖鍙互閫氳繃涓緋誨垪鐨勬柇璦錛屾渶鍚庝笅涓涓粨璁鴻錛氳繖涓璞$殑灞炴ц仛鍚堥昏緫涓婃槸姝g‘鐨勬垨鑰呮槸鏈夐棶棰樼殑銆傝繖浜涙柇璦灝辨槸琛¢噺瀵硅薄灞炴ц仛鍚堝閿欑殑涓嶅彉寮忋?span lang=EN-US>
銆銆鎴戜滑閫氬父鍦ㄥ嚱鏁拌皟鐢ㄤ腑錛屽疄鏂戒笉鍙樺紡鐨勬鏌ャ備笉鍙樺紡鍒嗕負涓夌被錛氬墠鏉′歡錛屽悗鏉′歡鍜屼笉鍙樺紡銆傚墠鏉′歡鏄寚鍦ㄥ嚱鏁拌皟鐢ㄤ箣鍓嶏紝蹇呴』婊¤凍鐨勯昏緫鏉′歡錛屽悗鏉′歡鏄嚱鏁拌皟鐢ㄥ悗蹇呴』婊¤凍鐨勯昏緫鏉′歡錛屼笉鍙樺紡鍒欐槸鏁翠釜鍑芥暟鎵ц涓兘蹇呴』婊¤凍鐨勬潯浠躲傚湪鎴戜滑鐨勮璁轟腑錛屼笉鍙樺紡鏃㈡槸鍓嶆潯浠跺張鏄悗鏉′歡銆傚墠鏉′歡鏄繀欏繪弧瓚崇殑錛屽鏋滀笉婊¤凍錛岄偅灝辨槸紼嬪簭閫昏緫閿欒錛屽悗鏉′歡鍒欎笉涓瀹氥傜幇鍦紝鎴戜滑鍙互鐢ㄤ笉鍙樺紡鏉ヤ弗鏍煎畾涔夊紓甯哥姸鍐典簡錛氭弧瓚沖墠鏉′歡錛屼絾鏄棤娉曟弧瓚沖悗鏉′歡錛屽嵆涓哄紓甯哥姸鍐點傚綋涓斾粎褰撳彂鐢熷紓甯哥姸鍐墊椂錛屾墠鎶涘嚭寮傚父銆?span lang=EN-US>
銆銆鍏充簬浣曟椂鎶涘嚭寮傚父鐨勫洖絳斾腑錛屽茍涓嶆帓鏂ヨ繑鍥炲兼姤鍛婇敊璇紝鑰屼笖榪欎袱鑰呮槸姝d氦鐨勩傜劧鑰岋紝浠庢垜浠粡楠屼笂鏉ヨ錛屽畬鍏ㄥ彲浠ュ湪榪欎袱鑰呬腑鍔犱互閫夋嫨錛岃繖鍙堟槸涓轟粈涔堝憿錛熶簨瀹炰笂錛屽綋鎴戜滑鍋氬嚭榪欑閫夋嫨鏃訛紝蹇呯劧鎰忓懗鐫鎺ュ彛璇剰鐨勬敼鍙橈紝鍦ㄤ笉鏀瑰彉鎺ュ彛鐨勬儏鍐典笅錛屽叾瀹炴槸鏃犳硶閫夋嫨鐨?span lang=EN-US>(璇曡瘯鐪嬶紝鐢ㄨ繑鍥炲煎鐞嗘瀯閫犲嚱鏁頒腑鐨勯敊璇?span lang=EN-US>)銆傞氳繃涓嶅彉寮忓尯鍒嚭姝e父鍜屽紓甯哥姸鍐碉紝榪樺彲浠ユ洿濂藉湴鎻愮偧鎺ュ彛銆?span lang=EN-US>
銆銆瀵逛簬寮傚父瀹夊叏鐨勮瘎瀹氾紝鍙垎涓轟笁涓駭鍒細鍩烘湰淇濊瘉銆佸己淇濊瘉鍜屼笉浼氬け璐ャ?span lang=EN-US>
銆銆鍩烘湰淇濊瘉錛氱‘淇濆嚭鐜板紓甯告椂紼嬪簭錛堝璞★級澶勪簬鏈煡浣嗘湁鏁堢殑鐘舵併傛墍璋撴湁鏁堬紝鍗沖璞$殑涓嶅彉寮忔鏌ュ叏閮ㄩ氳繃銆?span lang=EN-US>
銆銆寮轟繚璇侊細紜繚鎿嶄綔鐨勪簨鍔℃э紝瑕佷箞鎴愬姛錛岀▼搴忓浜庣洰鏍囩姸鎬侊紝瑕佷箞涓嶅彂鐢熸敼鍙樸?span lang=EN-US>
銆銆涓嶄細澶辮觸錛氬浜庡ぇ澶氭暟鍑芥暟鏉ヨ錛岃繖鏄緢闅句繚璇佺殑銆傚浜?span lang=EN-US>C++紼嬪簭錛岃嚦灝戞瀽鏋勫嚱鏁般侀噴鏀懼嚱鏁板拰swap鍑芥暟瑕佺‘淇濅笉浼氬け璐ワ紝榪欐槸緙栧啓寮傚父瀹夊叏浠g爜鐨勫熀紜銆?span lang=EN-US>
銆銆棣栧厛浠庡紓甯告儏鍐典笅璧勬簮綆$悊鐨勯棶棰樺紑濮?span lang=EN-US>.寰堝浜哄彲鑳介兘榪欎箞騫茶繃:
Type* obj = new Type;
try{ do_something...}
catch(...){ delete obj; throw;}
銆銆涓嶈榪欎箞鍋?span lang=EN-US>!榪欎箞鍋氬彧浼氫嬌浣犵殑浠g爜鐪嬩笂鍘繪販涔?span lang=EN-US>,鑰屼笖浼氶檷浣庢晥鐜?span lang=EN-US>,榪欎篃鏄竴鐩翠互鏉ュ紓甯稿悕澹頒笉澶уソ鐨勫師鍥犱箣涓. 璇峰熷姪浜?span lang=EN-US>RAII鎶鏈潵瀹屾垚榪欐牱鐨勫伐浣?span lang=EN-US>:
auto_ptr<Type> obj_ptr(new Type);
do_something...
銆銆榪欐牱鐨勪唬鐮佺畝媧併佸畨鍏ㄨ屼笖鏃犳崯浜庢晥鐜囥傚綋浣犱笉鍏沖績鎴栨槸鏃犳硶澶勭悊寮傚父鏃?span lang=EN-US>,璇蜂笉瑕佽瘯鍥炬崟鑾峰畠銆傚茍闈炰嬌鐢?span lang=EN-US>try...catch鎵嶈兘緙栧啓寮傚父瀹夊叏鐨勪唬鐮?span lang=EN-US>,澶ч儴鍒嗗紓甯稿畨鍏ㄧ殑浠g爜閮戒笉闇瑕?span lang=EN-US>try...catch銆傛垜鎵胯錛岀幇瀹炰笘鐣屽茍闈炴繪槸濡備笂榪扮殑渚嬪瓙閭f牱綆鍗曪紝浣嗘槸榪欎釜渚嬪瓙紜疄鍙互浠h〃寰堝寮傚父瀹夊叏浠g爜鐨勫仛娉曘傚湪榪欎釜渚嬪瓙涓紝boost::scoped_ptr鏄?span lang=EN-US>auto_ptr涓涓洿閫傚悎鐨勬浛浠e搧銆?span lang=EN-US>
銆銆鐜板湪鏉ヨ冭檻榪欐牱涓涓瀯閫犲嚱鏁幫細
Type() : m_a(new TypeA), m_b(new TypeB){}
銆銆鍋囪鎴愬憳鍙橀噺m_a鍜?span lang=EN-US>m_b鏄師濮嬬殑鎸囬拡綾誨瀷錛屽茍涓斿拰Type鍐呯殑鐢蟲槑欏哄簭涓鑷淬傝繖鏍風殑浠g爜鏄笉瀹夊叏鐨勶紝瀹冨瓨鍦ㄨ祫婧愭硠婕忛棶棰橈紝鏋勯犲嚱鏁扮殑澶辮觸鍥炴粴鏈哄埗鏃犳硶搴斿榪欐牱鐨勯棶棰樸傚鏋?span lang=EN-US>new TypeB鎶涘嚭寮傚父,new TypeA榪斿洖鐨勮祫婧愭槸寰椾笉鍒伴噴鏀炬満浼氱殑.鏇劇粡,寰堝浜虹敤榪欐牱鐨勬柟娉曢伩鍏嶅紓甯?span lang=EN-US>:
Type() : m_a(NULL), m_b(NULL){
auto_ptr<TypeA> tmp_a(new TypeA);
auto_ptr<TypeB> tmp_b(new TypeB);
m_a = tmp_a.release();
m_b = tmp_b.release();
}
銆銆褰撶劧,榪欐牱鐨勬柟娉曠‘瀹炴槸鑳藉瀹炵幇寮傚父瀹夊叏鐨勪唬鐮佺殑,鑰屼笖鍏朵腑瀹炵幇鎬濇兂灝嗘槸闈炲父閲嶈鐨?span lang=EN-US>,鍦ㄥ浣曞疄鐜板己淇濊瘉鐨勫紓甯稿畨鍏ㄤ唬鐮佷腑浼氶噰鐢ㄨ繖縐嶆濇兂.鐒惰岃繖縐嶅仛娉曚笉澶熷交搴曪紝鑷沖皯鏋愭瀯鍑芥暟榪樻槸瑕佹墜鍔ㄥ畬鎴愮殑銆傛垜浠粛鐒跺彲浠ュ熷姪RAII鎶鏈紝鎶婅繖浠朵簨鍋氬緱鏇翠負褰誨簳錛?span lang=EN-US>shared_ptr<TypeA> m_a; shared_ptr<TypeB> m_b;榪欐牱,鎴戜滑灝卞彲浠ヨ交鑰屾槗涓懼湴鍐欏嚭寮傚父瀹夊叏鐨勪唬鐮?span lang=EN-US>:
Type() : m_a(new TypeA), m_b(new TypeB){}
銆銆濡傛灉浣犺寰?span lang=EN-US>shared_ptr鐨勬ц兘涓嶈兘婊¤凍瑕佹眰錛屽彲浠ョ紪鍐欎竴涓帴鍙g被浼?span lang=EN-US>scoped_ptr鐨勬櫤鑳芥寚閽堢被,鍦ㄦ瀽鏋勫嚱鏁頒腑閲婃斁璧勬簮鍗沖彲銆傚鏋滅被璁捐鎴愪笉鍙鍒剁殑錛屼篃鍙互鐩存帴鐢?span lang=EN-US>scoped_ptr銆傚己鐑堝緩璁笉瑕佹妸auto_ptr浣滀負鏁版嵁鎴愬憳浣跨敤,scoped_ptr铏界劧鍚嶅瓧涓嶅ぇ濂斤紝浣嗘槸鑷沖皯寰堝畨鍏ㄨ屼笖涓嶄細瀵艱嚧娣蜂貢銆?span lang=EN-US>
銆銆RAII鎶鏈茍涓嶄粎浠呯敤浜庝笂榪頒緥瀛愪腑錛屾墍鏈夊繀欏繪垚瀵瑰嚭鐜扮殑鎿嶄綔閮藉彲浠ラ氳繃榪欎竴鎶鏈畬鎴愯屼笉蹇?span lang=EN-US>try...catch.涓嬮潰鐨勪唬鐮佷篃鏄父瑙佺殑錛?span lang=EN-US>
a_lock.lock();
try{ ...} catch(...) {a_lock.unlock();throw;}
a_lock.unlock();
銆銆鍙互榪欐牱瑙e喅錛屽厛鎻愪緵涓涓垚瀵規(guī)搷浣滅殑杈呭姪綾伙細
struct scoped_lock{
explicit scoped_lock(Lock& lock) : m_l(lock){m_l.lock();}
~scoped_lock(){m_l.unlock();}
private:
Lock& m_l;
};
銆銆鐒跺悗錛屼唬鐮佸彧闇榪欐牱鍐欙細
scoped_lock guard(a_lock);
do_something...
銆銆娓呮櫚鑰屼紭闆咃紒緇х畫鑰冨療榪欎釜渚嬪瓙,鍋囪鎴戜滑騫朵笉闇瑕佹垚瀵規(guī)搷浣?span lang=EN-US>, 鏄劇劧錛屼慨鏀?span lang=EN-US>scoped_lock鏋勯犲嚱鏁板嵆鍙В鍐抽棶棰樸傜劧鑰岋紝寰寰鏂規(guī)硶鍚嶇О鍜屽弬鏁頒篃涓嶆槸閭d箞鍥哄畾鐨勶紝鎬庝箞鍔烇紵鍙互鍊熷姪榪欐牱涓涓緟鍔╃被錛?span lang=EN-US>
template<typename FEnd, typename FBegin>
struct pair_guard{
pair_guard(FEnd fe, FBegin fb) : m_fe(fe) {if (fb) fb();}
~pair_guard(){m_fe();}
private:
FEnd m_fe;
...//紱佹澶嶅埗
};
typedef pair_guard<function<void () > , function<void()> > simple_pair_guard;
銆銆濂戒簡錛屽熷姪boost搴?span lang=EN-US>,鎴戜滑鍙互榪欐牱鏉ョ紪鍐欎唬鐮佷簡錛?span lang=EN-US>
simple_pair_guard guard(bind(&Lock::unlock, a_lock), bind(&Lock::lock, a_lock) );
do_something...
銆銆鎴戞壙璁わ紝榪欐牱鐨勪唬鐮佷笉濡傚墠闈㈢殑綆媧佸拰瀹規(guī)槗鐞嗚В錛屼絾鏄畠鏇寸伒媧?span lang=EN-US>,鏃犺鍑芥暟鍚嶇О鏄粈涔堬紝閮藉彲浠ユ嬁鏉ョ粨瀵廣傛垜浠彲浠ュ姞寮哄bind鐨勮繍鐢紝緇撳悎鍗犱綅絎﹀拰reference_wrapper,灝卞彲浠ュ鐞嗗嚱鏁板弬鏁般佸姩鎬佺粦瀹氬彉閲忋傛墍鏈夋垜浠湪catch鍐呭鐨勭浉鍚屽伐浣滐紝浜ょ粰pair_guard鍘誨畬鎴愬嵆鍙?span lang=EN-US>
銆銆鑰冨療鍓嶉潰鐨勫嚑涓緥瀛愶紝涔熻浣犲凡緇忓彂鐜頒簡錛屾墍璋撳紓甯稿畨鍏ㄧ殑浠g爜錛岀珶鐒跺氨鏄浣曢伩鍏?span lang=EN-US>try...catch鐨勪唬鐮侊紝榪欏拰鐩磋浼間箮鏄繚鑳岀殑銆傛湁浜涙椂鍊欙紝浜嬫儏灝辨槸濡傛榪濊儗鐩磋銆傚紓甯告槸鏃犲涓嶅湪鐨勶紝褰撲綘涓嶉渶瑕佸叧蹇冨紓甯告垨鑰呮棤娉曞鐞嗗紓甯哥殑鏃跺欙紝灝卞簲璇ラ伩鍏嶆崟鑾峰紓甯搞傞櫎闈炰綘鎵撶畻鎹曡幏鎵鏈夊紓甯革紝鍚﹀垯錛岃鍔″繀鎶婃湭澶勭悊鐨勫紓甯稿啀嬈℃姏鍑恒?span lang=EN-US>try...catch鐨勬柟寮忓浐鐒惰兘澶熷啓鍑哄紓甯稿畨鍏ㄧ殑浠g爜錛屼絾鏄偅鏍風殑浠g爜鏃犺鏄竻鏅版у拰鏁堢巼閮芥槸闅句互蹇嶅彈鐨勶紝鑰岃繖姝f槸寰堝浜烘姩鍑?span lang=EN-US>C++寮傚父鐨勭悊鐢便傚湪C++鐨勪笘鐣岋紝灝卞簲璇ユ寜鐓?span lang=EN-US>C++鐨勬硶鍒欐潵琛屼簨銆?span lang=EN-US>
銆銆濡傛灉鎸夌収涓婅堪鐨勫師鍒欒浜嬶紝鑳藉瀹炵幇鍩烘湰淇濊瘉浜嗗悧錛熻瘹鎭沖湴璇達紝鍩虹璁炬柦鏈変簡錛屼絾鎶宸т笂榪樹笉澶燂紝璁╂垜浠戶緇垎鏋愪笉澶熺殑閮ㄥ垎銆?span lang=EN-US>
銆銆瀵逛簬涓涓柟娉曞父瑙勭殑鎵ц榪囩▼錛屾垜浠湪鏂規(guī)硶鍐呴儴鍙兘闇瑕佸嬈′慨鏀瑰璞$姸鎬侊紝鍦ㄦ柟娉曟墽琛岀殑涓旓紝瀵硅薄鏄彲鑳藉浜庨潪娉曠姸鎬佺殑錛堥潪娉曠姸鎬?span lang=EN-US> != 鏈煡鐘舵侊級錛屽鏋滄鏃跺彂鐢熷紓甯革紝瀵硅薄灝嗗彉寰楁棤鏁堛傚埄鐢ㄥ墠榪扮殑鎵嬫錛屽湪pair_guard鐨勬瀽鏋勪腑淇瀵硅薄鏄彲琛岀殑錛屼絾緙轟箯鏁堢巼錛屼唬鐮佸皢鍙樺緱澶嶆潅銆傛渶濂界殑鍔炴硶鏄?span lang=EN-US>......鏄伩鍏嶈繖涔堜綔錛岃繖涔堣鏈夌偣涓嶅帤閬擄紝浣嗗茍闈炴鏃犻亾鐞嗐傚綋瀵硅薄澶勪簬闈炴硶鐘舵佹椂錛屾剰鍛崇潃姝ゆ椂姝ゅ埢瀵硅薄涓嶈兘瀹夊叏閲嶅叆銆佷笉鑳藉叡浜傜幇瀹炰竴鐐圭殑鍋氭硶鏄細
銆銆a.姣忎竴嬈′慨鏀瑰璞★紝閮界‘淇濆璞″浜庡悎娉曠姸鎬?span lang=EN-US>
銆銆b.鎴栬呭綋瀵硅薄澶勪簬闈炴硶鐘舵佹椂錛屾墍鏈夋搷浣滃喅涓嶄細澶辮觸銆?span lang=EN-US>
銆銆鍦ㄦ帴涓嬫潵鐨勫己淇濊瘉鐨勮璁轟腑緇嗚堪濡備綍鍋氬埌榪欎袱鐐廣?span lang=EN-US>
銆銆寮轟繚璇佹槸浜嬪姟鎬х殑錛岃繖涓簨鍔℃у拰鏁版嵁搴撶殑浜嬪姟鎬ф湁鍖哄埆錛屼篃鏈夊叡閫氭с傚疄鐜板己淇濊瘉鐨勫師鍒欏仛娉曟槸錛氬湪鍙兘澶辮觸鐨勮繃紼嬩腑璁$畻鍑哄璞$殑鐩爣鐘舵侊紝浣嗘槸涓嶄慨鏀瑰璞★紝鍦ㄥ喅涓嶅け璐ョ殑榪囩▼涓紝鎶婂璞℃浛鎹㈠埌鐩爣鐘舵併傝冨療涓涓笉瀹夊叏鐨勫瓧絎︿覆璧嬪兼柟娉曪細
string& operator=(const string& rsh){
if (this != &rsh){
myalloc locked_pool(m_data);
locked_pool.deallocate(m_data);
if (rsh.empty())
m_data = NULL;
else{
m_data = locked_pool.allocate(rsh.size() + 1);
never_failed_copy(m_data, rsh.m_data, rsh.size() + 1);
}
}
return *this;
}
銆銆locked_pool鏄負浜嗛攣瀹氬唴瀛橀〉銆備負浜嗚璁虹殑綆鍗曡搗瑙侊紝鎴戜滑鍋囪鍙湁locked_pool鏋勯犲嚱鏁板拰allocate鏄彲鑳芥姏鍑哄紓甯哥殑錛岄偅涔堣繖孌典唬鐮佽繛鍩烘湰淇濊瘉涔熸病鏈夊仛鍒般傝嫢allocate澶辮觸錛屽垯m_data鍙栧煎皢鏄潪娉曠殑銆傚弬鑰冧笂闈㈢殑b鏉$洰錛屾垜浠彲浠ヨ繖鏍蜂慨鏀逛唬鐮侊細
myalloc locked_pool(m_data);
locked_pool.deallocate(m_data); //榪涘叆闈炴硶鐘舵?span lang=EN-US>
m_data = NULL; //绔嬪埢鍐嶆鍥炲埌鍚堟硶鐘舵?span lang=EN-US>,涓斾笉浼氬け璐?span lang=EN-US>
if(!rsh.empty()){
m_data = locked_pool.allocate(rsh.size() + 1);
never_failed_memcopy(m_data, rsh.m_data, rsh.size() + 1);
}
銆銆鐜板湪錛屽鏋?span lang=EN-US>locked_pool澶辮觸錛屽璞′笉鍙戠敓鏀瑰彉銆傚鏋?span lang=EN-US>allocate澶辮觸錛屽璞℃槸涓涓┖瀛楃涓詫紝榪欐棦涓嶆槸鍒濆鐘舵侊紝涔熶笉鏄垜浠鏈熺殑鐩爣鐘舵侊紝浣嗗畠鏄竴涓悎娉曠姸鎬併傛垜浠槓鏄庝簡瀹炵幇鍩烘湰淇濊瘉鎵闇瑕佺殑鎶宸ч儴鍒嗭紝緇撳悎鍓嶈堪鐨勫熀紜璁炬柦錛?span lang=EN-US>RAII鐨勮繍鐢級錛屽畬鍏ㄥ彲浠ュ疄鐜板熀鏈繚璇佷簡...鍝?span lang=EN-US>,鍏跺疄榪樻槸鏈変竴鐐圭枏婕忥紝涓嶈繃錛岄偅灝辯暀鍒版渶鍚庡惂銆?span lang=EN-US>
銆銆緇х畫錛岃涓婇潰鐨勪唬鐮佸疄鐜板己淇濊瘉錛?span lang=EN-US>
myalloc locked_pool(m_data);
char* tmp 錛?span lang=EN-US> NULL;
if(!rsh.empty()){
tmp = locked_pool.allocate(rsh.size() + 1);
never_failed_memcopy(tmp, rsh.m_data, rsh.size() + 1); //鍏堢敓鎴愮洰鏍囩姸鎬?span lang=EN-US>
}
swap(tmp, m_data); //瀵硅薄瀹夊叏榪涘叆鐩爣鐘舵?span lang=EN-US>
m_alloc.deallocate(tmp); //閲婃斁鍘熸湁璧勬簮
銆銆寮轟繚璇佺殑浠g爜澶氫嬌鐢ㄤ簡涓涓眬閮ㄥ彉閲?span lang=EN-US>tmp錛屽厛璁$畻鍑虹洰鏍囩姸鎬佹斁鍦?span lang=EN-US>tmp涓紝鐒跺悗鍦ㄥ畨鍏ㄨ繘鍏ョ洰鏍囩姸鎬侊紝榪欎釜榪囩▼鎴戜滑騫舵病鏈夋崯澶變粈涔堜笢瑗匡紙浠g爜娓呮櫚鎬э紝鎬ц兘絳夌瓑錛夈傜湅涓婂幓錛屽疄鐜板己淇濊瘉騫朵笉姣斿熀鏈繚璇佸洶闅懼灝戯紝涓鑸岃█錛屼篃紜疄濡傛銆備笉榪囷紝鍒お鑷俊錛屼婦涓縐嶅吀鍨嬬殑寰堥毦瀹炵幇寮轟繚璇佺殑渚嬪瓙錛屽浜庡尯闂存搷浣滅殑寮轟繚璇侊細
for (itr = range.begin(); itr != range.end(); ++itr){
itr->do_something();
}
銆銆濡傛灉鏌愪釜do_something澶辮觸浜嗭紝range灝嗗浜庝粈涔堢姸鎬侊紵榪欐浠g爜浠嶇劧鍋氬埌浜嗗熀鏈繚璇侊紝浣嗕笉鏄己淇濊瘉鐨勶紝鏍規(guī)嵁瀹炵幇寮轟繚璇佺殑鍩烘湰鍘熷垯錛屾垜浠彲浠ヨ繖涔堝仛錛?span lang=EN-US>
tmp = range;
for (itr = tmp.begin(); itr != tmp.end(); ++itr){
itr->do_something();
}
swap(tmp, range);
銆銆浼間箮寰堢畝鍗曞晩錛佸懙鍛碉紝榪欐牱鐨勫仛娉曞茍闈炰笉鍙彇錛屽彧鏄湁鏃跺欒涓嶉氥傚洜涓烘垜浠澶栦粯鍑轟簡鎬ц兘鐨勪唬浠鳳紝鑰屼笖錛岃繖涓唬浠峰彲鑳藉緢澶с傛棤璁哄浣曪紝鎴戜滑闃愯堪浜嗗疄鐜板己淇濊瘉鐨勬柟娉曪紝鎬庝箞鍙栬垗鍒欑敱鎮(zhèn)ㄥ喅瀹氫簡銆?span lang=EN-US>
銆銆鎺ヤ笅鏉ヨ璁烘渶鍚庝竴縐嶅紓甯稿畨鍏ㄤ繚璇侊細涓嶄細澶辮觸銆?span lang=EN-US>
銆銆閫氬父錛屾垜浠茍涓嶉渶瑕佽繖涔堝己鐨勫畨鍏ㄤ繚璇侊紝浣嗘槸鎴戜滑鑷沖皯蹇呴』淇濊瘉涓夌被榪囩▼涓嶄細澶辮觸錛氭瀽鏋勫嚱鏁幫紝閲婃斁綾誨嚱鏁幫紝swap銆傛瀽鏋勫拰閲婃斁鍑芥暟涓嶄細澶辮觸錛岃繖鏄?span lang=EN-US>RAII鎶鏈湁鏁堢殑鍩虹煶錛?span lang=EN-US>swap涓嶄細澶辮觸錛屾槸涓轟簡“鍦ㄥ喅涓嶅け璐ョ殑榪囩▼涓紝鎶婂璞℃浛鎹㈠埌鐩爣鐘舵?span lang=EN-US>”銆傛垜浠墠闈㈢殑鎵鏈夎璁洪兘鏄緩绔嬪湪榪欎笁綾昏繃紼嬩笉浼氬け璐ョ殑鍩虹涓婄殑錛屽湪榪欓噷錛屽譏琛ヤ簡涓婇潰鐨勯偅涓枏婕忋?span lang=EN-US>
銆銆涓鑸岃█錛岃璦鍐呴儴綾誨瀷鐨勮祴鍊箋佸彇鍦板潃絳夎繍綆楁槸涓嶄細鍙戠敓寮傚父鐨勶紝涓婅堪涓夌被榪囩▼閫昏緫涓婁篃鏄笉浼氬彂鐢熷紓甯哥殑銆傚唴閮ㄨ繍綆椾腑錛岄櫎娉曡繍綆楀彲鑳芥姏鍑哄紓甯搞備絾鏄湴鍧璁塊棶閿欓氬父鏄竴縐嶉敊璇紝鑰屼笉鏄紓甯革紝鎴戜滑鏈簲璇ュ湪鍓嶆潯浠舵鏌ヤ腑灝卞彂鐜扮殑榪欎竴鐐圭殑銆傛墍鏈変笉浼氬彂鐢熷紓甯告搷浣滅殑綆鍗曠瘡鍔狅紝浠嶇劧涓嶄細瀵艱嚧寮傚父銆?span lang=EN-US>
銆銆濂戒簡錛岀幇鍦ㄦ垜浠彲浠ユ葷粨涓涓嬬紪鍐欏紓甯稿畨鍏ㄤ唬鐮佺殑鍑犳潯鍑嗗垯浜嗭細
銆銆1.鍙湪搴旇浣跨敤寮傚父鐨勫湴鏂規(guī)姏鍑哄紓甯?span lang=EN-US>
銆銆2.濡傛灉涓嶇煡閬撳浣曞鐞嗗紓甯革紝璇蜂笉瑕佹崟鑾?span lang=EN-US>(鎴暀)寮傚父銆?span lang=EN-US>
銆銆3.鍏呭垎浣跨敤RAII錛屾梺璺紓甯搞?span lang=EN-US>
銆銆4.鍔姏瀹炵幇寮轟繚璇侊紝鑷沖皯瀹炵幇鍩烘湰淇濊瘉銆?span lang=EN-US>
銆銆5.紜繚鏋愭瀯鍑芥暟銆侀噴鏀劇被鍑芥暟鍜?span lang=EN-US>swap涓嶄細澶辮觸銆?span lang=EN-US>
銆銆鍙﹀錛岃繕鏈変竴浜涜璦緇嗚妭闂錛屽洜涓哄拰榪欎釜涓婚鏈夊叧涔熶竴騫跺垪鍑猴細
銆銆1.涓嶈榪欐牱鎶涘嚭寮傚父錛?span lang=EN-US>throw new exception;榪欏皢瀵艱嚧鍐呭瓨娉勬紡銆?span lang=EN-US>
銆銆2.鑷畾涔夌被鍨嬶紝搴旇鎹曡幏寮傚父鐨勫紩鐢ㄧ被鍨嬶細catch(exception& e)鎴?span lang=EN-US>catch(const exception& e)銆?span lang=EN-US>
銆銆3.涓嶈浣跨敤寮傚父瑙勮寖錛屽嵆浣挎槸絀哄紓甯歌鑼冦傜紪璇戝櫒騫朵笉淇濊瘉鍙姏鍑哄紓甯歌鑼冨厑璁哥殑寮傚父錛屾洿澶氬唴瀹硅鍙傝冪浉鍏充功綾嶃?/p>
鍒氬垰鍙戣〃浜嗐婁粈涔堟槸濂戠害銆嬩竴鏂囷紝紿佺劧鍙戠幇鑷繁閫氱瘒閮藉湪鍐欑悊璁猴紝娌℃湁瀹炰緥鏉ヨ瘉鏄庛傛墍浠ヨ刀蹇ˉ鍏呬竴涓弽闈㈡渚嬧斺擟++ IOStream銆傝鏄弽闈紝涓嶆槸鍥犱負IOStream搴撹璁″緱涓嶇簿褰╋紙鎭版伆鐩稿弽錛屼綘寰堥毦鎵懼埌姣擨OStream璁捐鏇翠負綺懼僵鐨凜++搴撲簡錛夛紝鑰屾槸鎯沖睍紺轟竴涓嬶紝鍦ㄦ病鏈夊綰︽蹇電殑鎬濇兂浣撶郴閲岋紝緇勪歡璁捐灝嗕負鏉冭矗涓嶆竻鐨勯敊璇鐞嗕粯鍑哄澶х殑浠d環(huán)銆?/p>
澶у鐭ラ亾錛孋++ IOStream搴撻潪甯哥粡鍏革紝鏈鍏堣搗婧愪簬Bjarne Stroustrup鐨凷tream搴擄紝涔嬪悗緇忚繃Jerry Schwartz銆丮artin Carroll銆丄ndy Koenig絳変漢鐨勬敼榪涳紝鎴愪負IOStream搴擄紝騫惰騫跺叆Bell瀹為獙瀹ゅ彂琛岀殑USD C++搴撲腑錛屽箍涓轟紶鎾傚悗鏉SD搴撻愭笎娑堜骸浜嗭紝鑰孖OStream鐢變簬鑾峰緱騫挎硾搴旂敤錛屽緱浠ュ垢鍏嶏紝騫朵互鏂扮殑褰㈠紡琚疆浜庢爣鍑嗗簱涓?/p>
瀵逛簬閿欒澶勭悊錛屽綋IOStream搴撹癁鐢熺殑鏃跺欙紙澶х害1985錛?987錛夛紝C++榪樻病鏈夊紓甯告満鍒躲傚洜姝わ紝Jerry Schwartz鍙戞槑浜嗚繖鏍蜂竴濂楅敊璇鐞嗘満鍒訛細
渚?錛氱粡鍏哥殑IOStream閿欒澶勭悊錛?/p>
ifstream ifs("filename.txt", ios::in);
if (!ifs) { // 榪欓噷瀹炴柦浜嗗悜void*杞瀷鐨勬搷浣?br> // 鏂囦歡鎵撳紑澶辮觸錛屽疄鏂介敊璇鐞?br> }
鍏堟祴璇曟枃浠舵槸鍚︽墦寮錛屽啀瀹炴柦鍏蜂綋鎿嶄綔錛岃繖鏄粡鍏窱OStream搴撶殑涓涓儻鐢ㄦ硶錛坕diom)銆?/p>
鎴戜滑鐜板湪璁炬兂鐢ㄦ埛娌℃湁寰堝ソ鍦版墽琛岃繖涓猧diom錛?/p>
int val;
ifstream ifs("filename.txt", ios::in);
ifs >> val;
濡傛灉filename.txt鎵撳紑澶辮觸錛屼細鍙戠敓浠涔堟儏鍐碉紵
濡傛灉鍝綅榪樻湁褰撳勾鐨凚orland C++ 3.1錛屽彲浠ヨ瘯鐫嫻嬭瘯涓涓嬨傛垜浼拌鏄粈涔堜篃涓嶅彂鐢燂紝鎴栬呰錛岀▼搴忓浜庢瀬绔嵄闄╃殑“undefined behavior”鐘舵併?/p>
榪欑鎯呭喌瀵笴++搴撳紑鍙戣呮潵璇存槸涓嶈兘鎺ュ彈鐨勩傚洜姝わ紝灝界闂鐨勫嚭鐜版槸鐢變簬鐢ㄦ埛鐨勯敊璇紙浠栦滑娌℃湁姝g‘鍦版祴璇曟祦鐘舵侊級錛屼絾鏄敱浜庨潪濂戠害鎬濇兂浣撶郴涓嬬殑鏉冭矗涓嶆竻錛孖OStream搴撶殑寮鍙戣呭紑濮嬭拷姹傝凍浠ュ簲瀵圭敤鎴烽敊璇殑緇勪歡寮鍙戞妧鏈傜敱姝わ紝IOStream寮濮嬪湪涓涓柟鍚戜笂琚嫋鍏ヤ簡澶嶆潅鎬х殑娉ユ江涔嬩腑銆?/p>
鎴戜滑鐪嬬湅鏍囧噯搴撲腑鐨勫浠樿繖縐嶆儏鍐甸噰鐢ㄤ粈涔堝姙娉曘傛爣鍑咺OStream鏈変竴涓垚鍛樺嚱鏁板彨鍋歟xceptions()錛屼笓闂ㄧ敤鏉ュ府鍔╃▼搴忓憳鍒囨崲寮傚父妯″紡銆傜己鐪佹儏鍐典笅錛屽紓甯歌Е鍙戝茍娌℃湁鎵撳紑錛屾墍浠ユ儏褰㈣窡緇忓吀IOStream搴撶浉鍚屻傚鏋滀綘鍦ㄦ搷浣淚OStream涔嬪墠濡備笅璋冪敤錛?/p>
strm.exceptions(std::ios::eofbit | std::ios::failbit |
std::ios::badbit);
鍒欏綋嫻佷笉澶勪簬good鐘舵佹椂錛屾墽琛岀被浼?strm >> val錛涜繖鏍風殑鎿嶄綔鏃訛紝灝嗕細鎶涘嚭寮傚父銆?/p>
榪欐牱鍋氱湅璧鋒潵涓嶉敊錛屾槸鍚楋紵
鎴戣寰椾笉鏄傝鎭曟垜C++鏍囧噯鐨勫紓璁紝榪欐槸鎴戠涓嬈℃寮忓C++鏍囧噯涓殑璁捐鎻愬嚭寮傝銆?/p>
榪欑璁捐甯︽潵鐨勭己鐐癸紝棣栧厛鏄鏉傘傚湪Nicolai Josuttis鐨凾he C++ Standard Library涓紝瀵硅繖涓満鍒舵暣鏁寸敤浜?欏電焊鏉ヨВ閲婏紝榪樻剰鐘規(guī)湭灝姐傚鏉傜殑璁捐蹇呯劧甯︽潵澶嶆潅鐨勪嬌鐢ㄨ鍒欙紝鑰岄潰瀵瑰鏉傜殑浣跨敤瑙勫垯錛岀敤鎴鋒槸鍙互鎶曠エ鐨勶紝閭e氨鏄綘鍋氫綘鐨勶紝鎴戜笉鐢紒璇昏繖綃囧笘瀛愮殑浜猴紝璋佸湪瀹為檯欏圭洰涓嬌鐢ㄨ繃exceptions()錛熶簨瀹炰笂錛屾垜涓漢鏄鎬昬xception鐢氫簬瀹蟲晆ndefined behavior銆?/p>
鑰屽浜庣敤鎴鋒潵璇達紝浣犲彲浠ヤ笉鐢紝鍗翠笉寰椾笉涓哄瀹冧粯鍑鴻繍琛屾ц兘鍜岀┖闂寸殑浠d環(huán)銆傝浣嶆湁鍏磋叮錛屼笉濡ㄨ拷韙竴涓狪OStream鍔熻兘鐨勫疄鐜幫紝鐪嬬湅涓轟簡鏀寔榪欎釜寮傚父錛孖OStream搴撶殑璁捐榪欒楄垂浜嗗澶х殑蹇冨姏錛岃屼綘鐨凜PU鍙堜負姝よ楄垂浜嗗灝慶lock銆?/p>
緙虹偣涔嬩簩錛屾槸寮傚父鏈韓鐨勯棶棰樷斺斿嵆浣夸綘鎶撳埌浜嗗紓甯革紝鍙堝綋濡備綍錛熺▼搴忓彲鑳藉凡緇忓畬鍏ㄧ寮浜嗗彂鐢熷紓甯告椂鐨勬墽琛岀幆澧冿紝涔熻浣犺繛寮傚父涓轟粈涔堝彂鐢熼兘鎼炰笉娓呮錛岃皥浣曞鐞嗭紵涔熸棤闈炲氨鏄氱煡鐢ㄦ埛涓澹幫細“鎴戝畬浜嗭紝鍥犱負涓涓紓甯稿彂鐢熷湪XXXXXXXX澶勶紝浣犺鎶ュ憡鐨勮瘽緇欐垜鍙慐mail鍚с?#8221; 鏄晩錛屼綘榪樿兘鍋氫粈涔堝憿錛?/p>
鎴戜滑璇曠潃鐢ㄥ綰﹁鐐規(guī)潵鍒嗘瀽榪欎竴鐘跺喌錛屽鏋滆“鍏堟祴璇曪紝鍐嶄嬌鐢?#8221;鍦ㄤ紶緇熶笂鏄竴涓猧diom錛岄偅涔堝湪contract鎬濇兂閲屼笂鍗囦負涓涓綰︺傚浜嶤++鏉ヨ錛屽簲璇ュ皢“嫻佸浜巊ood鐘舵?#8221;浣滀負涓涓綰︼紝鍦ㄦ瘡涓涓垚鍛樺嚱鏁伴噷榪涜媯鏌ャ傜敋鑷充綘榪樺彲浠ヨ緗竴涓皟璇曟湡鏍囧織錛屼笓闂ㄧ敤鏉ユ牳鏌ョ敤鎴鋒槸鍚︽鏌ヨ繃嫻佺姸鎬併傚湪蹇呰鐨勬搷浣滆繘琛屼箣鍓嶏紝浣犲彲浠ュ厛鐢ㄦ柇璦媯鏌ョ敤鎴鋒槸鍚︽鏌ヨ繃嫻佺姸鎬侊紝婊¤凍浜嗗綰︺傝繖鏍蜂竴鏉ワ紝鍦ㄥ綰︿箣涓嬶紝鐢ㄦ埛灝嗚榪互姝g‘鐨勬柟寮忎嬌鐢ㄧ粍浠訛紝浠庤屽ぇ騫呭害綆鍖栫粍浠跺紑鍙戠殑澶嶆潅搴︺?/p>
鍐嶆潵鑰冭檻寮傚父銆傚鏋滅湡姝e彂鐢熶簡寮傚父錛屽湪Eiffel涓彁渚涗簡retry鏈哄埗銆侭jarne Stroustrup璇磋繃錛宺etry鍙互鍋氬埌錛屼絾鏄線寰娌℃湁鎰忎箟銆備負浠涔堟病鏈夋剰涔夊憿錛熷洜涓篊++涓病鏈夊綰︾殑鎬濇兂錛屽紓甯哥殑浜х敓鍙兘鏍規(guī)湰灝辨槸紼嬪簭鍛樼殑bug銆傚湪榪欑鎯呭喌涓嬶紝鏃犺retry澶氬皯嬈★紝緇撴灉閮芥槸涓鏍風殑緋熴傚彲鏄湪Eiffel閲屾儏褰笉鍚屻傚鏋滃悇鏂歸潰瀵逛簬濂戠害閮藉仛鍒板緢濂界殑閬靛驚錛岄偅涔堢湡姝e彂鐢熷紓甯哥殑鏃跺欙紝鎴戜滑澶у彲浠ユ瘮杈冩湁鎶婃彙鐨勮錛岃繖鍙兘鏄竴涓緢鍋剁劧鐨勪簨浠跺鑷寸殑銆傛瘮濡傝緗戠粶鐜涓嬶紝鍙︿竴涓敤鎴峰湪閭d竴鐬棿紿佺劧瀵規(guī)枃浠跺疄鏂戒簡涓涓搷浣滐紝鎴栬呯‖浠剁殑涓嬈″伓鐒跺紓甯搞傚浜庤繖縐嶆儏鍐碉紝“鍐嶈瘯涓嬈?#8221;鎴愪簡鍚堟儏鍚堢悊鐨勯夋嫨銆傛垜浠緢鍙兘灝嗗紓甯告壖鏉鍦ㄦ憞綃箣涓紝浠庤屼笉緇欎笂灞傛ā鍧楀甫鏉ヤ換浣曞獎鍝嶃?/p>
璋佽濂戠害鎬濇兂涓嶄紵澶у憿錛?/p>
娉細鏈枃杞嚜瀛熷博鐨勫崥瀹?http://blog.csdn.net/myan)
鍋囪浣犵幇鍦ㄦ鍦ㄩ潰璇曪紝涓昏冧笉绱т笉鎱㈠湴緇欏嚭涓嬩竴閬撻鐩細“璇風敤C璇█鍐欎竴涓被浼約trcpy鐨勫嚱鏁般傝鑰冭檻鍙兘鍙戠敓鐨勫紓甯告儏鍐點?#8221; 浣犱細鎬庝箞鍋氬憿錛熷緢鏄庢樉錛屽鏂逛笉鏄湪鑰冨療浣犵殑緙栫▼鑳藉姏錛屽洜涓哄鍒跺瓧絎︿覆瀹炲湪澶鏄撲簡銆傚鏂規(guī)槸鍦ㄨ冨療浣犵殑緙栫▼椋庢牸錛堜範鎯級錛屾垨鑰呰錛岃鐪嬬湅浣犵紪鐮佺殑璐ㄩ噺銆?/p>
涓嬮潰鏄縐嶅彲鑳界殑鍋氭硶錛?/p>
void
string_copy1(char* dest, const char* source)
{
assert(dest != NULL); /* 浣跨敤鏂█ */
assert(source != NULL);
while (*source != ‘\0′) {
*dest = *source;
++dest;
++source;
}
*dest = ‘\0′;
}
void
string_copy2(char* dest, const char* source)
{
if (dest != NULL && source != NULL) { /* 瀵歸敊璇秷鏋侀潤榛?*/
while (*source != ‘\0′) {
*dest = *source;
++dest;
++source;
}
*dest = ‘\0′;
}
}
int
string_copy3(char* dest, const char* source)
{
if (dest != NULL && source != NULL) {
while (*source != ‘\0′) {
*dest = *source;
++dest;
++source;
}
*dest = ‘\0′;
return SUCCESS; /* 榪斿洖琛ㄧず姝g‘鐨勫?*/
}
else {
errno = E_INVALIDARG; /* 璁懼畾閿欒鍙?*/
return FAILED; /* 榪斿洖琛ㄧず閿欒鐨勫?*/
}
}
// C++
void
string_copy4(char* dest, const char* source)
{
if (dest == NULL || source == NULL)
throw Invalid_Argument_Error(); /* 鎶涘嚭寮傚父 */
while (*source != ‘\0′) {
*dest = *source;
++dest;
++source;
}
*dest = ‘\0′;
}
濡傛灉浣犳槸涓昏冿紝涓嶇煡閬撻潰瀵硅繖鏍峰洓浠界瓟鍗鳳紝浣犵殑璇勫垎濡備綍錛熷綋鐒訛紝浣犲彲浠ュ績閲屾彛鐫涓涓?#8220;鏍囧噯絳旀”錛?#8220;欏烘垜鑰呮槍錛岄嗘垜鑰呬骸”銆備絾鏄鏋滀互璁ょ湡鐨勬佸害闈㈠榪欏洓浠界瓟鍗鳳紝鎴戞兂寰堝浜洪兘浼氶毦浠ユ妷鎷┿?/p>
鍥犱負榪欓噷娑夊強鍒頒簡杞歡寮鍙戜腑鐨勪竴涓甫鏈夋湰璐ㄦх殑闅鵑鈥斺旈敊璇鐞嗐?/p>
鍘嗘潵閿欒澶勭悊涓鐩存槸杞歡寮鍙戣呮墍闈復鐨勬渶澶у洶闅句箣涓銆侭jarne Stroustrup鍦ㄨ皥鍒板叾鍘熷洜鏃惰閬擄紝鑳藉鎺㈠療閿欒鐨勪竴鏂逛笉鐭ラ亾濡備綍澶勭悊閿欒錛岀煡閬撳浣曞鐞嗛敊璇殑涓鏂規(guī)病鏈夎兘鍔涙帰瀵熼敊璇紝鑰岀洿鎺ラ噰鐢ㄩ槻寰℃т唬鐮佹潵瑙?鍐籌紝浼氫嬌寰楃▼搴忕殑姝e父緇撴瀯琚墦涔憋紝浠庤屽甫鏉ユ洿澶氱殑閿欒銆傝繖縐嶅洶澧冩槸闈炲父闅句互搴斿鐨勨斺旇垂蹇冭楀姏鑰屾湭蹇呮湁鍥炴姤銆傚洜姝わ紝鏇村鐨勪漢閲囩敤楦甸笩鎴樻湳錛屽鍙兘鍙戠敓鐨勯敊 璇鑰屼笉瑙侊紝浠誨叾鑷劧銆?/p>
C++銆丣ava鍜屽叾浠栬璦瀵歸敊璇鐞嗛棶棰樼殑鍥炵瓟鏄紓甯告満鍒躲傝繖縐嶆満鍒跺湪姝e父鐨勭▼搴忔墽琛屾祦涔嬪寮杈熶簡涓撻棬鐨勪俊閬擄紝涓撻棬鐢ㄦ潵鍦ㄤ笉鍚岀▼搴忔ā鍧椾箣闂存姤鍛婇敊璇紝瑙?鍐充笂榪伴敊璇帰瀵熶笌澶勭悊絳栫暐鍒嗘暎鐨勭煕鐩俱傜劧鑰岋紝鏈変簡寮傚父澶勭悊鏈哄埗鍚庯紝寮鍙戣呭紑濮嬫湁涓縐嶅懼悜錛屽氨鏄嬌鐢ㄥ紓甯告潵澶勭悊鎵鏈夌殑閿欒銆傛垜鏇劇粡灝辮繖涓棶棰樺湪 comp.lang.c++.moderated涓婂睍寮璁ㄨ錛岀粨鏋滄槸鍙戠幇鏈夌浉褰撳鐨勪漢錛屽寘鎷珺oost寮鍙戠粍閲岀殑寰堝涓撳錛岄兘璁や負寮傚父鏄敊璇鐞嗙殑閫氱敤瑙?鍐蟲柟妗堛?/p>
瀵規(guī)鎴戜笉鑳借禐鍚屻傚茍涓旀垜璁や負婊ョ敤寮傚父姣斾笉鐢ㄥ紓甯哥殑鍗卞鏇村ぇ銆?/p>
The Pragmatic Programmer鏄竴鏈湪鍥藉紼嬪簭鍛樹腑闂撮涓烘祦琛岀殑涔︼紝鍏朵腑鍦ㄨ鍒伴敊璇鐞嗘椂錛屾湁涓鍙ョ璦錛?br>“鍙湪鐪熸寮傚父鐨勭姸鍐典笅浣跨敤寮傚父銆?#8221;
涔︿腑涓句簡涓涓緥瀛愶紝濡傛灉浣犻渶瑕佸綋鍓嶇洰褰曚笅鐨勪竴涓悕鍙?#8220;app.dat”鐨勬枃浠訛紝鑰岃繖涓枃浠朵笉瀛樺湪錛岄偅涔堣繖涓嶅彨寮傚父鐘跺喌錛岃繖鏄綘搴旇棰勬枡鍒扮殑銆佸茍涓旀樉寮忓鐞?鐨勬儏鍐點傝屽鏋滀綘瑕佸埌Windows鐩綍涓嬪鎵緐ser.dat鏂囦歡錛屽嵈娌℃壘鍒幫紝閭f墠鍙仛寮傚父鐘跺喌鈥斺斿洜涓烘瘡涓涓甯歌繍琛岀殑Windows緋葷粺閮藉簲璇ユ湁榪?涓枃浠躲?/p>
鎴戦潪甯歌禐鎴愪功涓殑閭e彞蹇犲憡錛屽彲鏄┒绔熶粈涔堟槸“鐪熸寮傚父”鐨勭姸鍐碉紵涔︿腑鐨勮繖涓緥瀛愭樉鐒跺彧鏄竴涓鍏鋒劅鎬х殑銆佸瘬璦浼肩殑鏁呬簨錛屽叿鏈夋墍鏈夊瘬璦鐨勫叡鍚岀壒鐐光斺旇璧鋒潵瑙夊緱璞佺劧寮鏈楋紝鏀惰幏寰堝ぇ錛屽疄闄呬笂甯笉浜嗕綘浠涔堝繖銆傝繖縐嶄緥瀛愬浜庢垜浠殑瀹為檯寮鍙戯紝浠嶇劧鎻愪緵涓嶄簡鐪熸鐨勫府鍔┿?/p>
絀剁珶搴旇濡備綍鐪嬪緟閿欒錛熸庢牱鎵嶈兘鏈濂藉湴閿欒澶勭悊錛?/p>
璇村疄璇濓紝鍦ㄨ繖涓や釜闂涓婏紝鎴戜滑鎵瑙佸埌鐨勫ぇ閮ㄥ垎璇█閮芥病鏈夌粰鍑哄緢濂界殑鍥炵瓟銆侰縐夋壙涓璐鏍鹼紝鎶婃墍鏈夌殑涓滆タ鎺ㄧ粰寮鍙戣呰冭檻錛汚da鍙戞槑浜嗗紓甯革紝浣嗘槸鍙堜負寮傚父鎵 绱紙鐭ラ亾闃塊噷浜氱撼5鐏鐨勫濂寵埅涓轟粈涔堝け璐ュ悧錛燂級錛汣++浼佸浘灝咥da鐨勫紓甯告満鍒惰瀺鍚堣繘鑷繁鐨勪綋緋諱腑錛岀粨鏋滃紓甯告垚浜咰++涓渶闅句互澶勭悊鐨勪笢瑗匡紱Java鍜?C#鏄劇劧閮芥病鏈夎愬績閲嶆柊鑰冭檻閿欒澶勭悊榪欐々浜嬶紝鑰屽彧鏄畝鍗曠殑灝咰++鐨勫紓甯告満鍒跺畬鍠勫寲浜嗕簨銆?/p>
涓庝笂榪拌繖浜涜璦涓嶅悓錛孍iffel浠庝竴寮濮嬪氨鎶婇敊璇鐞嗘斁鍦ㄦ牳蹇冪殑浣嶇疆涓婁簣浠ヨ冭檻錛屽茍浠?#8220;濂戠害”鎬濇兂涓烘牳蹇冿紝寤虹珛浜嗘暣涓殑閿欒澶勭悊鎬濇兂浣撶郴銆傚湪鎴戜簡瑙g殑璇?璦閲岋紝Eiffel鏄榪欎釜闂鎬濊冩渶涓烘繁鍒諱竴涓紝鍥犳錛孍iffel鍘嗘潵浜湁“楂樿川閲忕郴緇熷紑鍙戣璦”鐨勫0瑾夈傦紙浜嬪疄涓婏紝Bertrand Meyer寰堜笉鍠滄鍒漢縐癊iffel涓?#8220;緙栫▼璇█”錛屼粬鍙嶅寮鴻皟錛孍iffel鏄竴涓猄oftware Development Framework銆備笉榪囨湰鏂囧彧娑夊強璇█鐗規(guī)э紝鎵浠ュ涓旂ОEiffel璇█銆傦級
Eiffel鎶婅蔣浠墮敊璇駭鐢熺殑鏈川褰掔粨涓?#8220;濂戠害”鐨勭牬鍧忋侲iffel璁や負錛屼竴涓蔣浠惰兘澶熸甯歌繍浣滐紝姝g‘瀹屾垚浠誨姟錛屾槸闇瑕佷竴緋誨垪鏉′歡鐨勩傝繖浜涙潯浠跺寘鎷瑙?榪愯鐜鑹ソ錛屾搷浣滆呮搷浣滄紜紝杞歡鍐呴儴鍔熻兘姝g‘絳夌瓑銆傚洜姝わ紝杞歡鐨勬紜繍琛岋紝鏄幆澧冦佹搷浣滆呬笌杞歡鏈韓涓夋柟闈㈠悎浣滅殑緇撴灉銆傜浉搴旂殑錛岀郴緇熺殑閿欒錛屼篃鏄敱浜?涓夎呬腑鏈変竴鏂規(guī)病鏈夋紜飽琛岃嚜宸辯殑鑱岃矗鑰屽鑷寸殑銆傜粏鍖栧埌杞歡鍐呴儴錛屾瘡涓蔣浠墮兘鏄敱鑻ュ共涓嶅悓鐨勬ā鍧楃粍鎴愮殑錛岃蔣浠剁殑閿欒錛屾槸鐢變簬鏌愪簺妯″潡娌℃湁姝g‘灞ヨ鑷繁鐨勮亴 璐c傝褰誨簳鏉滅粷杞歡閿欒錛屽彧鏈夊垎娓呭悇鑷ā鍧楃殑璐d換錛屽茍涓斿緩绔嬫満鍒訛紝鏁︿績鍚勬ā鍧楁紜飽琛岃嚜宸辯殑璐d換錛岀劧鍚庢墠鏈夊彲鑳藉仛鍒癇ug-free銆傦紙閴翠簬緋葷粺涓敊緇煎 鏉傜殑鍏崇郴錛屼互鍙婂紑鍙戣呰璇嗚兘鍔涚殑灞闄愶紝鎴戣涓虹湡姝f棤閿欒鐨勭郴緇熸槸涓嶅彲鑳界殑銆備絾鏄綋鍓嶄竴鑸蔣浠剁郴緇熶腑鐨勮川閲忛棶棰樿繙榪滄瘮搴旀湁鐨勪弗閲嶃傦級
濡備綍淇濊瘉鍚勬柟鎭畧鑱岃矗鍛紵Eiffel寮曞叆浜嗗綰︼紙Contract錛夎繖涓蹇點傝繖閲岀殑濂戠害涓庢垜浠氬父鎵璇寸殑鍟嗕笟濂戠害寰堢浉浼鹼紝鏈変互涓嬪嚑涓壒鐐癸細
1. 濂戠害鍏崇郴鐨勫弻鏂規(guī)槸騫崇瓑鐨勶紝瀵規(guī)暣涓猙ussiness鐨勯『鍒╄繘琛岃礋鏈夊叡鍚岃矗浠伙紝娌℃湁鍝竴鏂瑰彲浠ュ彧浜湁鏉冨埄鑰屼笉鎵挎媴涔夊姟銆?br>2. 濂戠害鍏崇郴緇忓父鏄浉浜掔殑錛屾潈鍒╁拰涔夊姟涔嬮棿寰寰鏄簰鐩告崋緇戝湪涓璧風殑錛?br>3. 鎵ц濂戠害鐨勪箟鍔″湪鎴戯紝鑰屾牳鏌ュ綰︾殑鏉冨姏鍦ㄤ漢錛?br>4. 鎴戠殑涔夊姟淇濋殰鐨勬槸浣犵殑鍒╃泭錛岃屼綘鐨勪箟鍔′繚闅滅殑鏄垜鐨勫埄鐩婏紱
灝嗗綰﹀叧緋誨紩鍏ュ埌杞歡寮鍙戦鍩燂紝灝ゅ叾鏄潰鍚戝璞¢鍩熶箣鍚庯紝鍦ㄨ蹇典笂緇欐垜浠甫鏉ヤ簡鍑犲ぇ鍐插嚮錛?/p>
1. 涓鑸殑瑙傜偣錛屽湪杞歡浣撶郴涓紝紼嬪簭搴撳拰緇勪歡搴撹綾繪瘮涓簊erver錛岃屼嬌鐢ㄧ▼搴忓簱銆佺粍浠跺簱鐨勭▼搴忚瑙嗕負client銆傛牴鎹繖縐岰/S鍏崇郴錛屾垜浠線寰瀵瑰簱紼嬪簭 鍜岀粍浠剁殑璐ㄩ噺鎻愬嚭寰堜弗鑻涚殑瑕佹眰錛屽己榪畠浠壙鎷呮湰涓嶅簲璇ョ敱瀹冧滑鏉ユ壙鎷呯殑璐d換錛岃岃繃鍒嗙旱瀹筩lient涓鏂癸紝鐢氳嚦瑕佹眰搴撶▼搴忓幓澶勭悊鏄庢樉鐢變簬client閿欒閫?鎴愮殑鍥板銆傚瑙備笂瀵艱嚧紼嬪簭搴撳拰緇勪歡搴撶殑璁捐鍜岀紪鍐欏紓甯稿洶闅撅紝鑰屼笖璐ㄩ噺闅愭?zhèn)e弽鑰屾洿澶氾紱鍚屾椂client涓鏂逛唬鐮佸ぇ澶氭澗鏁i殢鎰忥紝璐ㄩ噺浣庡姡銆傝繖縐嶆儏褰紝灝卞ソ鍍忓湪 涓涓潈璐d笉娓呯殑浼佷笟閲岋紝蹇呯劧浼氬吇涓鎵瑰案浣嶇礌槨愮殑娣鋒販錛岃嫤涓鎵逛換鍔充換鎬紝涓嶈寰楀け鐨勮侀粍鐗涖傚紩鍏ュ綰﹁蹇典箣鍚庯紝榪欑C/S鍏崇郴琚墦鐮達紝澶у閮芥槸騫崇瓑鐨勶紝浣犻渶 瑕佹垜姝g‘鎻愪緵鏈嶅姟錛岄偅涔堜綘蹇呴』婊¤凍鎴戞彁鍑虹殑鏉′歡錛屽惁鍒欐垜娌℃湁涔夊姟“鎺掗櫎涓囬毦”鍦頒繚璇佸畬鎴愪換鍔°?/p>
2. 涓鑸涓哄湪妯″潡涓鏌ラ敊璇姸鍐靛茍涓斾笂鎶ワ紝鏄ā鍧楁湰韜殑涔夊姟銆傝屽湪濂戠害浣撳埗涓嬶紝瀵逛簬濂戠害鐨勬鏌ュ茍闈炰箟鍔★紝瀹為檯涓婃槸鍦ㄥ飽琛屾潈鍒┿備竴涓箟鍔★紝涓涓潈鍒╋紝宸埆鏋佸ぇ銆備緥濡備笂闈㈢殑浠g爜錛?br>if (dest == NULL) { … }
榪欏氨鏄箟鍔★紝鍏惰鐐瑰湪浜庯紝涓鏃︽潯浠朵笉婊¤凍錛屾垜鏂癸紙涔夊姟鏂癸級蹇呴』璐熻矗浠ュ悎閫傛墜娉曞鐞嗚繖灝村艾灞闈紝鎴栬呰繑鍥為敊璇鹼紝鎴栬呮姏鍑哄紓甯搞傝岋細
assert(dest != NULL);
榪欐槸媯鏌ュ綰︼紝灞ヨ鏉冨埄銆傚鏋滄潯浠朵笉婊¤凍錛岄偅涔堥敊璇湪瀵規(guī)柟鑰屼笉鍦ㄦ垜錛屾垜鍙互绔嬪埢“鎾曟瘉鍚堝悓”錛岀艦宸ヤ簡浜嬶紝鏃犻渶鍋氫換浣曞浣欏姩浣溿傝繖鏃犵枒鍙互澶уぇ綆鍖栫▼搴忓簱鍜岀粍浠跺簱鐨勫紑鍙戙?/p>
3. 濂戠害鎵鏍告煡鐨勶紝鏄?#8220;涓轟繚璇佹紜ф墍蹇呴』婊¤凍鐨勬潯浠?#8221;錛屽洜姝わ紝褰撳綰﹁鐮村潖鏃訛紝鍙〃鏄庝竴浠朵簨錛氳蔣浠剁郴緇熶腑鏈塨ug銆傚叾鎰忎箟鏄錛屾煇浜涙潯浠跺湪鍒拌揪鎴戣繖閲屾椂錛屽繀 欏誨凡緇忕‘淇濅負“鐪?#8221;銆傝皝鏉ョ‘淇濓紵搴旇鏄郴緇熶腑鐨勫叾浠栨ā鍧楀湪鍏堟湡紜繚銆傚鏋滃湪鎴戣繖閲屽彂鐜板綰︽病鏈夎閬靛畧錛岄偅涔堣〃鏄庣郴緇熶腑鍏朵粬妯″潡娌℃湁姝g‘灞ヨ鑷繁鐨勪箟鍔°傚氨 鎷夸笂闈㈡彁鍒扮殑“鎵撳紑鏂囦歡”鐨勪緥瀛愭潵璇達紝濡傛灉鏈変竴涓ā鍧楅渶瑕佷竴涓狥ILE*錛岃屽湪濂戠害媯鏌ヤ腑鍙戠幇璇ユ寚閽堜負NULL錛屽垯鎰忓懗鐫鏈変竴涓ā鍧楁病鏈夊飽琛屽叾涔夊姟錛屽嵆 “媯鏌ユ枃浠舵槸鍚﹀瓨鍦紝紜繚鏂囦歡浠ユ紜ā寮忔墦寮錛屽茍涓斾繚璇佹寚閽堢殑姝g‘鎬?#8221;銆傚洜姝わ紝褰撳綰︽鏌ュけ璐ユ椂錛屾垜浠鍏堣鐭ラ亾榪欐剰鍛崇潃紼嬪簭鍛橀敊璇紝鑰屼笖瑕佸仛鐨勪笉鏄籂姝?濂戠害鏍告煡鏂癸紝鑰屾槸綰犳濂戠害鎻愪緵鏂廣傛崲鍙ヨ瘽璇達紝褰撲綘鍙戠幇:
assert(dest != NULL);
鎶ラ敊鏃訛紝浣犺鍋氱殑涓嶆槸鍘諱慨鏀逛綘鐨剆tring_copy鍑芥暟錛岃屾槸瑕佽浠諱綍浠g爜鍦ㄨ皟鐢╯tring_copy鏃剁‘淇漝est鎸囬拡涓嶄負絀恒?/p>
4. 鎴戜滑浠ュ線瀵瑰緟“榪囩▼”鎴?#8220;鍑芥暟”鐨勭悊瑙f槸錛氬畬鎴愭煇涓綆椾換鍔$殑榪囩▼錛岃繖涓鐪嬫硶鍙己璋冧簡鍏剁洰鏍囷紝娌℃湁寮鴻皟鍏舵潯浠躲傚湪榪欑鐞嗚В涓嬶紝鎴戜滑瀵逛簬exception 鐨勭悊瑙i潪甯告ā緋婂拰瀹芥硾錛氬彧瑕佹槸鏃犳硶瀹屾垚榪欎釜璁$畻榪囩▼錛屽潎鍙瑙嗕負寮傚父錛屼篃涓嶇鏄垜鑷繁鐨勫師鍥狅紝榪樻槸鍏朵粬浜虹殑鍘熷洜錛堝吀鍨嬬殑鏉冭矗涓嶆竻錛夈傛鏄洜涓鴻繖縐嶆ā緋婂拰瀹?娉涳紝“絀剁珶浠涔堟椂鍊欏簲璇ユ姏鍑哄紓甯?#8221;鎴愪負娌℃湁浜鴻兘鍥炵瓟鐨勯棶棰樸傝屽紩鍏ュ綰︿箣鍚庯紝“榪囩▼”鍜?#8220;鍑芥暟”琚畾涔変負錛氬畬鎴愬綰︾殑榪囩▼銆傚熀浜庡綰︾殑鐩鎬簰鎬э紝濡傛灉榪欎釜濂?綰︾殑澶辮觸鏄洜涓哄叾浠栨ā鍧楁湭鑳藉飽琛屽綰︼紝鏈繃紼嬪彧闇鎶ュ憡錛屾棤闇浠ヤ換浣曞叾浠栨柟寮忓仛鍑哄弽搴斻傝岀湡姝g殑寮傚父鐘跺喌鏄?#8220;瀵規(guī)柟瀹屽叏婊¤凍浜嗗綰︼紝鑰屾垜渚濈劧鏈兘濡傜害瀹屾垚浠?鍔?#8221;鐨勬儏褰€傝繖鏍蜂互鏉ワ紝鎴戜滑灝辯粰“寮傚父”涓嬩簡涓涓竻鏅般佸彲琛岀殑瀹氫箟銆?/p>
5. 涓鑸潵璇達紝鍦ㄩ潰鍚戝璞℃妧鏈腑錛屾垜浠涓?#8220;鎺ュ彛”鏄敮涓閲嶈鐨勪笢瑗匡紝鎺ュ彛瀹氫箟浜嗙粍浠訛紝鎺ュ彛紜畾浜嗙郴緇燂紝鎺ュ彛鏄潰鍚戝璞′腑鎴戜滑鍞竴闇瑕佸叧蹇冪殑涓滆タ錛屾帴鍙d笉浠呮槸 蹇呰鐨勶紝鑰屼笖鏄厖鍒嗙殑銆傜劧鑰岋紝濂戠害瑙傚康鎻愰啋鎴戜滑錛屼粎浠呮湁鎺ュ彛榪樹笉鍏呭垎錛屼粎浠呴氳繃鎺ュ彛榪樹笉瓚充互浼犺揪瓚沖鐨勪俊鎭紝涓轟簡姝g‘浣跨敤鎺ュ彛錛屽繀欏昏冭檻濂戠害銆傚彧鏈夎冭檻濂?綰︼紝鎵嶅彲鑳藉疄鐜伴潰鍚戝璞$殑鐩爣錛氬彲闈犳с佸彲鎵╁睍鎬у拰鍙鐢ㄦс傚弽榪囨潵錛?#8220;娌℃湁濂戠害鐨勫鐢ㄦ牴鏈氨鏄瀻鑳¢椆銆傦紙Bertrand Meyer璇級”銆?/p>
鐢變笂榪拌鐐瑰彲浠ョ湅鍑猴紝铏界劧Eiffel鎵鍊″鐨凞esign By Contract鍦ㄨ〃璞′笂涓嶈繃鏄郴緇熷寲鐨勬柇璦錛坅ssertion錛夋満鍒訛紝鐒惰屽湪鑳屽悗錛岀‘瀹炴槸瀹屽叏鐨勬濇兂闈╂柊銆傛濡侷var Jacoboson璁垮崕鏃跺銆婄▼搴忓憳銆嬫潅蹇楁墍璇達細“鎴戣涓築ertrand Meyer鐨勬柟鍚戔斺擠esign by Contract鈥斺旀槸姝g‘鐨勬柟鍚戯紝鎴戜滑閮戒細娌跨潃浠栫殑瓚寵抗鍓嶈繘銆傛垜鐩鎬俊錛屽ぇ鍨嬪巶鍟嗭紙寰蔣銆両BM錛屽綋鐒惰繕鏈塕ational錛夐兘涓嶄細瀵笲ertrand Meyer鐨勬垚灝卞潗瑙嗕笉鐞嗐傛墍鏈夎繖浜涘巶鍟嗛兘浼氬湪榪欎釜鏂瑰悜涓婃湁鎵琛屽姩銆?#8221;
@echo off
setlocal
set REPOS=%1
set TXN=%2
rem check that logmessage contains at least 5 characters
svnlook log "%REPOS%" -t "%TXN%" | findstr ".........." > nul
if %errorlevel% gtr 0 goto err
exit 0
:err
echo Empty log message not allowed. Commit aborted! 1>&2
exit 1
REM SVN pre-revprop-change hook allows edit of logmessages from TSVN
setlocal
set REPOS=%1
set REV=%2
set USER=%3
set PROPNAME=%4
set ACTION=%5
if not "%ACTION%"=="M" goto refuse
if not "%PROPNAME%"=="svn:log" goto refuse
goto OK
:refuse
echo Cann't set %PROPNAME%/%ACTION%, only svn:log is allowed 1>&2
endlocal
exit 1
:OK
endlocal
exit 0
VC寮鍙戠幆澧冧箣鎵浠ユ彁渚涜繙紼嬭皟璇曠殑鑳藉姏錛屾槸鍥犱負鏈変簺鎯呭喌涓嬪崟鏈鴻皟璇曚細璁╀綘宕╂簝鎺夈傘傘傛瘮濡傦紝璋冭瘯GUI紼嬪簭鐨刉M_PAINT娑堟伅錛屽洜涓鴻鍗曟璋冭瘯錛屾墍浠ヨ皟璇曞櫒浼氬鐣岄潰鐨勯噸緇樹駭鐢熷壇浣滅敤錛圚eisenberg涓嶇‘瀹氭у師鐞嗭級銆傚綋鐒惰繕鏈変簺鍒殑鎯呭喌涔熼傜敤錛屾瘮濡傜▼搴忓湪嫻嬭瘯鐜榪愯鐨勫ソ濂界殑錛屼絾鏄湪瀹㈡埛閭h涓烘繪槸寮傚父錛岃繖鏃跺欏鏋滃彲浠CP榪滅▼榪炴帴涓婂幓緇存姢鐨勮瘽錛屽氨鑳介氳繃榪滅▼璋冭瘯鐨勭壒鎬у湪鍑虹幇鐘跺喌鐨勭郴緇熺幆澧冧腑鎺掗敊~
涓嬮潰鏉ヨ涓涓嬪叿浣撶殑鍋氭硶銆傚厛鏄庣‘涓嬫蹇碉紝榪滅▼璋冭瘯鍢涳紝鑷劧鏄袱涓満鍣ㄤ箣闂磋皟璇曘傜▼搴忚繍琛屽湪鐩爣鏈哄櫒涓婏紝璋冭瘯鍣ㄨ繍琛屽湪鏈満銆傚綋鐒訛紝鐩爣鏈哄櫒涓婅繕鏄鏈夊皯璁歌緟鍔╃▼搴忔墠鑳借窡鏈満鐨勮皟璇曞櫒connect涓婏紝浠ヤ究閫氳銆備竴鑸潵璇達紝鍙渶瑕乧opy鍥涗釜鏂囦歡鍒扮洰鏍囨満鍣ㄤ笂灝辮浜嗭細MSVCMON.EXE銆丏M.DLL銆乀LN0T.DLL鍜孧SDIS110.DLL銆傝繖鍥涗釜鏂囦歡閮借兘鍦╒C6鐩綍鐨凜ommon\MSDEV98\Bin鐩綍涓嬮潰鎵懼埌銆俢opy榪囧幓涔嬪悗錛岃繍琛宮svcom.exe錛岀湅涓嬪浘鐗噡
鏈変釜Settings鐨勬寜閽紝涓嶇敤綆°傜洿鎺ョ偣Connect灝辮浜唦
鎺ョ潃鐪嬬湅鏈満榪欒竟璋冭瘯鍣ㄧ殑璁劇疆銆傞鍏堣緗ソ榪滅▼璋冭瘯寮鍏籌紝鍦˙uild鑿滃崟涓嬫湁涓狣ebuger Remote Connecting鐨勫瓙鑿滃崟錛岀偣涔嬨傚嚭鐜頒釜紿楀彛錛岄粯璁ゆ槸鍦↙ocal欏癸紝鎴戜滑瑕侀夌殑鏄疦etwork(TCP/IP)錛岀劧鍚庣偣璁懼畾銆備細寮瑰嚭涓涓璇濇錛岃緭鍏ョ洰鏍囨満鍣ㄧ殑ip鎴栬呮満鍣ㄥ悕錛屾渶鍚庣偣OK灝辮浜嗐?/p>
鎺ヤ笅鏉ユ妸宸ョ▼鎵撳紑錛岃緗渶鍚庝竴姝ャ傚亣璁劇敓鎴愮殑鍙墽琛岀▼搴忓悕涓篟emoteDebug.exe錛屽湪鐩爣鏈哄櫒涓婄殑璺緞涓篸:\Prj\Remote.exe錛岄偅涔堬紝鍦ㄦ湰鏈虹殑Project Settings閲岄潰錛岄夋嫨Debug欏甸潰鐨凴emote executable path and file name涓嬮潰鐨勭紪杈戞涓緭鍏ョ洰鏍囨満鍣ㄤ腑紼嬪簭鐨勮礬寰勶細d:\Prj\RemoteDebug.exe銆傛敞鎰忥紝榪欓噷鍐欑殑鏄粠鐩爣鏈哄櫒鐨勮搴︽墍鐪嬪埌鐨勮礬寰勩?/p>
鐒跺悗緙栬瘧涓涓嬬▼搴忥紝鎶婃柊緙栬瘧鍑烘潵鐨凴emoteDebug.exe澶嶅埗鍒扮洰鏍囨満鍣ㄧ殑d:\Prj涓嬮潰錛屽氨鍙互鍦ㄦ湰鏈哄儚騫沖父涓鏍瘋皟璇曚簡銆?/p>
#define _CRTDBG_MAP_ALLOC #include<stdlib.h> #include<crtdbg.h> #include "debug_new.h"
銆銆MSDN 濡傛槸璇達細“蹇呴』淇濊瘉涓婇潰澹版槑鐨勯『搴忥紝濡傛灉鏀瑰彉浜嗛『搴忥紝鍙兘涓嶈兘姝e父宸ヤ綔銆?#8221;鑷充簬榪欐槸涓轟粈涔堬紝鎴戜滑涓嶅緱鑰岀煡銆侻S 鐨勮佸ぇ浠粡甯歌繖鏍鋒晠寮勭巹铏氥?br>閽堝闈?MFC 紼嬪簭錛屽啀鍔犱笂鍛ㄦ槦鏄熺殑澶存枃浠訛細debug_new.h錛屽綋鐒跺鏋滀笉鍔犺繖涓鍙ワ紝涔熻兘媯嫻嬪嚭鍐呭瓨娉勬紡錛屼絾鏄綘鏃犳硶紜畾鍦ㄥ摢涓簮紼嬪簭鏂囦歡涓彂鐢熸硠婕忋侽utput 杈撳嚭鍙憡璇変綘鍦?crtsdb.h 涓殑鏌愪釜鍦版柟鏈夊唴瀛樻硠婕忋傛垜嫻嬭瘯鏃?REG_DEBUG_NEW 娌℃湁璧蜂綔鐢ㄣ傚姞涓嶅姞榪欎釜瀹忛兘鍙互媯嫻嬪嚭鍙戠敓鍐呭瓨鍒嗛厤娉勬紡鐨勬枃浠躲?br>鍏舵錛屼竴鏃︽坊鍔犱簡涓婇潰鐨勫0鏄庯紝浣犲氨鍙互閫氳繃鍦ㄧ▼搴忎腑鍔犲叆涓嬮潰鐨勪唬鐮佹潵鎶ュ憡鍐呭瓨娉勬紡淇℃伅浜嗭細
_CrtDumpMemoryLeaks();銆銆榪欏氨榪欎箞綆鍗曘傛垜鍦ㄥ懆鏄熸槦鐨勪緥瀛愪唬鐮佷腑鍔犲叆榪欎簺鏈哄叧鍚庯紝鍦?VC++ 璋冭瘯浼氳瘽錛堟寜 F5 璋冭瘯榪愯錛?Output 紿楀彛鐨?Debug 欏典究鐪嬪埌浜嗛鏈熺殑鍐呭瓨娉勬紡 dump銆傝 dump 褰㈠紡濡備笅錛?/font>
Detected memory leaks! Dumping objects -> c:\Program Files\...\include\crtdbg.h(552) : {45} normal block at 0x00441BA0, 2 bytes long. Data: <AB> 41 42 c:\Program Files\...\include\crtdbg.h(552) : {44} normal block at 0x00441BD0, 33 bytes long. Data: < C > 00 43 00 CD CD CD CD CD CD CD CD CD CD CD CD CD c:\Program Files\...\include\crtdbg.h(552) : {43} normal block at 0x00441C20, 40 bytes long. Data: < C > E8 01 43 00 16 00 00 00 00 00 00 00 00 00 00 00 Object dump complete.
鏇村叿浣撶殑緇嗚妭璇峰弬鑰冩湰鏂囬檮甯︾殑婧愪唬鐮佹枃浠躲?br>
涓嬮潰鏄垜鐪嬭繃 MSDN 璧勬枡鍚庯紝閽堝“濡備綍浣跨敤 CRT 璋冭瘯鍔熻兘鏉ユ嫻嬪唴瀛樻硠婕忥紵”鐨勯棶棰樿繘琛屼簡涓鐣紪璇戝拰鏁寸悊錛屽笇鏈涘澶у鏈夌敤銆傚鏋滀綘鐨勮嫳鏂囧緢媯掞紝閭e氨涓嶇敤寰涓嬬湅浜嗭紝寤鴻鐩存帴鍘昏 MSDN 搴撲腑鐨勬妧鏈師鏂囥?br>C/C++ 緙栫▼璇█鐨勬渶寮哄ぇ鍔熻兘涔嬩竴渚挎槸鍏跺姩鎬佸垎閰嶅拰閲婃斁鍐呭瓨錛屼絾鏄腑鍥芥湁鍙ュ彜璇濓細“鏈澶х殑闀垮涔熷彲鑳芥垚涓烘渶澶х殑寮辯偣”錛岄偅涔?C/C++ 搴旂敤紼嬪簭姝eソ鍗拌瘉浜嗚繖鍙ヨ瘽銆傚湪 C/C++ 搴旂敤紼嬪簭寮鍙戣繃紼嬩腑錛屽姩鎬佸垎閰嶇殑鍐呭瓨澶勭悊涓嶅綋鏄渶甯歌鐨勯棶棰樸傚叾涓紝鏈闅炬崏鎽鎬篃鏈闅炬嫻嬬殑閿欒涔嬩竴灝辨槸鍐呭瓨娉勬紡錛屽嵆鏈兘姝g‘閲婃斁浠ュ墠鍒嗛厤鐨勫唴瀛樼殑閿欒銆傚伓灝斿彂鐢熺殑灝戦噺鍐呭瓨娉勬紡鍙兘涓嶄細寮曡搗鎴戜滑鐨勬敞鎰忥紝浣嗘硠婕忓ぇ閲忓唴瀛樼殑紼嬪簭鎴栨硠婕忔棩鐩婂澶氱殑紼嬪簭鍙兘浼氳〃鐜板嚭鍚勭 鍚勬牱鐨勫緛鍏嗭細浠庢ц兘涓嶈壇錛堝茍涓旈愭笎闄嶄綆錛夊埌鍐呭瓨瀹屽叏鑰楀敖銆傛洿緋熺殑鏄紝娉勬紡鐨勭▼搴忓彲鑳戒細鐢ㄦ帀澶鍐呭瓨錛屽鑷村彟澶栦竴涓▼搴忓灝鎺夛紝鑰屼嬌鐢ㄦ埛鏃犱粠鏌ユ壘闂鐨勭湡姝f牴婧愩傛澶栵紝鍗充嬌鏃犲鐨勫唴瀛樻硠婕忎篃鍙兘孌冨強姹犻奔銆?br>騫歌繍鐨勬槸錛孷isual Studio 璋冭瘯鍣ㄥ拰 C 榪愯鏃?(CRT) 搴撲負鎴戜滑鎻愪緵浜嗘嫻嬪拰璇嗗埆鍐呭瓨娉勬紡鐨勬湁鏁堟柟娉曘備笅闈㈣鍜屾垜涓璧峰垎浜敹鑾封斺斿浣曚嬌鐢?CRT 璋冭瘯鍔熻兘鏉ユ嫻嬪唴瀛樻硠婕忥紵
濡備綍鍚敤鍐呭瓨娉勬紡媯嫻嬫満鍒?/font>錛?/font>
銆銆VC++ IDE 鐨勯粯璁ょ姸鎬佹槸娌℃湁鍚敤鍐呭瓨娉勬紡媯嫻嬫満鍒剁殑錛屼篃灝辨槸璇村嵆浣挎煇孌典唬鐮佹湁鍐呭瓨娉勬紡錛岃皟璇曚細璇濈殑 Output 紿楀彛鐨?Debug 欏典笉浼氳緭鍑烘湁鍏沖唴瀛樻硠婕忎俊鎭備綘蹇呴』璁懼畾涓や釜鏈鍩烘湰鐨勬満鍏蟲潵鍚敤鍐呭瓨娉勬紡媯嫻嬫満鍒躲?br>
涓鏄嬌鐢ㄨ皟璇曞爢鍑芥暟錛?/font>
#define _CRTDBG_MAP_ALLOC #include<stdlib.h> #include<crtdbg.h>
娉ㄦ剰錛?include 璇彞鐨勯『搴忋傚鏋滄洿鏀規(guī)欏哄簭錛屾墍浣跨敤鐨勫嚱鏁板彲鑳芥棤娉曟紜伐浣溿?br>
閫氳繃鍖呭惈 crtdbg.h 澶存枃浠訛紝鍙互灝?malloc 鍜?free 鍑芥暟鏄犲皠鍒板叾“璋冭瘯”鐗堟湰 _malloc_dbg 鍜?_free_dbg錛岃繖浜涘嚱鏁頒細璺熻釜鍐呭瓨鍒嗛厤鍜岄噴鏀俱傛鏄犲皠鍙湪璋冭瘯錛圖ebug錛夌増鏈紙涔熷氨鏄瀹氫箟 _DEBUG錛変腑鏈夋晥銆傚彂琛岀増鏈紙Release錛変嬌鐢ㄦ櫘閫氱殑 malloc 鍜?free 鍑芥暟銆?br>#define 璇彞灝?CRT 鍫嗗嚱鏁扮殑鍩虹鐗堟湰鏄犲皠鍒板搴旂殑“璋冭瘯”鐗堟湰銆傝璇彞涓嶆槸蹇呴』鐨勶紝浣嗗鏋滄病鏈夎璇彞錛岄偅涔堟湁鍏沖唴瀛樻硠婕忕殑淇℃伅浼氫笉鍏ㄣ?br>
浜屾槸鍦ㄩ渶瑕佹嫻嬪唴瀛樻硠婕忕殑鍦版柟娣誨姞涓嬮潰榪欐潯璇彞鏉ヨ緭鍑哄唴瀛樻硠婕忎俊鎭細
_CrtDumpMemoryLeaks();銆銆褰撳湪璋冭瘯鍣ㄤ笅榪愯紼嬪簭鏃訛紝_CrtDumpMemoryLeaks 灝嗗湪 Output 紿楀彛鐨?Debug 欏典腑鏄劇ず鍐呭瓨娉勬紡淇℃伅銆傛瘮濡傦細
Detected memory leaks! Dumping objects -> C:\Temp\memleak\memleak.cpp(15) : {45} normal block at 0x00441BA0, 2 bytes long. Data: <AB> 41 42 c:\program files\microsoft visual studio\vc98\include\crtdbg.h(552) : {44} normal block at 0x00441BD0, 33 bytes long. Data: < C > 00 43 00 CD CD CD CD CD CD CD CD CD CD CD CD CD c:\program files\microsoft visual studio\vc98\include\crtdbg.h(552) : {43} normal block at 0x00441C20, 40 bytes long. Data: < C > 08 02 43 00 16 00 00 00 00 00 00 00 00 00 00 00 Object dump complete.
濡傛灉涓嶄嬌鐢?#define _CRTDBG_MAP_ALLOC 璇彞錛屽唴瀛樻硠婕忕殑杈撳嚭鏄繖鏍風殑錛?/font>
Detected memory leaks! Dumping objects -> {45} normal block at 0x00441BA0, 2 bytes long. Data: <AB> 41 42 {44} normal block at 0x00441BD0, 33 bytes long. Data: < C > 00 43 00 CD CD CD CD CD CD CD CD CD CD CD CD CD {43} normal block at 0x00441C20, 40 bytes long. Data: < C > C0 01 43 00 16 00 00 00 00 00 00 00 00 00 00 00 Object dump complete.
銆銆鏍規(guī)嵁榪欐杈撳嚭淇℃伅錛屼綘鏃犳硶鐭ラ亾鍦ㄥ摢涓簮紼嬪簭鏂囦歡閲屽彂鐢熶簡鍐呭瓨娉勬紡銆備笅闈㈡垜浠潵鐮旂┒涓涓嬭緭鍑轟俊鎭殑鏍煎紡銆傜涓琛屽拰絎簩琛屾病鏈変粈涔堝彲璇寸殑錛屼粠絎笁琛屽紑濮嬶細
xx}錛氳姳鎷姬鍐呯殑鏁板瓧鏄唴瀛樺垎閰嶅簭鍙鳳紝鏈枃渚嬪瓙涓槸 {45}錛寋44}錛寋43}錛?block錛氬唴瀛樺潡鐨勭被鍨嬶紝甯哥敤鐨勬湁涓夌錛歯ormal錛堟櫘閫氾級銆乧lient錛堝鎴風錛夋垨 CRT錛堣繍琛屾椂錛夛紱鏈枃渚嬪瓙涓槸錛歯ormal block錛? 鐢ㄥ崄鍏繘鍒舵牸寮忚〃紺虹殑鍐呭瓨浣嶇疆錛屽錛歛t 0x00441BA0 絳夛紱 浠ュ瓧鑺備負鍗曚綅琛ㄧず鐨勫唴瀛樺潡鐨勫ぇ灝忥紝濡傦細32 bytes long錛? 鍓?16 瀛楄妭鐨勫唴瀹癸紙涔熸槸鐢ㄥ崄鍏繘鍒舵牸寮忚〃紺猴級錛屽錛欴ata: <AB> 41 42 絳夛紱
銆銆浠旂粏瑙傚療涓嶉毦鍙戠幇錛屽鏋滃畾涔変簡 _CRTDBG_MAP_ALLOC 錛岄偅涔堝湪鍐呭瓨鍒嗛厤搴忓彿鍓嶉潰榪樹細鏄劇ず鍦ㄥ叾涓垎閰嶆硠婕忓唴瀛樼殑鏂囦歡鍚嶏紝浠ュ強鏂囦歡鍚嶅悗鎷彿涓殑鏁板瓧琛ㄧず鍙戠敓娉勬紡鐨勪唬鐮佽鍙鳳紝姣斿錛?/font>
C:\Temp\memleak\memleak.cpp(15)銆銆鍙屽嚮 Output 紿楀彛涓鏂囦歡鍚嶆墍鍦ㄧ殑杈撳嚭琛岋紝渚垮彲璺沖埌婧愮▼搴忔枃浠跺垎閰嶈鍐呭瓨鐨勪唬鐮佽錛堜篃鍙互閫変腑璇ヨ錛岀劧鍚庢寜 F4錛屾晥鏋滀竴鏍鳳級 錛岃繖鏍蜂竴鏉ユ垜浠氨寰堝鏄撳畾浣嶅唴瀛樻硠婕忔槸鍦ㄥ摢閲屽彂鐢熺殑浜嗭紝鍥犳錛宊CRTDBG_MAP_ALLOC 鐨勪綔鐢ㄦ樉鑰屾槗瑙併?br>
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
銆銆榪欐潯璇彞鏃犺紼嬪簭鍦ㄤ粈涔堝湴鏂歸鍑洪兘浼氳嚜鍔ㄨ皟鐢?_CrtDumpMemoryLeaks銆傛敞鎰忥細榪欓噷蹇呴』鍚屾椂璁劇疆涓や釜浣嶅煙鏍囧織錛歘CRTDBG_ALLOC_MEM_DF 鍜?_CRTDBG_LEAK_CHECK_DF銆?br>
璁劇疆 CRT 鎶ュ憡妯″紡
榛樿鎯呭喌涓嬶紝_CrtDumpMemoryLeaks 灝嗗唴瀛樻硠婕忎俊鎭?dump 鍒?Output 紿楀彛鐨?Debug 欏碉紝 濡傛灉浣犳兂灝嗚繖涓緭鍑哄畾鍚戝埌鍒殑鍦版柟錛屽彲浠ヤ嬌鐢?_CrtSetReportMode 榪涜閲嶇疆銆傚鏋滀綘浣跨敤鏌愪釜搴擄紝瀹冨彲鑳藉皢杈撳嚭瀹氬悜鍒板彟涓浣嶇疆銆傛鏃訛紝鍙浣跨敤浠ヤ笅璇彞灝嗚緭鍑轟綅緗鍥?Output 紿楀彛鍗沖彲錛?/font>
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
鏈夊叧浣跨敤 _CrtSetReportMode 鐨勮緇嗕俊鎭紝璇峰弬鑰?MSDN 搴撳叧浜?_CrtSetReportMode 鐨勬弿榪般?br>
鍓嶉潰宸茬粡璇磋繃錛屽唴瀛樻硠婕忔姤鍛婁腑鎶婃瘡涓鍧楁硠婕忕殑鍐呭瓨鍒嗕負 normal錛堟櫘閫氬潡錛夈乧lient錛堝鎴風鍧楋級鍜?CRT 鍧椼備簨瀹炰笂錛岄渶瑕佺暀蹇冨拰娉ㄦ剰鐨勪篃灝辨槸 normal 鍜?client錛屽嵆鏅氬潡鍜屽鎴風鍧椼?/font>
闄や簡涓婅堪鐨勭被鍨嬪錛岃繕鏈変笅闈㈣繖涓ょ綾誨瀷鐨勫唴瀛樺潡錛屽畠浠笉浼氬嚭鐜板湪鍐呭瓨娉勬紡鎶ュ憡涓細
濡備綍鍦ㄥ唴瀛樺垎閰嶅簭鍙峰璁劇疆鏂偣錛?/font>
銆銆鍦ㄥ唴瀛樻硠婕忔姤鍛婁腑錛岀殑鏂囦歡鍚嶅拰琛屽彿鍙憡璇夊垎閰嶆硠婕忕殑鍐呭瓨鐨勪唬鐮佷綅緗紝浣嗕粎浠呬緷璧栬繖浜涗俊鎭潵浜嗚В瀹屾暣鐨勬硠婕忓師鍥犳槸涓嶅鐨勩傚洜涓轟竴涓▼搴忓湪榪愯鏃訛紝涓孌靛垎閰嶅唴瀛樼殑浠g爜鍙兘浼氳璋冪敤寰堝嬈★紝鍙鏈変竴嬈¤皟鐢ㄥ悗娌℃湁閲婃斁鍐呭瓨灝變細瀵艱嚧鍐呭瓨娉勬紡銆備負浜嗙‘瀹氭槸鍝簺鍐呭瓨娌℃湁琚噴鏀撅紝涓嶄粎瑕佺煡閬撴硠婕忕殑鍐呭瓨鏄湪鍝噷鍒嗛厤鐨勶紝榪樿鐭ラ亾娉勬紡浜х敓鐨勬潯浠躲傝繖鏃跺唴瀛樺垎閰嶅簭鍙峰氨鏄懼緱鐗瑰埆鏈夌敤鈥斺旇繖涓簭鍙峰氨鏄枃浠跺悕鍜岃鍙蜂箣鍚庣殑鑺辨嫭寮ч噷鐨勯偅涓暟瀛椼?br>渚嬪錛屽湪鏈枃渚嬪瓙浠g爜鐨勮緭鍑轟俊鎭腑錛?#8220;45”鏄唴瀛樺垎閰嶅簭鍙鳳紝鎰忔濇槸娉勬紡鐨勫唴瀛樻槸浣犵▼搴忎腑鍒嗛厤鐨勭鍥涘崄浜斾釜鍐呭瓨鍧楋細
Detected memory leaks! Dumping objects -> C:\Temp\memleak\memleak.cpp(15) : {45} normal block at 0x00441BA0, 2 bytes long. Data: <AB> 41 42 ...... Object dump complete.
銆銆CRT 搴撳紼嬪簭榪愯鏈熼棿鍒嗛厤鐨勬墍鏈夊唴瀛樺潡榪涜璁℃暟錛屽寘鎷敱 CRT 搴撹嚜宸卞垎閰嶇殑鍐呭瓨鍜屽叾瀹冨簱錛堝 MFC錛夊垎閰嶇殑鍐呭瓨銆傚洜姝わ紝鍒嗛厤搴忓彿涓?N 鐨勫璞″嵆涓虹▼搴忎腑鍒嗛厤鐨勭 N 涓璞★紝浣嗕笉涓瀹氭槸浠g爜鍒嗛厤鐨勭 N 涓璞°傦紙澶у鏁版儏鍐典笅騫墮潪濡傛銆傦級
榪欐牱鐨勮瘽錛屼綘渚垮彲浠ュ埄鐢ㄥ垎閰嶅簭鍙峰湪鍒嗛厤鍐呭瓨鐨勪綅緗緗竴涓柇鐐廣傛柟娉曟槸鍦ㄧ▼搴忚搗濮嬮檮榪戣緗竴涓綅緗柇鐐廣傚綋紼嬪簭鍦ㄨ鐐逛腑鏂椂錛屽彲浠ヤ粠 QuickWatch錛堝揩閫熺洃瑙嗭級瀵硅瘽妗嗘垨 Watch錛堢洃瑙嗭級紿楀彛璁劇疆涓涓唴瀛樺垎閰嶆柇鐐癸細
渚嬪錛屽湪 Watch 紿楀彛涓紝鍦?Name 鏍忛敭鍏ヤ笅闈㈢殑琛ㄨ揪寮忥細
_crtBreakAlloc
濡傛灉瑕佷嬌鐢?CRT 搴撶殑澶氱嚎紼?DLL 鐗堟湰錛?MD 閫夐」錛夛紝閭d箞蹇呴』鍖呭惈涓婁笅鏂囨搷浣滅錛屽儚榪欐牱錛?/font>
{,,msvcrtd.dll}_crtBreakAlloc
銆銆鐜板湪鎸変笅鍥炶濺閿紝璋冭瘯鍣ㄥ皢璁$畻璇ュ煎茍鎶婄粨鏋滄斁鍏?Value 鏍忋傚鏋滄病鏈夊湪鍐呭瓨鍒嗛厤鐐硅緗換浣曟柇鐐癸紝璇ュ煎皢涓?–1銆?br>鐢ㄤ綘鎯寵鍦ㄥ叾浣嶇疆涓柇鐨勫唴瀛樺垎閰嶇殑鍒嗛厤搴忓彿鏇挎崲 Value 鏍忎腑鐨勫箋備緥濡傝緭鍏?45銆傝繖鏍峰氨浼氬湪鍒嗛厤搴忓彿涓?45 鐨勫湴鏂逛腑鏂?nbsp;
鍦ㄦ墍鎰熷叴瓚g殑鍐呭瓨鍒嗛厤澶勮緗柇鐐瑰悗錛屽彲浠ョ戶緇皟璇曘傝繖鏃訛紝榪愯紼嬪簭鏃朵竴瀹氳灝忓績錛岃淇濊瘉鍐呭瓨鍧楀垎閰嶇殑欏哄簭涓嶄細鏀瑰彉銆傚綋紼嬪簭鍦ㄦ寚瀹氱殑鍐呭瓨鍒嗛厤澶勪腑鏂椂錛屽彲浠ユ煡鐪?Call Stack錛堣皟鐢ㄥ爢鏍堬級紿楀彛鍜屽叾瀹冭皟璇曞櫒淇℃伅浠ョ‘瀹氬垎閰嶅唴瀛樻椂鐨勬儏鍐點傚鏋滃繀瑕侊紝鍙互浠庤鐐圭戶緇墽琛岀▼搴忥紝浠ユ煡鐪嬪璞″彂鐢熶簡浠涔堟儏鍐碉紝鎴栬鍙互紜畾鏈紜噴鏀懼璞$殑鍘熷洜銆?br>灝界閫氬父鍦ㄨ皟璇曞櫒涓緗唴瀛樺垎閰嶆柇鐐規(guī)洿鏂逛究錛屼絾濡傛灉鎰挎剰錛屼篃鍙湪浠g爜涓緗繖浜涙柇鐐廣備負浜嗗湪浠g爜涓緗竴涓唴瀛樺垎閰嶆柇鐐癸紝鍙互澧炲姞榪欐牱涓琛岋紙瀵逛簬絎洓鍗佷簲涓唴瀛樺垎閰嶏級錛?/font>
_crtBreakAlloc = 45;
浣犺繕鍙互浣跨敤鏈夌浉鍚屾晥鏋滅殑 _CrtSetBreakAlloc 鍑芥暟錛?/font>
_CrtSetBreakAlloc(45);
濡備綍姣旇緝鍐呭瓨鐘舵侊紵
銆銆瀹氫綅鍐呭瓨娉勬紡鐨勫彟涓涓柟娉曞氨鏄湪鍏抽敭鐐硅幏鍙栧簲鐢ㄧ▼搴忓唴瀛樼姸鎬佺殑蹇収銆侰RT 搴撴彁渚涗簡涓涓粨鏋勭被鍨?_CrtMemState銆備綘鍙互鐢ㄥ畠鏉ュ瓨鍌ㄥ唴瀛樼姸鎬佺殑蹇収錛?/font>
_CrtMemState s1, s2, s3;
銆銆鑻ヨ鑾峰彇緇欏畾鐐圭殑鍐呭瓨鐘舵佸揩鐓э紝鍙互鍚?_CrtMemCheckpoint 鍑芥暟浼犻掍竴涓?_CrtMemState 緇撴瀯銆傝鍑芥暟鐢ㄥ綋鍓嶅唴瀛樼姸鎬佺殑蹇収濉厖姝ょ粨鏋勶細
_CrtMemCheckpoint( &s1 );
銆銆閫氳繃鍚?_CrtMemDumpStatistics 鍑芥暟浼犻?_CrtMemState 緇撴瀯錛屽彲浠ュ湪浠繪剰鍦版柟 dump 璇ョ粨鏋勭殑鍐呭錛?/font>
_CrtMemDumpStatistics( &s1 );
璇ュ嚱鏁拌緭鍑哄涓嬫牸寮忕殑 dump 鍐呭瓨鍒嗛厤淇℃伅錛?/font>
0 bytes in 0 Free Blocks. 75 bytes in 3 Normal Blocks. 5037 bytes in 41 CRT Blocks. 0 bytes in 0 Ignore Blocks. 0 bytes in 0 Client Blocks. Largest number used: 5308 bytes. Total allocations: 7559 bytes.
銆銆鑻ヨ紜畾鏌愭浠g爜涓槸鍚﹀彂鐢熶簡鍐呭瓨娉勬紡錛屽彲浠ラ氳繃鑾峰彇璇ユ浠g爜涔嬪墠鍜屼箣鍚庣殑鍐呭瓨鐘舵佸揩鐓э紝鐒跺悗浣跨敤 _CrtMemDifference 姣旇緝榪欎袱涓姸鎬侊細
_CrtMemCheckpoint( &s1 );// 鑾峰彇絎竴涓唴瀛樼姸鎬佸揩鐓? // 鍦ㄨ繖閲岃繘琛屽唴瀛樺垎閰? _CrtMemCheckpoint( &s2 );// 鑾峰彇絎簩涓唴瀛樼姸鎬佸揩鐓? // 姣旇緝涓や釜鍐呭瓨蹇収鐨勫樊寮?if ( _CrtMemDifference( &s3, &s1, &s2) ) _CrtMemDumpStatistics( &s3 );// dump 宸紓緇撴灉
銆銆欏懼悕鎬濅箟錛宊CrtMemDifference 姣旇緝涓や釜鍐呭瓨鐘舵侊紙鍓嶄袱涓弬鏁幫級錛岀敓鎴愯繖涓や釜鐘舵佷箣闂村樊寮傜殑緇撴灉錛堢涓変釜鍙傛暟錛夈傚湪紼嬪簭鐨勫紑濮嬪拰緇撳熬鏀劇疆 _CrtMemCheckpoint 璋冪敤錛屽茍浣跨敤 _CrtMemDifference 姣旇緝緇撴灉錛屾槸媯鏌ュ唴瀛樻硠婕忕殑鍙︿竴縐嶆柟娉曘傚鏋滄嫻嬪埌娉勬紡錛屽垯鍙互浣跨敤 _CrtMemCheckpoint 璋冪敤閫氳繃浜岃繘鍒舵悳绱㈡妧鏈潵鍒嗗壊紼嬪簭鍜屽畾浣嶆硠婕忋?br>
緇撹
灝界 VC ++ 鍏鋒湁涓濂椾笓闂ㄨ皟璇?MFC 搴旂敤紼嬪簭鐨勬満鍒訛紝浣嗘湰鏂囦笂榪拌璁虹殑鍐呭瓨鍒嗛厤寰堢畝鍗曪紝娌℃湁娑夊強鍒?MFC 瀵硅薄錛屾墍浠ヨ繖浜涘唴瀹瑰悓鏍蜂篃閫傜敤浜?MFC 紼嬪簭銆傚湪 MSDN 搴撲腑鍙互鎵懼埌寰堝鏈夊叧 VC++ 璋冭瘯鏂歸潰鐨勮祫鏂欙紝濡傛灉浣犺兘鍠勭敤 MSDN 搴擄紝鐩鎬俊鐢ㄤ笉浜嗗灝戞椂闂翠綘灝辨湁鍙兘鎴愪負璋冭瘯楂樻墜銆?br>
鏈漢姘村鉤涓嶉珮錛岃艾璇湪鎵闅懼厤錛岃澶у鎷嶇爾錛屼笉瑕佸姘斻傞『紲濆ぇ瀹跺湥璇炲揩涔愶紒
JerryZ 浜?2004 騫村鉤瀹夊錛?br>
璋冭瘯鏂規(guī)硶鍜屾妧宸?br>
浣滆咃細闈炲嚒
渚夸簬璋冭瘯鐨勪唬鐮侀鏍鹼細
VC++緙栬瘧閫夐」錛?/font>
璋冭瘯鏂規(guī)硶錛?/font>
1銆佷嬌鐢?Assert錛堝師鍒欙細灝介噺綆鍗曪級
assert鍙湪debug涓嬬敓鏁堬紝release涓嬩笉浼氳緙栬瘧銆?br>
渚嬪瓙錛?/font>
char* strcpy(char* dest,char* source) { assert(source!=0); assert(dest!=0); char* returnstring = dest; while((*dest++ = *source++)!= ‘\0’) { ; } return returnstring; }
2銆侀槻寰℃х殑緙栫▼
渚嬪瓙錛?/font>
char* strcpy(char* dest,char* source) { if(source == 0) { assert(false); reutrn 0; } if(dest == 0) { assert(false); return 0; } char* returnstring = dest; while((*dest++ = *source++)!= ‘\0’) { ; } return returnstring; }
3銆佷嬌鐢═race
浠ヤ笅鐨勪緥瀛愬彧鑳藉湪debug涓樉紺猴紝
渚嬪瓙錛?br>
a)銆乀RACE
CString csTest 錛?“test”錛?TRACE錛?#8220;CString is 錛卻\n”錛宑sTest錛夛紱
b)銆丄TLTRACE
c)銆乤fxDump
CTime time = CTime::GetCurrentTime(); #ifdef _DEBUG afxDump << time << “\n”; #endif
4銆佺敤GetLastError鏉ユ嫻嬭繑鍥炲鹼紝閫氳繃寰楀埌閿欒浠g爜鏉ュ垎鏋愰敊璇師鍥?br>
5銆佹妸閿欒淇℃伅璁板綍鍒版枃浠朵腑
寮傚父澶勭悊
紼嬪簭璁捐鏃朵竴瀹氳鑰冭檻鍒板紓甯稿浣曞鐞嗭紝褰撻敊璇彂鐢熷悗錛屼笉搴旂畝鍗曠殑鎶ュ憡閿欒騫墮鍑虹▼搴忥紝搴斿綋灝藉彲鑳界殑鎯沖姙娉曟仮澶嶅埌鍑洪敊鍓嶇殑鐘舵佹垨鑰呰紼嬪簭浠庡ご寮濮嬭繍琛岋紝騫朵笖瀵逛簬鏌愪簺閿欒錛屽簲璇ヨ兘澶熷閿欙紝鍗沖厑璁擱敊璇殑瀛樺湪錛屼絾鏄▼搴忚繕鏄兘澶熸甯稿畬鎴愪換鍔°?br>
璋冭瘯鎶宸?/strong>
1銆乂C++涓璅5榪涜璋冭瘯榪愯
a)銆佸湪output Debug紿楀彛涓彲浠ョ湅鍒扮敤TRACE鎵撳嵃鐨勪俊鎭?br>b)銆?Call Stack紿楀彛涓兘鐪嬪埌紼嬪簭鐨勮皟鐢ㄥ爢鏍?br>
2銆佸綋Debug鐗堟湰榪愯鏃跺彂鐢熷穿婧冿紝閫夋嫨retry榪涜璋冭瘯錛岄氳繃鐪婥all Stack鍒嗘瀽鍑洪敊鐨勪綅緗強鍘熷洜
3銆佷嬌鐢ㄦ槧灝勬枃浠惰皟璇?br>
a)銆佸垱寤烘槧灝勬枃浠訛細Project settings涓璴ink欏癸紝閫変腑Generate mapfile錛岃緭鍑虹▼搴忎唬鐮佸湴鍧錛?MAPINFO: LINES錛屽緱鍒板紩鍑哄簭鍙鳳細/MAPINFO: EXPORTS銆?br>b)銆佺▼搴忓彂甯冩椂錛屽簲璇ユ妸鎵鏈夋ā鍧楃殑鏄犲皠鏂囦歡閮藉瓨妗c?br>c)銆佹煡鐪嬫槧灝勬枃浠訛細瑙?#8221; 閫氳繃宕╂簝鍦板潃鎵懼嚭婧愪唬鐮佺殑鍑洪敊琛?#8221;鏂囦歡銆?br>
4銆佸彲浠ヨ皟璇曠殑Release鐗堟湰
Project settings涓瑿++欏圭殑Debug Info閫夋嫨涓篜rogram Database錛孡ink欏圭殑Debug涓夋嫨Debug Info鍜孧icrosoft format銆?br>
5銆佹煡鐪婣PI鐨勯敊璇爜錛屽湪watch紿楀彛杈撳叆@err鍙互鏌ョ湅鎴栬匑err,hr錛屽叾涓?#8221;,hr”琛ㄧず閿欒鐮佺殑璇存槑銆?br>6銆丼et Next Statement錛氳鍔熻兘鍙互鐩存帴璺寵漿鍒版寚瀹氱殑浠g爜琛屾墽琛岋紝涓鑸敤鏉ユ祴璇曞紓甯稿鐞嗙殑浠g爜銆?br>7銆佽皟璇曞唴瀛樺彉閲忕殑鍙樺寲錛氬綋鍐呭瓨鍙戠敓鍙樺寲鏃跺仠涓嬫潵銆?br>
甯歌閿欒
1銆佸湪鍑芥暟榪斿洖鐨勬椂鍊欑▼搴忓穿婧冪殑鍘熷洜
a)銆佸啓鑷姩鍙橀噺瓚婄晫
b)銆佸嚱鏁板師鍨嬩笉鍖歸厤
2銆丮FC
a)銆佷嬌鐢ㄩ敊璇殑鍑芥暟鍘熷瀷澶勭悊鐢ㄦ埛瀹氫箟娑堟伅
姝g‘鐨勫嚱鏁板師鍨嬩負錛?/font>
afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);
3銆佽皚鎱庝嬌鐢═erminateThread錛氫嬌鐢═erminateThread浼氶犳垚璧勬簮娉勬紡錛屼笉鍒頒竾涓嶅緱宸詫紝涓嶈浣跨敤銆?br>
4銆佷嬌鐢╛beginthreadex錛屼笉瑕佷嬌鐢–reate Thread鏉ュ父瑙佺嚎紼嬨?br>
鍙傝冭祫鏂欙細
銆奧indows紼嬪簭璋冭瘯銆?br>
鍔熻兘寮哄ぇ鐨剉c6璋冭瘯鍣?br>
浣滆咃細yy2better
瑕佹垚涓轟竴浣嶄紭縐鐨勮蔣浠跺伐紼嬪笀錛岃皟璇曡兘鍔涘繀涓嶅彲緙恒傛湰鏂囧皢杈冭緇嗕粙緇峍C6璋冭瘯鍣ㄧ殑涓昏鐢ㄦ硶銆?nbsp;
windows騫沖彴鐨勮皟璇曞櫒涓昏鍒嗕負涓ゅぇ綾伙細
1 鐢ㄦ埛妯″紡(user-mode)璋冭瘯鍣細瀹冧滑閮藉熀浜巜in32 Debugging API錛屾湁浣跨敤鏂逛究鐨勭晫闈紝涓昏鐢ㄤ簬璋冭瘯鐢ㄦ埛妯″紡涓嬬殑搴旂敤紼嬪簭銆傝繖綾昏皟璇曞櫒鍖呮嫭Visual C++璋冭瘯鍣ㄣ乄inDBG銆丅oundChecker銆丅orland C++ Builder璋冭瘯鍣ㄣ丯TSD絳夈?nbsp;
2 鍐呮牳妯″紡(kernel-mode)璋冭瘯鍣細鍐呮牳璋冭瘯鍣ㄤ綅浜嶤PU鍜屾搷浣滅郴緇熶箣闂達紝涓鏃﹀惎鍔紝鎿嶄綔緋葷粺涔熶細涓榪愯錛屼富瑕佺敤浜庤皟璇曢┍鍔ㄧ▼搴忔垨鐢ㄦ埛妯″紡璋冭瘯鍣ㄤ笉鏄撹皟璇曠殑紼嬪簭銆傝繖綾昏皟璇曞櫒鍖呮嫭WDEB386銆乄inDBG鍜宻oftice絳夈傚叾涓璚inDBG鍜宻oftice涔熷彲浠ヨ皟璇曠敤鎴鋒ā寮忎唬鐮併?nbsp;
鍥藉涓浣嶈皟璇曢珮鎵嬫浘璇達紝浠?0錛呰皟璇曟椂闂存槸鍦ㄧ敤VC++錛屽叾浣欐椂闂存槸浣跨敤WinDBG鍜宻oftice銆傛瘯绔燂紝璋冭瘯鐢ㄦ埛妯″紡浠g爜錛孷C6璋冭瘯鍣ㄧ殑鏁堢巼鏄潪甯擱珮鐨勩傚洜姝わ紝鎴戝皢棣栧厛鍦ㄦ湰綃囦粙緇峍C6璋冭瘯鍣ㄧ殑涓昏鐢ㄦ硶錛屽叾浠栬皟璇曞櫒鐨勭敤娉曞強涓浜涜皟璇曟妧鑳藉湪鍚庣畫鏂囩珷涓槓榪般?nbsp;
涓 浣嶇疆鏂偣錛圠ocation Breakpoint錛?/strong>
澶у鏈甯哥敤鐨勬柇鐐規(guī)槸鏅氱殑浣嶇疆鏂偣錛屽湪婧愮▼搴忕殑鏌愪竴琛屾寜F9灝辮緗簡涓涓綅緗柇鐐廣備絾瀵逛簬寰堝闂錛岃繖縐嶆湸绱犵殑鏂偣浣滅敤鏈夐檺銆傝濡備笅闈㈣繖孌典唬鐮侊細
void CForDebugDlg::OnOK() { for (int i = 0; i < 1000; i++) //A { int k = i * 10 - 2; //B SendTo(k); //C int tmp = DoSome(i); //D int j = i / tmp; //E } }
鎵ц姝ゅ嚱鏁幫紝紼嬪簭宕╂簝浜嶦琛岋紝鍙戠幇姝ゆ椂tmp涓?錛屽亣璁総mp鏈笉搴旇涓?錛屾庝箞榪欎釜鏃跺欎負0鍛紵鎵浠ユ渶濂借兘澶熻窡韙嬈″驚鐜椂DoSome鍑芥暟鏄浣曡繍琛岀殑錛屼絾鐢變簬鏄湪寰幆浣撳唴錛屽鏋滃湪E琛岃緗柇鐐癸紝鍙兘闇瑕佹寜F5錛圙O錛夎澶氭銆傝繖鏍鋒墜瑕佷笉鍋滅殑鎸夛紝寰堢棝鑻︺備嬌鐢╒C6鏂偣淇グ鏉′歡灝卞彲浠ヨ交鏄撹В鍐蟲闂銆傛楠ゅ涓嬨?nbsp;
1 Ctrl+B鎵撳紑鏂偣璁劇疆妗嗭紝濡備笅鍥撅細
Figure 1璁劇疆楂樼駭浣嶇疆鏂偣
2 鐒跺悗閫夋嫨D琛屾墍鍦ㄧ殑鏂偣錛岀劧鍚庣偣鍑籧ondition鎸夐挳錛屽湪寮瑰嚭瀵硅瘽妗嗙殑鏈涓嬮潰涓涓紪杈戞涓緭鍏ヤ竴涓緢澶ф暟鐩紝鍏蜂綋瑙嗗簲鐢ㄨ屽畾錛岃繖閲?000灝卞浜嗐?nbsp;
3 鎸塅5閲嶆柊榪愯紼嬪簭錛岀▼搴忎腑鏂侰trl+B鎵撳紑鏂偣妗嗭紝鍙戠幇姝ゆ柇鐐瑰悗璺熼殢涓涓茶鏄庯細...487 times remaining銆傛剰鎬濇槸榪樺墿涓?87嬈℃病鏈夋墽琛岋紝閭e氨鏄鎵ц鍒?13錛?000錛?87錛夋鏃跺欏嚭閿欑殑銆傚洜姝わ紝鎴戜滑鎸夋楠?鎵璁詫紝鏇存敼姝ゆ柇鐐圭殑skip嬈℃暟,灝?000鏀逛負513銆?nbsp;
4 鍐嶆閲嶆柊榪愯紼嬪簭錛岀▼搴忔墽琛屼簡513嬈″驚鐜紝鐒跺悗鑷姩鍋滃湪鏂偣澶勩傝繖鏃訛紝鎴戜滑灝卞彲浠ヤ粩緇嗘煡鐪婦oSome鏄浣曡繑鍥?鐨勩傝繖鏍鳳紝浣犲氨閬垮厤浜嗘墜鎸囩殑鐥涜嫤錛岃妭鐪佷簡鏃墮棿銆?nbsp;
鍐嶇湅浣嶇疆鏂偣鍏朵粬淇グ鏉′歡銆傚Figure 1鎵紺猴紝鍦?#8220;Enter the expression to be evaluated:”涓嬮潰錛屽彲浠ヨ緭鍏ヤ竴浜涙潯浠訛紝褰撹繖浜涙潯浠舵弧瓚蟲椂錛屾柇鐐規(guī)墠鍚姩銆傝濡傦紝鍒氭墠鐨勭▼搴忥紝鎴戜滑闇瑕乮涓?00鏃剁▼搴忓仠涓嬫潵錛屾垜浠氨鍙互杈撳叆鍦ㄧ紪杈戞涓緭鍏?#8220;i==100”銆?nbsp;
鍙﹀錛屽鏋滃湪姝ょ紪杈戞涓鏋滃彧杈撳叆鍙橀噺鍚嶇О錛屽垯鍙橀噺鍙戠敓鏀瑰彉鏃訛紝鏂偣鎵嶄細鍚姩銆傝繖瀵規(guī)嫻嬩竴涓彉閲忎綍鏃惰淇敼寰堟柟渚匡紝鐗瑰埆瀵逛竴浜涘ぇ紼嬪簭銆?nbsp;
鐢ㄥソ浣嶇疆鏂偣鐨勪慨楗版潯浠訛紝鍙互澶уぇ鏂逛究瑙e喅鏌愪簺闂銆?nbsp;
浜?鏁版嵁鏂偣錛圖ata Breakpoint錛?/strong>
杞歡璋冭瘯榪囩▼涓紝鏈夋椂浼氬彂鐜頒竴浜涙暟鎹細鑾悕鍏跺鐨勮淇敼鎺夛紙濡備竴浜涙暟緇勭殑瓚婄晫鍐欏鑷磋鐩栦簡鍙﹀鐨勫彉閲忥級錛屾壘鍑轟綍澶勪唬鐮佸鑷磋繖鍧楀唴瀛樿鏇存敼鏄竴浠舵鎵嬬殑浜嬫儏錛堝鏋滄病鏈夎皟璇曞櫒鐨勫府鍔╋級銆傛伆褰撹繍鐢ㄦ暟鎹柇鐐瑰彲浠ュ揩閫熷府浣犲畾浣嶄綍鏃朵綍澶勮繖涓暟鎹淇敼銆傝濡備笅闈竴孌電▼搴忥細
#include "stdafx.h" #includeint main(int argc, char* argv[]) { char szName1[10]; char szName2[4]; strcpy(szName1,"shenzhen"); printf("%s\n", szName1); //A strcpy(szName2, "vckbase"); //B printf("%s\n", szName1); printf("%s\n", szName2); return 0; }
榪欐紼嬪簭鐨勮緭鍑烘槸
szName1: shenzhen szName1: ase szName2: vckbase
szName1浣曟椂琚慨鏀瑰憿錛熷洜涓烘病鏈夋槑鏄劇殑淇敼szName1浠g爜銆傛垜浠彲浠ラ鍏堝湪A琛岃緗櫘閫氭柇鐐癸紝F5榪愯紼嬪簭錛岀▼搴忓仠鍦ˋ琛屻傜劧鍚庢垜浠啀璁劇疆涓涓暟鎹柇鐐廣傚涓嬪浘錛?nbsp;
Figure 2 鏁版嵁鏂偣
F5緇х畫榪愯錛岀▼搴忓仠鍦˙琛岋紝璇存槑B澶勪唬鐮佷慨鏀逛簡szName1銆侭澶勬槑鏄庢病鏈変慨鏀箂zName1鍛錛熶絾璋冭瘯鍣ㄦ寚鏄庢槸榪欎竴琛岋紝涓鑸笉浼氶敊錛屾墍浠ヨ繕鏄潤涓嬪績鏉ョ湅鐪嬬▼搴忥紝鍝︼紝浣犲彂鐜頒簡錛歴zName2鍙湁4涓瓧鑺傦紝鑰宻trcpy浜?涓瓧鑺傦紝鎵浠ヨ鍐欎簡szName1銆?nbsp;
鏁版嵁鏂偣涓嶅彧鏄鍙橀噺鏀瑰彉鏈夋晥錛岃繕鍙互璁劇疆鍙橀噺鏄惁絳変簬鏌愪釜鍊箋傝濡傦紝浣犲彲浠ュ皢Figure 2涓孩鍦堝鏀逛負鏉′歡”szName2[0]==''''y''''“,閭d箞褰搒zName2絎竴涓瓧絎︿負y鏃舵柇鐐瑰氨浼氬惎鍔ㄣ?nbsp;
鍙互鐪嬪嚭錛屾暟鎹柇鐐圭浉瀵逛綅緗柇鐐逛竴涓緢澶х殑鍖哄埆鏄笉鐢ㄦ槑紜寚鏄庡湪鍝竴琛屼唬鐮佽緗柇鐐廣?nbsp;
涓?鍏朵粬
1 鍦╟all stack紿楀彛涓緗柇鐐癸紝閫夋嫨鏌愪釜鍑芥暟錛屾寜F9璁劇疆涓涓柇鐐廣傝繖鏍峰彲浠ヤ粠娣卞眰嬈$殑鍑芥暟璋冪敤涓繀閫熻繑鍥炲埌闇瑕佺殑鍑芥暟銆?nbsp;
2 Set Next StateMent鍛戒護錛坉ebug榪囩▼涓紝鍙抽敭鑿滃崟涓殑鍛戒護錛?nbsp;
姝ゅ懡浠ょ殑浣滅敤鏄皢紼嬪簭鐨勬寚浠ゆ寚閽堬紙EIP錛夋寚鍚戜笉鍚岀殑浠g爜琛屻傝濡傦紝浣犳鍦ㄨ皟璇曚笂闈㈤偅孌典唬鐮侊紝榪愯鍦ˋ琛岋紝浣嗕綘涓嶆効鎰忚繍琛孊琛屽拰C琛屼唬鐮侊紝榪欐椂錛屼綘灝卞彲浠ュ湪D琛岋紝鍙抽敭錛岀劧鍚?#8220;Set Next StateMent”銆傝皟璇曞櫒灝變笉浼氭墽琛孊銆丆琛屻傚彧瑕佸湪鍚屼竴鍑芥暟鍐咃紝姝ゆ寚浠ゅ氨鍙互闅忔剰璺沖墠鎴栬煩鍚庢墽琛屻傜伒媧諱嬌鐢ㄦ鍔熻兘鍙互澶ч噺鑺傜渷璋冭瘯鏃墮棿銆?nbsp;
3 watch紿楀彛
watch紿楀彛鏀寔涓板瘜鐨勬暟鎹牸寮忓寲鍔熻兘銆傚杈撳叆0x65,u錛屽垯鍦ㄥ彸鏍忔樉紺?01銆?nbsp;
瀹炴椂鏄劇ずwindows API璋冪敤鐨勯敊璇細鍦ㄥ乏鏍忚緭鍏err,hr銆?nbsp;
鍦╳atch紿楀彛涓皟鐢ㄥ嚱鏁般傛彁閱掍竴涓嬶紝璋冪敤瀹屽嚱鏁板悗椹笂鍦╳atch紿楀彛涓竻闄ゅ畠錛屽惁鍒欙紝鍗曟璋冭瘯鏃舵瘡涓姝ヨ皟璇曞櫒閮戒細璋冪敤姝ゅ嚱鏁般?nbsp;
4 messages鏂偣涓嶆庝箞瀹炵敤銆傚熀鏈笂鍙互鐢ㄥ墠闈㈣榪扮殑鏂偣浠f浛銆?nbsp;
鎬葷粨
璋冭瘯鏈閲嶈鐨勮繕鏄綘瑕佹濊冿紝瑕佺寽嫻嬩綘鐨勭▼搴忓彲鑳藉嚭閿欑殑鍦版柟錛岀劧鍚庤繍鐢ㄤ綘鐨勮皟璇曞櫒鏉ヨ瘉瀹炰綘鐨勭寽嫻嬨傝岀啛緇冧嬌鐢ㄤ笂闈㈣繖浜涙妧宸ф棤鐤戜細鍔犲揩榪欎釜榪囩▼銆傛渶鍚庯紝澶у濡傛灉鏈夊叧浜庤皟璇曟柟闈㈢殑闂錛屾垜涔愭剰鍙備笌鎺㈣銆?/font>
[ English | 綆浣撲腑鏂?/strong> | 膶esky | Dansk | Deutsch | Français | Polski | 袪褍褋褋瀉懈泄 | 綣侀珨涓枃 ]
涓哄叕浼楀啓榪囪蔣浠剁殑浜猴紝澶ф閮芥敹鍒拌繃寰堟嫏鍔g殑bug錛堣綆楁満紼嬪簭浠g爜涓殑閿欒鎴栫▼搴忚繍琛屾椂鐨勭憰鐤碘斺旇瘧鑰呮敞錛夋姤鍛婏紝渚嬪錛?/p>
鍦ㄦ姤鍛婁腑璇?#8220;涓嶅ソ鐢?#8221;錛?/p>
鎵鎶ュ憡鍐呭姣棤鎰忎箟錛?/p>
鍦ㄦ姤鍛婁腑鐢ㄦ埛娌℃湁鎻愪緵瓚沖鐨勪俊鎭紱
鍦ㄦ姤鍛婁腑鎻愪緵浜?em>閿欒淇℃伅錛?/p>
鎵鎶ュ憡鐨勯棶棰樻槸鐢變簬鐢ㄦ埛鐨勮繃澶辮屼駭鐢熺殑錛?/p>
鎵鎶ュ憡鐨勯棶棰樻槸鐢變簬鍏朵粬紼嬪簭鐨勯敊璇屼駭鐢熺殑錛?/p>
鎵鎶ュ憡鐨勯棶棰樻槸鐢變簬緗戠粶閿欒鑰屼駭鐢熺殑錛?/p>
榪欎究鏄負浠涔?#8220;鎶鏈敮鎸?#8221;琚涓烘槸涓浠跺彲鎬曠殑宸ヤ綔錛屽洜涓烘湁鎷欏姡鐨刡ug鎶ュ憡闇瑕佸鐞嗐傜劧鑰屽茍涓嶆槸鎵鏈夌殑bug鎶ュ憡閮戒護浜虹敓鍘岋細鎴戝湪涓氫綑鏃墮棿緇存姢鑷敱杞歡錛屾湁鏃舵垜浼氭敹鍒伴潪甯告竻鏅般佹湁甯姪騫朵笖“鏈夊唴瀹?#8221;鐨刡ug鎶ュ憡銆?/p>
鍦ㄨ繖閲屾垜浼氬敖鍔涢槓鏄庡浣曞啓涓涓ソ鐨刡ug鎶ュ憡銆傛垜闈炲父甯屾湜姣忎竴涓漢鍦ㄦ姤鍛奲ug涔嬪墠閮借涓涓嬭繖綃囩煭鏂囷紝褰撶劧鎴戜篃甯屾湜鐢ㄦ埛鍦ㄧ粰鎴?/em>鎶ュ憡bug涔嬪墠宸茬粡璇昏繃榪欑瘒鏂囩珷銆?/p>
綆鍗曞湴璇達紝鎶ュ憡bug鐨勭洰鐨勬槸涓轟簡璁╃▼搴忓憳鐪嬪埌紼嬪簭鐨勯敊璇傛?zhèn)ㄥ彲浠ヤ翰鑷C鴻寖錛屼篃鍙互緇欏嚭鑳藉鑷寸▼搴忓嚭閿欑殑銆佽灝界殑鎿嶄綔姝ラ銆傚鏋滅▼搴忓嚭閿欎簡錛岀▼搴忓憳浼氭敹闆嗛澶栫殑淇℃伅鐩村埌鎵懼埌閿欒鐨勫師鍥狅紱濡傛灉紼嬪簭娌℃湁鍑洪敊錛岄偅涔堜粬浠細璇鋒偍緇х畫鍏蟲敞榪欎釜闂錛屾敹闆嗙浉鍏崇殑淇℃伅銆?/p>
鍦╞ug鎶ュ憡閲岋紝瑕佽娉曟悶娓呬粈涔堟槸浜嬪疄錛堜緥濡傦細“鎴戝湪鐢?shù)鑴戞?#8221;鍜?#8220;XX鍑虹幇浜?#8221;錛変粈涔堟槸鎺ㄦ祴錛堜緥濡傦細“鎴?em>鎯?/em>闂鍙兘鏄嚭鍦?#8230;…”錛夈傚鏋滄効鎰忕殑璇濓紝鎮(zhèn)ㄥ彲浠ョ渷鍘繪帹嫻嬶紝浣嗘槸鍗冧竾鍒渷鐣ヤ簨瀹炪?/p>
褰撴?zhèn)ㄦ姤鍛奲ug鐨勬椂鍊欙紙鏃㈢劧鎮(zhèn)ㄥ凡緇忚繖涔堝仛浜嗭級錛屼竴瀹氭槸甯屾湜bug寰楀埌鍙婃椂淇銆傛墍浠ユ鏃墮拡瀵圭▼搴忓憳鐨勪換浣曡繃嬋鎴栦旱娓庣殑璦璇紙鐢氳嚦璋╅獋錛夐兘鏄笌浜嬫棤琛ョ殑鈥斺斿洜涓鴻繖鍙兘鏄▼搴忓憳鐨勯敊璇紝涔熸湁鍙兘鏄?zhèn)ㄧ殑閿欒锛屼篃璁告?zhèn)ㄦ湁鏉冨浠栦滑鍙戠伀錛屼絾鏄鏋滄?zhèn)ㄨ兘澶氭彁渚涗竴浜涙湁鐢ㄧ殑淇℃伅錛堣屼笉鏄縺鎰や箣璇嶏級鎴栬bug浼氳鏇村揩鐨勪慨姝c傞櫎姝や互澶栵紝璇瘋浣忥細濡傛灉鏄厤璐硅蔣浠訛紝浣滆呮彁渚涚粰鎴戜滑宸茬粡鏄嚭浜庡ソ蹇冿紝鎵浠ヨ鏄お澶氱殑浜哄浠栦滑鏃犵ぜ錛屼粬浠彲鑳藉氨瑕?#8220;鏀惰搗”榪欎喚濂藉績浜嗐?/p>
紼嬪簭鍛樹笉鏄急鏅猴細濡傛灉紼嬪簭涓鐐歸兘涓嶅ソ鐢紝浠栦滑涓嶅彲鑳戒笉鐭ラ亾銆備粬浠笉鐭ラ亾涓瀹氭槸鍥犱負紼嬪簭鍦ㄤ粬浠湅鏉ュ伐浣滃緱寰堟甯搞傛墍浠ワ紝鎴栬呮槸鎮(zhèn)ㄤ綔榪囦竴浜涗笌浠栦滑涓嶅悓鐨勬搷浣滐紝鎴栬呮槸鎮(zhèn)ㄧ殑鐜涓庝粬浠笉鍚屻備粬浠渶瑕佷俊鎭紝鎶ュ憡bug涔熸槸涓轟簡鎻愪緵淇℃伅銆備俊鎭繪槸瓚婂瓚婂ソ銆?/p>
璁稿紼嬪簭錛岀壒鍒槸鑷敱杞歡錛屼細鍏竷涓涓?#8220;宸茬煡bug鍒楄〃”銆傚鏋滄?zhèn)ㄦ墤謭扮殑bug鍦ㄥ垪琛ㄩ噷宸茬粡鏈変簡錛岄偅灝變笉蹇呭啀鎶ュ憡浜嗭紝浣嗘槸濡傛灉鎮(zhèn)ㄨ涓鴻嚜宸辨帉鎻$殑淇℃伅姣斿垪琛ㄤ腑鐨勪赴瀵岋紝閭f棤璁哄浣曚篃瑕佷笌紼嬪簭鍛樿仈緋匯傛?zhèn)ㄦ彁渚涚殑淇℃伅鍙兘浼氫娇浠栦滑鏇唇巰鍗曞湴淇bug銆?/p>
鏈枃涓彁鍒扮殑閮芥槸涓浜涙寚瀵兼柟閽堬紝娌℃湁鍝竴鏉℃槸蹇呴』鎭畧鐨勫噯鍒欍備笉鍚岀殑紼嬪簭鍛樹細鍠滄涓嶅悓褰㈠紡鐨刡ug鎶ュ憡銆傚鏋滅▼搴忛檮甯︿簡涓濂楁姤鍛奲ug鐨勫噯鍒欙紝涓瀹氳璇匯傚鏋滃畠涓庢湰鏂囦腑鎻愬埌鐨勮鍒欑浉鎶佃Е錛岄偅涔堣浠ュ畠涓哄噯銆?/p>
濡傛灉鎮(zhèn)ㄤ笉鏄姤鍛奲ug錛岃屾槸瀵繪眰甯姪錛屾?zhèn)ㄥ簲璇ヨ鏄庢?zhèn)ㄦ浘緇忓埌鍝噷鎵捐繃絳旀錛岋紙渚嬪錛氭垜鐪嬩簡絎洓绔犲拰絎簲绔犵殑絎簩鑺傦紝浣嗘垜鎵句笉鍒拌В鍐崇殑鍔炴硶銆傦級榪欎細浣跨▼搴忓憳浜嗚В鐢ㄦ埛鍠滄鍒板摢閲屽幓鎵劇瓟妗堬紝浠庤屼嬌紼嬪簭鍛樻妸甯姪鏂囨。鍋氬緱鏇村鏄撲嬌鐢ㄣ?/p>
鎶ュ憡bug鐨勬渶濂界殑鏂規(guī)硶涔嬩竴鏄?#8220;婕旂ず”緇欑▼搴忓憳鐪嬨傝紼嬪簭鍛樼珯鍦ㄧ數(shù)鑴戝墠錛岃繍琛屼粬浠殑紼嬪簭錛屾寚鍑虹▼搴忕殑閿欒銆傝浠栦滑鐪嬬潃鎮(zhèn)ㄥ惎鍔ㄧ數(shù)鑴戙佽繍琛岀▼搴忋佸浣曡繘琛屾搷浣滀互鍙婄▼搴忓鎮(zhèn)ㄧ殑杈撳叆鏈変綍鍙嶅簲銆?/p>
浠栦滑瀵硅嚜宸卞啓鐨勮蔣浠朵簡濡傛寚鎺岋紝浠栦滑鐭ラ亾鍝簺鍦版柟涓嶄細鍑洪棶棰橈紝鑰屽摢浜涘湴鏂規(guī)渶鍙兘鍑洪棶棰樸備粬浠湰鑳藉湴鐭ラ亾搴旇娉ㄦ剰浠涔堛傚湪紼嬪簭鐪熺殑鍑洪敊涔嬪墠錛屼粬浠彲鑳藉凡緇忔敞鎰忓埌鏌愪簺鍦版柟涓嶅鍔詫紝榪欎簺閮戒細緇欎粬浠竴浜涚嚎绱€備粬浠細瑙傚療紼嬪簭嫻嬭瘯涓殑姣忎竴涓?em>緇嗚妭“紼嬪簭涓嶅ソ鐢?#8221;
“婕旂ず緇欐垜鐪?#8221;
榪欎簺鍙兘榪樹笉澶熴備篃璁鎬粬浠寰楄繕闇瑕佹洿澶氱殑淇℃伅錛屼細璇鋒偍閲嶅鍒氭墠鐨勬搷浣溿備粬浠彲鑳藉湪榪欐湡闂撮渶瑕佷笌鎮(zhèn)ㄤ氦嫻佷竴涓嬶紝浠ヤ究鍦ㄤ粬浠渶瑕佺殑鏃跺欒bug閲嶆柊鍑虹幇銆備粬浠彲鑳戒細鏀瑰彉涓浜涙搷浣滐紝鐪嬬湅榪欎釜閿欒鐨勪駭鐢熸槸涓埆闂榪樻槸鐩稿叧鐨勪竴綾婚棶棰樸傚鏋滄?zhèn)ㄤ笉璧皹q愶紝浠栦滑鍙兘闇瑕佸潗涓嬫潵錛屾嬁鍑轟竴鍫嗗紑鍙戝伐鍏鳳紝鑺變笂鍑犱釜灝忔椂鏉?em>濂藉ソ鍦?/em>鐮旂┒涓涓嬨備絾鏄渶閲嶈鐨勬槸鍦ㄧ▼搴忓嚭閿欑殑鏃跺欒紼嬪簭鍛樺湪鐢?shù)鑴戞梺銆備竴鏃︿粬浠湅鍒頒簡闂錛屼粬浠氬父浼氭壘鍒板師鍥犲茍寮濮嬭瘯鐫淇敼銆?/p>
濡備粖鏄綉緇滄椂浠o紝鏄俊鎭氦嫻佺殑鏃朵唬銆傛垜鍙互鐐逛竴涓嬮紶鏍囨妸鑷繁鐨勭▼搴忛佸埌淇勭綏鏂殑鏌愪釜鏈嬪弸閭i噷錛屽綋鐒朵粬涔熷彲浠ョ敤鍚屾牱綆鍗曠殑鏂規(guī)硶緇欐垜涓浜涘緩璁備絾鏄鏋滄垜鐨勭▼搴忓嚭浜嗕粈涔堥棶棰橈紝鎴?em>涓嶅彲鑳?/em>鍦ㄤ粬鏃佽竟銆?#8220;婕旂ず”鏄緢濂界殑鍔炴硶錛屼絾鏄父甯稿仛涓嶅埌銆?/p>
濡傛灉鎮(zhèn)ㄥ繀欏繪姤鍛奲ug錛岃屾鏃剁▼搴忓憳鍙堜笉鍦ㄦ?zhèn)w竟錛岄偅涔堟?zhèn)p鎯沖姙娉曡bug閲嶇幇鍦ㄤ粬浠潰鍓嶃傚綋浠栦滑浜茬溂鐪嬪埌閿欒鏃訛紝灝辮兘澶熻繘琛屽鐞嗕簡銆?/p>
紜垏鍦板憡璇夌▼搴忓憳鎮(zhèn)ㄥ仛浜嗕簺浠涔堛傚鏋滄槸涓涓浘褰㈢晫闈㈢▼搴忥紝鍛婅瘔浠栦滑鎮(zhèn)ㄦ寜浜嗗摢涓寜閽紝渚濈収浠涔堥『搴忔寜鐨勩傚鏋滄槸涓涓懡浠よ紼嬪簭錛岀簿紜殑鍛婅瘔浠栦滑鎮(zhèn)ㄩ敭鍏ヤ簡浠涔堝懡浠ゃ傛?zhèn)ㄥ簲璇鍙兘璇l嗗湴鎻愪緵鎮(zhèn)ㄦ墍閿叆鐨勫懡浠ゅ拰紼嬪簭鐨勫弽搴斻?/p>
鎶婃?zhèn)ㄨ兘鎯冲埌鐨勬墍鏈夌殑杈撳叆鏂瑰紡閮藉憡璇夌▼搴忓憳錛屽鏋滅▼搴忚璇誨彇涓涓枃浠訛紝鎮(zhèn)ㄥ彲鑳介渶瑕佸彂涓涓枃浠剁殑鎷瘋礉緇欎粬浠傚鏋滅▼搴忛渶瑕侀氳繃緗戠粶涓庡彟涓鍙扮數(shù)鑴戦氳錛屾?zhèn)ㄦ垨璁镐笉鑳芥妸閭e彴鐢?shù)鑴戝鍒惰繃鍘伙紝浣嗚嚦灝戝彲浠ヨ涓涓嬬數(shù)鑴戠殑綾誨瀷鍜屽畨瑁呬簡鍝簺杞歡錛堝鏋滃彲浠ョ殑璇濓級銆?/p>
濡傛灉鎮(zhèn)ㄧ粰浜嗙▼搴忓憳涓闀夸覆杈撳叆鍜屾寚浠わ紝浠栦滑鎵ц浠ュ悗娌℃湁鍑虹幇閿欒錛岄偅鏄洜涓烘?zhèn)ㄦ病鏈壘l欎粬浠凍澶熺殑淇℃伅錛屽彲鑳介敊璇笉鏄湪姣忓彴璁$畻鏈轟笂閮藉嚭鐜幫紝鎮(zhèn)ㄧ殑緋葷粺鍙兘鍜屼粬浠殑鍦ㄦ煇浜涘湴鏂逛笉涓鏍楓傛湁鏃跺欑▼搴忕殑琛屼負鍙兘鍜屾?zhèn)ㄩ鎯崇殑涓嶄竴鏍鳳紝榪欎篃璁告槸璇細錛屼絾鏄?zhèn)ㄤ細璁や负绋嬪簭鍑洪敊浜嗗Q岀▼搴忓憳鍗磋涓鴻繖鏄鐨勩?/p>
鍚屾牱涔熻鎻忚堪鍙戠敓浜嗕粈涔堛傜簿紜殑鎻忚堪鎮(zhèn)ㄧ湅鍒頒簡浠涔堛傚憡璇変粬浠負浠涔堟?zhèn)ㄨ寰楄嚜宸辨墍鐪嬪埌鐨勬槸閿欒鐨勶紝鏈濂藉啀鍛婅瘔浠栦滑錛屾?zhèn)ㄨ湄撹嚜宸卞簲璇ョ湅鍒颁粈涔堛傚鏋滄?zhèn)ㄥ彧鏄_細“紼嬪簭鍑洪敊浜?#8221;錛岄偅鎮(zhèn)ㄥ緢鍙兘婕忔帀浜嗛潪甯擱噸瑕佺殑淇℃伅銆?/p>
濡傛灉鎮(zhèn)ㄧ湅鍒頒簡閿欒娑堟伅錛屼竴瀹氳浠旂粏銆佸噯紜殑鍛婅瘔紼嬪簭鍛橈紝榪?em>紜疄寰堥噸瑕併傚湪榪欑鎯呭喌涓嬶紝紼嬪簭鍛樺彧瑕佷慨姝i敊璇紝鑰屼笉鐢ㄥ幓鎵鵑敊璇備粬浠渶瑕佺煡閬撴槸浠涔堝嚭闂浜嗭紝緋葷粺鎵鎶ョ殑閿欒娑堟伅姝eソ甯姪浜嗕粬浠傚鏋滄?zhèn)ㄦ病鏈夋洿濂界殑鏂规硶璁颁綇杩欎簺娑堟伅锛尀鎶婂畠浠啓涓嬫潵銆傚彧鎶ュ憡“紼嬪簭鍑轟簡涓涓敊”鏄鏃犳剰涔夌殑錛岄櫎闈炴?zhèn)ㄦ妸閿欒娑堟伅涓鍧楁姤涓婃潵銆?/p>
鐗規(guī)畩鎯呭喌涓嬶紝濡傛灉鏈夐敊璇秷鎭彿錛?em>涓瀹?/em>瑕佹妸榪欎簺鍙風爜鍛婅瘔紼嬪簭鍛樸備笉瑕佷互涓烘?zhèn)ㄧ湅涓嶅囖Z換浣曟剰涔夛紝瀹冨氨娌℃湁鎰忎箟銆傞敊璇秷鎭彿鍖呭惈浜嗚兘琚▼搴忓憳璇繪噦鐨勫悇縐嶄俊鎭紝騫朵笖寰堟湁鍙兘鍖呭惈閲嶈鐨勭嚎绱€傜粰閿欒娑堟伅緙栧彿鏄洜涓虹敤璇█鎻忚堪璁$畻鏈洪敊璇父甯鎬護浜鴻垂瑙c傜敤榪欑鏂瑰紡鍛婅瘔鎮(zhèn)ㄩ敊璇殑鎵鍦ㄦ槸涓涓渶濂界殑鍔炴硶銆?/p>
鍦ㄨ繖縐嶆儏褰笅錛岀▼搴忓憳鐨勬帓閿欏伐浣滀細鍗佸垎楂樻晥銆備粬浠笉鐭ラ亾鍙戠敓浜嗕粈涔堬紝涔熶笉鍙兘鍒扮幇鍦哄幓瑙傚療錛屾墍浠ヤ粬浠竴鐩村湪鎼滃鏈変環(huán)鍊肩殑綰跨儲銆傞敊璇秷鎭侀敊璇秷鎭彿浠ュ強涓浜涜帿鍚嶅叾濡欑殑寤惰繜錛岄兘鏄緢閲嶈鐨勭嚎绱紝灝卞儚鍔炴鏃剁殑鎸囩汗涓鏍烽噸瑕侊紝淇濆瓨濂姐?/p>
濡傛灉鎮(zhèn)ㄤ嬌鐢║NIX緋葷粺錛岀▼搴忓彲鑳戒細浜х敓涓涓唴鏍歌緭鍑猴紙coredump錛夈傚唴鏍歌緭鍑烘槸鐗瑰埆鏈夌敤鐨勭嚎绱㈡潵婧愶紝鍒墧浜嗗畠浠傚彟涓鏂歸潰錛屽ぇ澶氭暟紼嬪簭鍛樹笉鍠滄鏀跺埌鍚湁澶ч噺鍐呮牳杈撳嚭鏂囦歡鐨凟MAIL錛屾墍浠ュ湪鍙戦偖浠朵箣鍓嶆渶濂藉厛闂竴涓嬨傝繕鏈変竴鐐硅娉ㄦ剰錛氬唴鏍歌緭鍑烘枃浠惰褰曚簡瀹屾暣鐨勭▼搴忕姸鎬侊紝涔熷氨鏄浠諱綍縐樺瘑錛堝彲鑳藉綋鏃剁▼搴忔鍦ㄥ鐞嗕竴浜涚浜轟俊鎭垨縐樺瘑鏁版嵁錛夐兘鍙兘鍖呭惈鍦ㄥ唴鏍歌緭鍑烘枃浠墮噷銆?/p>
褰撲竴涓敊璇垨bug鍙戠敓鐨勬椂鍊欙紝鎮(zhèn)ㄥ彲鑳戒細鍋氳澶氫簨鎯呫備絾鏄ぇ澶氭暟浜轟細浣夸簨鎯呭彉鐨勬洿緋熴傛垜鐨勪竴涓湅鍙嬪湪瀛︽牎閲岃鍒犱簡濂規(guī)墍鏈夌殑Word鏂囦歡錛屽湪鎵句漢甯繖涔嬪墠濂歸噸瑁呬簡Word錛屽張榪愯浜嗕竴閬嶇鐗囨暣鐞嗙▼搴忥紝榪欎簺鎿嶄綔瀵逛簬鎭㈠鏂囦歡鏄鏃犵泭澶勭殑錛屽洜涓鴻繖浜涙搷浣滄悶涔變簡紓佺洏鐨勬枃浠跺尯鍧椼傛亹鎬曞湪榪欎釜涓栫晫涓婃病鏈変竴縐嶅弽鍒犻櫎杞歡鑳芥仮澶嶅ス鐨勬枃浠朵簡銆傚鏋滃ス涓嶅仛浠諱綍鎿嶄綔錛屾垨璁歌繕鏈変竴綰垮笇鏈涖?/p>
榪欑鐢ㄦ埛浠夸經(jīng)涓鍙閫煎埌澧欒鐨勯棘錛堥粍榧犵嫾銆佺傳璨備竴綾葷殑鍔ㄧ墿鈥斺旇瘧鑰呮敞錛夛細鑳岄潬澧欏錛岄潰瀵規(guī)浜$殑闄嶄復濂嬭搗鍙嶆墤錛岀柉鐙傛敾鍑匯備粬浠涓哄仛鐐逛粈涔堟繪瘮浠涔堥兘涓嶅仛寮恒傜劧鑰岃繖浜涘湪澶勭悊璁$畻鏈鴻蔣浠墮棶棰樻椂騫朵笉閫傜敤銆?/p>
涓嶈鍋氶棘錛屽仛涓鍙練緹娿傚綋涓鍙練緹婇潰瀵規(guī)枡鎯充笉鍒扮殑鎯呭喌鎴栧彈鍒版儕鍚撴椂錛屽畠浼氫竴鍔ㄤ笉鍔紝鏄負浜嗕笉鍚稿紩浠諱綍娉ㄦ剰錛屼笌姝ゅ悓鏃朵篃鍦ㄦ濊冭В鍐抽棶棰樼殑鏈濂藉姙娉曪紙濡傛灉緹氱緤鏈変竴鏉℃妧鏈敮鎸佺儹綰匡紝姝ゆ椂鍗犵嚎銆傦級銆傜劧鍚庯紝涓鏃﹀畠鎵懼埌浜嗘渶瀹夊叏鐨勮鍔ㄦ柟妗堬紝瀹冧究鍘誨仛銆?/p>
褰撶▼搴忓嚭姣涚梾鐨勬椂鍊欙紝绔嬪埢鍋滄姝e湪鍋氱殑浠諱綍鎿嶄綔銆備笉瑕佹寜浠諱綍鍋ャ備粩緇嗗湴鐪嬩竴涓嬪睆騫曪紝娉ㄦ剰閭d簺涓嶆甯哥殑鍦版柟錛岃浣忓畠鎴栬呭啓涓嬫潵銆傜劧鍚庢厧閲嶅湴鐐瑰嚮“紜畾” 鎴?#8220;鍙栨秷”錛岄夋嫨涓涓渶瀹夊叏鐨勩傚鐫鍏繪垚涓縐嶆潯浠跺弽灝勨斺斾竴鏃︾數(shù)鑴戝嚭浜嗛棶棰橈紝鍏堜笉瑕佸姩銆傝鎯蟲憜鑴辮繖涓棶棰橈紝鍏蟲帀鍙楀獎鍝嶇殑紼嬪簭鎴栬呴噸鏂板惎鍔ㄨ綆楁満閮戒笉濂斤紝涓涓В鍐抽棶棰樼殑濂藉姙娉曟槸璁╅棶棰樺啀嬈′駭鐢熴傜▼搴忓憳浠枩嬈㈠彲浠ヨ閲嶇幇鐨勯棶棰橈紝蹇箰鐨勭▼搴忓憳鍙互鏇村揩鑰屼笖鏇存湁鏁堢巼鐨勪慨澶峛ug銆?/p>
騫朵笉鍙槸闈炰笓涓氱殑鐢ㄦ埛鎵嶄細鍐欏嚭鎷欏姡鐨刡ug鎶ュ憡錛屾垜瑙佽繃涓浜涢潪甯稿樊鐨刡ug鎶ュ憡鍑鴻嚜紼嬪簭鍛樹箣鎵嬶紝鏈変簺榪樻槸闈炲父浼樼鐨勭▼搴忓憳銆?/p>
鏈変竴嬈℃垜涓庡彟涓涓▼搴忓憳涓璧峰伐浣滐紝浠栦竴鐩村湪鎵句唬鐮佷腑鐨刡ug錛屼粬甯稿父閬囧埌涓涓猙ug錛屼絾鏄笉浼氳В鍐籌紝浜庢槸灝卞彨鎴戝府蹇欍?#8220;鍑轟粈涔堟瘺鐥呬簡錛?#8221;鎴戦棶銆傝屼粬鐨勫洖絳斿嵈鎬繪槸涓浜涘叧浜巄ug鐨勬剰瑙併傚鏋滀粬鐨勮鐐規(guī)紜紝閭g殑紜槸涓浠跺ソ浜嬨傝繖鎰忓懗鐫浠栧凡緇忓畬鎴愪簡宸ヤ綔鐨勪竴鍗婏紝騫朵笖鎴戜滑鍙互涓璧峰畬鎴愬彟涓鍗婂伐浣溿傝繖鏄湁鏁堢巼騫舵湁鐢ㄧ殑銆?/p>
浣嗕簨瀹炰笂浠栧父甯告槸閿欑殑銆傝繖灝變細浣挎垜浠姳涓婂崐涓皬鏃跺湪鍘熸湰姝g‘鐨勪唬鐮侀噷鏉ュ洖瀵繪壘閿欒錛岃屽疄闄呬笂闂鍑哄湪鍒殑鍦版柟銆傛垜鏁㈣偗瀹氫粬涓嶄細瀵瑰尰鐢熻繖涔堝仛銆?#8220;澶уか錛屾垜寰椾簡Hydroyoyodyne錛堢湡鏄梾鈥斺旇瘧鑰咃級錛岀粰鎴戝紑涓柟瀛?#8221;錛屼漢浠煡閬撲笉璇ュ涓浣嶅尰鐢熻榪欎簺銆傛?zhèn)ㄦ弿杩颁竴涓嬬棁鐘訛紝鍝釜鍦版柟涓嶈垝鏈嶏紝鍝噷鐤箋佽搗鐨柟銆佸彂鐑?#8230;…璁╁尰鐢熻瘖鏂?zhèn)ㄥ緱浜嗕粈涔堢梾錛屽簲璇ユ庢牱娌葷枟銆傚惁鍒欏尰鐢熶細鎶婃?zhèn)ㄥ綋鍋氱枒蹇冪梾鎴柧_劇鐥呮?zhèn)h呮墦鍙戜簡錛岃繖浼間箮娌′粈涔堜笉瀵廣?/p>
鍋氱▼搴忓憳涔熸槸涓鏍楓傚嵆渚挎?zhèn)ㄨ嚜宸辩?#8220;璇婃柇”鏈夋椂鐪熺殑鏈夊府鍔╋紝涔熻鍙“鐥囩姸”銆?#8220;璇婃柇”鏄彲璇村彲涓嶈鐨勶紝浣嗘槸“鐥囩姸”涓瀹氳璇淬傚悓鏍鳳紝鍦╞ug鎶ュ憡閲岄潰闄勪笂涓浠介拡瀵筨ug鑰屽仛鍑轟慨鏀圭殑婧愪唬鐮佹槸鏈夌敤澶勭殑錛屼絾瀹冨茍涓嶈兘鏇夸唬bug鎶ュ憡鏈韓銆?/p>
濡傛灉紼嬪簭鍛樺悜鎮(zhèn)ㄨ闂澶栫殑淇℃伅錛屽崈涓囧埆搴斾粯銆傛浘緇忔湁涓涓漢鍚戞垜鎶ュ憡bug錛屾垜璁╀粬璇曚竴涓懡浠わ紝鎴戠煡閬撹繖涓懡浠や笉濂界敤錛屼絾鎴戞槸瑕佺湅鐪嬬▼搴忎細榪斿洖涓涓粈涔堥敊璇紙榪欐槸寰堥噸瑕佺殑綰跨儲錛夈備絾鏄繖浣嶈佸厔鏍規(guī)湰灝辨病璇曪紝浠栧湪鍥炲涓“閭h偗瀹氫笉濂界敤”錛屼簬鏄垜鍙堣姳浜嗗ソ浜涙椂闂存墠璇存湇浠栬瘯浜嗕竴涓嬮偅涓懡浠ゃ?/p>
鐢ㄦ埛澶氬姩鍔ㄨ剳絳嬪紼嬪簭鍛樼殑宸ヤ綔鏄湁甯姪鐨勩傚嵆浣挎?zhèn)ㄧ殑鎺ㄦ柇鏄敊璇殑锛尳E嬪簭鍛樹篃搴旇鎰熻阿鎮(zhèn)紝鑷沖皯鎮(zhèn)?em>鎯?/em>鍘誨府鍔╀粬浠紝浣夸粬浠殑宸ヤ綔鍙樼殑鏇寸畝鍗曘備笉榪囧崈涓囧埆蹇樹簡鎶ュ憡“鐥囩姸”錛屽惁鍒欏彧浼氫嬌浜嬫儏鍙樺緱鏇寸碂銆?/p>
“闂存瓏鎬ч敊璇?#8221;鐫瀹炶紼嬪簭鍛樺彂鎰併傜浉姣斾箣涓嬶紝榪涜涓緋誨垪綆鍗曠殑鎿嶄綔渚胯兘瀵艱嚧閿欒鍙戠敓鐨勯棶棰樻槸綆鍗曠殑銆傜▼搴忓憳鍙互鍦ㄤ竴涓究浜庤瀵熺殑鏉′歡涓嬮噸澶嶉偅浜涙搷浣滐紝瑙傚療姣忎竴涓粏鑺傘傚お澶氱殑闂鍦ㄨ繖縐嶆儏鍐典笅涓嶈兘瑙e喅錛屼緥濡傦細紼嬪簭姣忔槦鏈熷嚭涓嬈¢敊錛屾垨鑰呭伓鐒跺嚭涓嬈¢敊錛屾垨鑰呭湪紼嬪簭鍛橀潰鍓嶄粠涓嶅嚭閿欙紙紼嬪簭鍛樹竴紱誨紑灝卞嚭閿欍傗斺旇瘧鑰咃級銆傚綋鐒惰繕鏈夊氨鏄▼搴忕殑鎴鏃ユ湡鍒頒簡錛岄偅鑲畾瑕佸嚭閿欍?/p>
澶у鏁?#8220;闂存瓏鎬ч敊璇?#8221;騫朵笉鏄湡姝g殑“闂存瓏”銆傚叾涓殑澶у鏁伴敊璇笌鏌愪簺鍦版柟鏄湁鑱旂郴鐨勩傛湁涓浜涢敊璇彲鑳芥槸鍐呭瓨娉勬紡浜х敓鐨勶紝鏈変竴浜涘彲鑳芥槸鍒殑紼嬪簭鍦ㄤ笉鎭板綋鐨勬椂鍊欎慨鏀規(guī)煇涓噸瑕佹枃浠墮犳垚鐨勶紝榪樻湁涓浜涘彲鑳藉彂鐢熷湪姣忎竴涓皬鏃剁殑鍓嶅崐涓皬鏃朵腑錛堟垜紜疄閬囧埌榪囪繖縐嶄簨鎯咃級銆?/p>
鍚屾牱錛屽鏋滄?zhèn)ㄨ兘鋴蒪ug閲嶇幇錛岃岀▼搴忓憳涓嶈兘錛岄偅寰堟湁鍙兘鏄粬浠殑璁$畻鏈哄拰鎮(zhèn)ㄧ殑璁$畻鏈哄湪鏌愪簺鍦版柟鏄笉鍚岀殑錛岃繖縐嶄笉鍚屽紩璧蜂簡闂銆傛垜鏇懼啓榪囦竴涓▼搴忥紝瀹冪殑紿楀彛鍙互铚風緝鎴愪竴涓皬鐞冨憜鍦ㄥ睆騫曠殑宸︿笂瑙掞紝瀹冨湪鍒殑璁$畻鏈轟笂鍙兘鍦?800x600 鐨勮В鏋愬害宸ヤ綔錛屼絾鏄湪鎴戠殑鏈哄櫒涓婂嵈鍙互鍦?1024x768 涓嬪伐浣溿?/p>
紼嬪簭鍛樻兂瑕佷簡瑙d換浣曚笌鎮(zhèn)ㄥ彂鐜扮殑闂鐩稿叧鐨勪簨鎯呫傛湁鍙兘鐨勮瘽鎮(zhèn)ㄥ埌鍙︿竴鍙版満鍣ㄤ笂璇曡瘯錛屽璇曞嚑嬈★紝涓ゆ錛屼笁嬈★紝鐪嬬湅闂鏄笉鏄粡甯稿彂鐢熴傚鏋滈棶棰樺嚭鐜板湪鎮(zhèn)ㄨ繘琛屼簡涓緋誨垪鎿嶄綔涔嬪悗錛屼笉鏄?zhèn)ㄦ儗櫘╁畠鍑虹幇瀹優(yōu)兗氬嚭鐜板Q岃繖灝辨湁鍙兘鏄暱鏃墮棿鐨勮繍琛屾垨澶勭悊澶ф枃浠舵墍瀵艱嚧鐨勯敊璇傜▼搴忓穿婧冪殑鏃跺欙紝鎮(zhèn)ㄨ灝藉彲鑳界殑璁頒綇鎮(zhèn)ㄩ兘鍋氫簡浜涗粈涔堬紝騫朵笖濡傛灉鎮(zhèn)ㄧ湅鍒頒換浣曞浘褰?涔熷埆蹇樹簡鎻愪竴涓嬨傛?zhèn)ㄦ彁渚涚殑鋼Q浣曚簨鎯呴兘鏄湁甯姪鐨勩傚嵆浣垮彧鏄鎷х殑鎻忚堪錛堜緥濡傦細褰撳悗鍙版湁EMACS榪愯鏃訛紝紼嬪簭甯稿父鍑洪敊錛夛紝榪欒櫧鐒朵笉鑳芥彁渚涘鑷撮棶棰樼殑鐩存帴綰跨儲錛屼絾鏄彲鑳藉府鍔╃▼搴忓憳閲嶇幇闂銆?/p>
鏈閲嶈鐨勬槸錛氱▼搴忓憳鎯寵紜畾浠栦滑姝e湪澶勭悊鐨勬槸涓涓湡姝g殑“闂存瓏鎬ч敊璇?#8221;鍛紝榪樻槸涓涓湪鍙︿竴綾葷壒瀹氱殑璁$畻鏈轟笂鎵嶅嚭鐜扮殑閿欒銆備粬浠兂鐭ラ亾鏈夊叧鎮(zhèn)ㄨ綆楁満鐨勮澶氱粏鑺傦紝浠ヤ究浜嗚В鎮(zhèn)ㄧ殑鏈哄櫒涓庝粬浠殑鏈変粈涔堜笉鍚屻傛湁璁稿緇嗚妭閮戒緷浠楃壒瀹氱殑紼嬪簭錛屼絾鏄湁涓浠朵笢瑗挎?zhèn)ㄤ竴瀹氳鎻愪緵鈥斺旂増鏈彿銆傜▼搴忕殑鐗堟湰銆佹搷浣滅郴緇熺殑鐗堟湰浠ュ強涓庨棶棰樻湁鍏崇殑紼嬪簭鐨勭増鏈?/p>
琛ㄦ剰娓呮鍦ㄤ竴浠絙ug鎶ュ憡閲屾槸鏈鍩烘湰鐨勮姹傘傚鏋滅▼搴忓憳涓嶇煡閬撴?zhèn)ㄨ鐨勬槸浠涔堟剰鎬濓紝閭f?zhèn)p窡娌¤涓鏍楓傛垜鏀跺埌鐨刡ug鎶ュ憡鏉ヨ嚜涓栫晫鍚勫湴錛屾湁璁稿鏄潵鑷潪鑻辮鍥藉錛屼粬浠氬父涓鴻嚜宸辯殑鑻辨枃涓嶅ソ鑰岃〃紺烘瓑鎰忋傛葷殑鏉ヨ錛岃繖浜涚敤鎴峰彂鏉ョ殑bug鎶ュ憡閫氬父鏄竻鏅拌屼笖鏈夌敤鐨勩傚嚑涔庢墍鏈変笉娓呮櫚鐨刡ug鎶ュ憡閮芥槸鏉ヨ嚜姣嶈鏄嫳璇殑浜猴紝浠栦滑鎬繪槸浠ヤ負鍙鑷繁闅忎究璇磋錛岀▼搴忓憳灝辮兘鏄庣櫧銆?/p>
鍥犱負錛宮akefile鍏崇郴鍒頒簡鏁翠釜宸ョ▼鐨勭紪璇戣鍒欍備竴涓伐紼嬩腑鐨勬簮鏂囦歡涓嶈鏁幫紝鍏舵寜綾誨瀷銆佸姛鑳姐佹ā鍧楀垎鍒斁鍦ㄨ嫢騫蹭釜鐩綍涓紝makefile瀹氫箟浜嗕竴緋誨垪鐨勮鍒欐潵鎸囧畾錛屽摢浜涙枃浠墮渶瑕佸厛緙栬瘧錛屽摢浜涙枃浠墮渶瑕佸悗緙栬瘧錛屽摢浜涙枃浠墮渶瑕侀噸鏂扮紪璇戯紝鐢氳嚦浜庤繘琛屾洿澶嶆潅鐨勫姛鑳芥搷浣滐紝鍥犱負makefile灝卞儚涓涓猄hell鑴氭湰涓鏍鳳紝鍏朵腑涔熷彲浠ユ墽琛屾搷浣滅郴緇熺殑鍛戒護銆?
makefile甯︽潵鐨勫ソ澶勫氨鏄斺?#8220;鑷姩鍖栫紪璇?#8221;錛屼竴鏃﹀啓濂斤紝鍙渶瑕佷竴涓猰ake鍛戒護錛屾暣涓伐紼嬪畬鍏ㄨ嚜鍔ㄧ紪璇戯紝鏋佸ぇ鐨勬彁楂樹簡杞歡寮鍙戠殑鏁堢巼銆俶ake鏄竴涓懡浠ゅ伐鍏鳳紝鏄竴涓В閲妋akefile涓寚浠ょ殑鍛戒護宸ュ叿錛屼竴鑸潵璇達紝澶у鏁扮殑IDE閮芥湁榪欎釜鍛戒護錛屾瘮濡傦細Delphi鐨刴ake錛孷isual C++鐨刵make錛孡inux涓婫NU鐨刴ake銆傚彲瑙侊紝makefile閮芥垚涓轟簡涓縐嶅湪宸ョ▼鏂歸潰鐨勭紪璇戞柟娉曘?
鐜板湪璁茶堪濡備綍鍐檓akefile鐨勬枃绔犳瘮杈冨皯錛岃繖鏄垜鎯沖啓榪欑瘒鏂囩珷鐨勫師鍥犮傚綋鐒訛紝涓嶅悓浜у晢鐨刴ake鍚勪笉鐩稿悓錛屼篃鏈変笉鍚岀殑璇硶錛屼絾鍏舵湰璐ㄩ兘鏄湪“鏂囦歡渚濊禆鎬?#8221;涓婂仛鏂囩珷錛岃繖閲岋紝鎴戜粎瀵笹NU鐨刴ake榪涜璁茶堪錛屾垜鐨勭幆澧冩槸RedHat Linux 8.0錛宮ake鐨勭増鏈槸3.80銆傚繀绔燂紝榪欎釜make鏄簲鐢ㄦ渶涓哄箍娉涚殑錛屼篃鏄敤寰楁渶澶氱殑銆傝屼笖鍏惰繕鏄渶閬靛驚浜嶪EEE 1003.2-1992 鏍囧噯鐨勶紙POSIX.2錛夈?
鍦ㄨ繖綃囨枃妗d腑錛屽皢浠/C++鐨勬簮鐮佷綔涓烘垜浠熀紜錛屾墍浠ュ繀鐒舵秹鍙婁竴浜涘叧浜嶤/C++鐨勭紪璇戠殑鐭ヨ瘑錛岀浉鍏充簬榪欐柟闈㈢殑鍐呭錛岃繕璇峰悇浣嶆煡鐪嬬浉鍏崇殑緙栬瘧鍣ㄧ殑鏂囨。銆傝繖閲屾墍榛樿鐨勭紪璇戝櫒鏄疷NIX涓嬬殑GCC鍜孋C銆?
緙栬瘧鏃訛紝緙栬瘧鍣ㄩ渶瑕佺殑鏄娉曠殑姝g‘錛屽嚱鏁頒笌鍙橀噺鐨勫0鏄庣殑姝g‘銆傚浜庡悗鑰咃紝閫氬父鏄綘闇瑕佸憡璇夌紪璇戝櫒澶存枃浠剁殑鎵鍦ㄤ綅緗紙澶存枃浠朵腑搴旇鍙槸澹版槑錛岃屽畾涔夊簲璇ユ斁鍦–/C++鏂囦歡涓級錛屽彧瑕佹墍鏈夌殑璇硶姝g‘錛岀紪璇戝櫒灝卞彲浠ョ紪璇戝嚭涓棿鐩爣鏂囦歡銆備竴鑸潵璇達紝姣忎釜婧愭枃浠墮兘搴旇瀵瑰簲浜庝竴涓腑闂寸洰鏍囨枃浠訛紙O鏂囦歡鎴栨槸OBJ鏂囦歡錛夈?
閾炬帴鏃訛紝涓昏鏄摼鎺ュ嚱鏁板拰鍏ㄥ眬鍙橀噺錛屾墍浠ワ紝鎴戜滑鍙互浣跨敤榪欎簺涓棿鐩爣鏂囦歡錛圤鏂囦歡鎴栨槸OBJ鏂囦歡錛夋潵閾炬帴鎴戜滑鐨勫簲鐢ㄧ▼搴忋傞摼鎺ュ櫒騫朵笉綆″嚱鏁版墍鍦ㄧ殑婧愭枃浠訛紝鍙鍑芥暟鐨勪腑闂寸洰鏍囨枃浠訛紙Object File錛夛紝鍦ㄥぇ澶氭暟鏃跺欙紝鐢變簬婧愭枃浠跺お澶氾紝緙栬瘧鐢熸垚鐨勪腑闂寸洰鏍囨枃浠跺お澶氾紝鑰屽湪閾炬帴鏃墮渶瑕佹槑鏄懼湴鎸囧嚭涓棿鐩爣鏂囦歡鍚嶏紝榪欏浜庣紪璇戝緢涓嶆柟渚匡紝鎵浠ワ紝鎴戜滑瑕佺粰涓棿鐩爣鏂囦歡鎵撲釜鍖咃紝鍦╓indows涓嬭繖縐嶅寘鍙?#8220;搴撴枃浠?#8221;錛圠ibrary File)錛屼篃灝辨槸 .lib 鏂囦歡錛屽湪UNIX涓嬶紝鏄疉rchive File錛屼篃灝辨槸 .a 鏂囦歡銆?
鎬葷粨涓涓嬶紝婧愭枃浠墮鍏堜細鐢熸垚涓棿鐩爣鏂囦歡錛屽啀鐢變腑闂寸洰鏍囨枃浠剁敓鎴愭墽琛屾枃浠躲傚湪緙栬瘧鏃訛紝緙栬瘧鍣ㄥ彧媯嫻嬬▼搴忚娉曪紝鍜屽嚱鏁般佸彉閲忔槸鍚﹁澹版槑銆傚鏋滃嚱鏁版湭琚0鏄庯紝緙栬瘧鍣ㄤ細緇欏嚭涓涓鍛婏紝浣嗗彲浠ョ敓鎴怬bject File銆傝屽湪閾炬帴紼嬪簭鏃訛紝閾炬帴鍣ㄤ細鍦ㄦ墍鏈夌殑Object File涓壘瀵誨嚱鏁扮殑瀹炵幇錛屽鏋滄壘涓嶅埌錛岄偅鍒板氨浼氭姤閾炬帴閿欒鐮侊紙Linker Error錛夛紝鍦╒C涓嬶紝榪欑閿欒涓鑸槸錛歀ink 2001閿欒錛屾剰鎬濊鏄錛岄摼鎺ュ櫒鏈兘鎵懼埌鍑芥暟鐨勫疄鐜般備綘闇瑕佹寚瀹氬嚱鏁扮殑Object File.
濂斤紝璦褰掓浼狅紝GNU鐨刴ake鏈夎澶氱殑鍐呭錛岄棽璦灝戝彊錛岃繕鏄鎴戜滑寮濮嬪惂銆?
棣栧厛錛屾垜浠敤涓涓ず渚嬫潵璇存槑Makefile鐨勪功鍐欒鍒欍備互渚跨粰澶у涓涓劅鍏磋璇嗐傝繖涓ず渚嬫潵婧愪簬GNU鐨刴ake浣跨敤鎵嬪唽錛屽湪榪欎釜紺轟緥涓紝鎴戜滑鐨勫伐紼嬫湁8涓狢鏂囦歡錛屽拰3涓ご鏂囦歡錛屾垜浠鍐欎竴涓狹akefile鏉ュ憡璇塵ake鍛戒護濡備綍緙栬瘧鍜岄摼鎺ヨ繖鍑犱釜鏂囦歡銆傛垜浠殑瑙勫垯鏄細
鍙鎴戜滑鐨凪akefile鍐欏緱澶熷ソ錛屾墍鏈夌殑榪欎竴鍒囷紝鎴戜滑鍙敤涓涓猰ake鍛戒護灝卞彲浠ュ畬鎴愶紝make鍛戒護浼氳嚜鍔ㄦ櫤鑳藉湴鏍規(guī)嵁褰撳墠鐨勬枃浠朵慨鏀圭殑鎯呭喌鏉ョ‘瀹氬摢浜涙枃浠墮渶瑕侀噸緙栬瘧錛屼粠鑰岃嚜宸辯紪璇戞墍闇瑕佺殑鏂囦歡鍜岄摼鎺ョ洰鏍囩▼搴忋?
prerequisites灝辨槸錛岃鐢熸垚閭d釜target鎵闇瑕佺殑鏂囦歡鎴栨槸鐩爣銆?
command涔熷氨鏄痬ake闇瑕佹墽琛岀殑鍛戒護銆傦紙浠繪剰鐨凷hell鍛戒護錛?
榪欐槸涓涓枃浠剁殑渚濊禆鍏崇郴錛屼篃灝辨槸璇達紝target榪欎竴涓垨澶氫釜鐨勭洰鏍囨枃浠朵緷璧栦簬prerequisites涓殑鏂囦歡錛屽叾鐢熸垚瑙勫垯瀹氫箟鍦╟ommand涓傝鐧戒竴鐐瑰氨鏄錛宲rerequisites涓鏋滄湁涓涓互涓婄殑鏂囦歡姣攖arget鏂囦歡瑕佹柊鐨勮瘽錛宑ommand鎵瀹氫箟鐨勫懡浠ゅ氨浼氳鎵ц銆傝繖灝辨槸Makefile鐨勮鍒欍備篃灝辨槸Makefile涓渶鏍稿績鐨勫唴瀹廣?
璇村埌搴曪紝Makefile鐨勪笢瑗垮氨鏄繖鏍蜂竴鐐癸紝濂藉儚鎴戠殑榪欑瘒鏂囨。涔熻緇撴潫浜嗐傚懙鍛點傝繕涓嶅敖鐒訛紝榪欐槸Makefile鐨勪富綰垮拰鏍稿績錛屼絾瑕佸啓濂戒竴涓狹akefile榪樹笉澶燂紝鎴戜細浠ュ悗闈竴鐐逛竴鐐瑰湴緇撳悎鎴戠殑宸ヤ綔緇忛獙緇欎綘鎱㈡參鍒版潵銆傚唴瀹硅繕澶氱潃鍛€傦細錛?
鍦ㄨ繖涓猰akefile涓紝鐩爣鏂囦歡錛坱arget錛夊寘鍚細鎵ц鏂囦歡edit鍜屼腑闂寸洰鏍囨枃浠訛紙*.o錛夛紝渚濊禆鏂囦歡錛坧rerequisites錛夊氨鏄啋鍙峰悗闈㈢殑閭d簺 .c 鏂囦歡鍜?.h鏂囦歡銆傛瘡涓涓?.o 鏂囦歡閮芥湁涓緇勪緷璧栨枃浠訛紝鑰岃繖浜?.o 鏂囦歡鍙堟槸鎵ц鏂囦歡 edit 鐨勪緷璧栨枃浠躲備緷璧栧叧緋葷殑瀹炶川涓婂氨鏄鏄庝簡鐩爣鏂囦歡鏄敱鍝簺鏂囦歡鐢熸垚鐨勶紝鎹㈣█涔嬶紝鐩爣鏂囦歡鏄摢浜涙枃浠舵洿鏂扮殑銆?
鍦ㄥ畾涔夊ソ渚濊禆鍏崇郴鍚庯紝鍚庣畫鐨勯偅涓琛屽畾涔変簡濡備綍鐢熸垚鐩爣鏂囦歡鐨勬搷浣滅郴緇熷懡浠わ紝涓瀹氳浠ヤ竴涓猅ab閿綔涓哄紑澶淬傝浣忥紝make騫朵笉綆″懡浠ゆ槸鎬庝箞宸ヤ綔鐨勶紝浠栧彧綆℃墽琛屾墍瀹氫箟鐨勫懡浠ゃ俶ake浼氭瘮杈僼argets鏂囦歡鍜宲rerequisites鏂囦歡鐨勪慨鏀規(guī)棩鏈燂紝濡傛灉prerequisites鏂囦歡鐨勬棩鏈熻姣攖argets鏂囦歡鐨勬棩鏈熻鏂幫紝鎴栬卼arget涓嶅瓨鍦ㄧ殑璇濓紝閭d箞錛宮ake灝變細鎵ц鍚庣畫瀹氫箟鐨勫懡浠ゃ?
榪欓噷瑕佽鏄庝竴鐐圭殑鏄紝clean涓嶆槸涓涓枃浠訛紝瀹冨彧涓嶈繃鏄竴涓姩浣滃悕瀛楋紝鏈夌偣鍍廋璇█涓殑lable涓鏍鳳紝鍏跺啋鍙峰悗浠涔堜篃娌℃湁錛岄偅涔堬紝make灝變笉浼氳嚜鍔ㄥ幓鎵炬枃浠剁殑渚濊禆鎬э紝涔熷氨涓嶄細鑷姩鎵ц鍏跺悗鎵瀹氫箟鐨勫懡浠ゃ傝鎵ц鍏跺悗鐨勫懡浠わ紝灝辮鍦╩ake鍛戒護鍚庢槑鏄懼緱鎸囧嚭榪欎釜lable鐨勫悕瀛椼傝繖鏍風殑鏂規(guī)硶闈炲父鏈夌敤錛屾垜浠彲浠ュ湪涓涓猰akefile涓畾涔変笉鐢ㄧ殑緙栬瘧鎴栨槸鍜岀紪璇戞棤鍏崇殑鍛戒護錛屾瘮濡傜▼搴忕殑鎵撳寘錛岀▼搴忕殑澶囦喚錛岀瓑絳夈?
榪欏氨鏄暣涓猰ake鐨勪緷璧栨э紝make浼氫竴灞傚張涓灞傚湴鍘繪壘鏂囦歡鐨勪緷璧栧叧緋伙紝鐩村埌鏈緇堢紪璇戝嚭絎竴涓洰鏍囨枃浠躲傚湪鎵懼鐨勮繃紼嬩腑錛屽鏋滃嚭鐜伴敊璇紝姣斿鏈鍚庤渚濊禆鐨勬枃浠舵壘涓嶅埌錛岄偅涔坢ake灝變細鐩存帴閫鍑猴紝騫舵姤閿欙紝鑰屽浜庢墍瀹氫箟鐨勫懡浠ょ殑閿欒錛屾垨鏄紪璇戜笉鎴愬姛錛宮ake鏍規(guī)湰涓嶇悊銆俶ake鍙鏂囦歡鐨勪緷璧栨э紝鍗籌紝濡傛灉鍦ㄦ垜鎵句簡渚濊禆鍏崇郴涔嬪悗錛屽啋鍙峰悗闈㈢殑鏂囦歡榪樻槸涓嶅湪錛岄偅涔堝涓嶈搗錛屾垜灝變笉宸ヤ綔鍟︺?
閫氳繃涓婅堪鍒嗘瀽錛屾垜浠煡閬擄紝鍍廲lean榪欑錛屾病鏈夎絎竴涓洰鏍囨枃浠剁洿鎺ユ垨闂存帴鍏寵仈錛岄偅涔堝畠鍚庨潰鎵瀹氫箟鐨勫懡浠ゅ皢涓嶄細琚嚜鍔ㄦ墽琛岋紝涓嶈繃錛屾垜浠彲浠ユ樉紺鴻make鎵ц銆傚嵆鍛戒護鈥斺?#8220;make clean”錛屼互姝ゆ潵娓呴櫎鎵鏈夌殑鐩爣鏂囦歡錛屼互渚塊噸緙栬瘧銆?
浜庢槸鍦ㄦ垜浠紪紼嬩腑錛屽鏋滆繖涓伐紼嬪凡琚紪璇戣繃浜嗭紝褰撴垜浠慨鏀逛簡鍏朵腑涓涓簮鏂囦歡錛屾瘮濡俧ile.c錛岄偅涔堟牴鎹垜浠殑渚濊禆鎬э紝鎴戜滑鐨勭洰鏍噁ile.o浼氳閲嶇紪璇戯紙涔熷氨鏄湪榪欎釜渚濇у叧緋誨悗闈㈡墍瀹氫箟鐨勫懡浠わ級錛屼簬鏄痜ile.o鐨勬枃浠朵篃鏄渶鏂扮殑鍟︼紝浜庢槸file.o鐨勬枃浠朵慨鏀規(guī)椂闂磋姣攅dit瑕佹柊錛屾墍浠dit涔熶細琚噸鏂伴摼鎺ヤ簡錛堣瑙乪dit鐩爣鏂囦歡鍚庡畾涔夌殑鍛戒護錛夈?
鑰屽鏋滄垜浠敼鍙樹簡“command.h”錛岄偅涔堬紝kdb.o銆乧ommand.o鍜宖iles.o閮戒細琚噸緙栬瘧錛屽茍涓旓紝edit浼氳閲嶉摼鎺ャ?
姣斿錛屾垜浠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 鍙橀噺灝卞彲浠ヤ簡銆?
鍏充簬鍙橀噺鏇村鐨勮瘽棰橈紝鎴戜細鍦ㄥ悗緇粰浣犱竴涓閬撴潵銆?
鍙make鐪嬪埌涓涓猍.o]鏂囦歡錛屽畠?yōu)兗氳嚜鍔ㄧ殑鎶奫.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)榪欑鏂規(guī)硶錛屼篃灝辨槸make鐨?#8220;闅愭櫐瑙勫垯”銆備笂闈㈡枃浠跺唴瀹逛腑錛?#8220;.PHONY”琛ㄧず錛宑lean鏄釜浼洰鏍囨枃浠躲?
鍏充簬鏇翠負璇︾粏鐨?#8220;闅愭櫐瑙勫垯”鍜?#8220;浼洰鏍囨枃浠?#8221;錛屾垜浼氬湪鍚庣畫緇欎綘涓涓閬撴潵銆?
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鏂囦歡錛岄偅灝辯悊涓嶆竻妤氫簡銆?
.PHONY : clean clean : -rm edit $(objects)鍓嶉潰璇磋繃錛?PHONY鎰忔濊〃紺篶lean鏄竴涓?#8220;浼洰鏍?#8221;錛屻傝屽湪rm鍛戒護鍓嶉潰鍔犱簡涓涓皬鍑忓彿鐨勬剰鎬濆氨鏄紝涔熻鏌愪簺鏂囦歡鍑虹幇闂錛屼絾涓嶈綆★紝緇х畫鍋氬悗闈㈢殑浜嬨傚綋鐒訛紝clean鐨勮鍒欎笉瑕佹斁鍦ㄦ枃浠剁殑寮澶達紝涓嶇劧錛岃繖灝變細鍙樻垚make鐨勯粯璁ょ洰鏍囷紝鐩鎬俊璋佷篃涓嶆効鎰忚繖鏍楓備笉鎴愭枃鐨勮鐭╂槸鈥斺?#8220;clean浠庢潵閮芥槸鏀懼湪鏂囦歡鐨勬渶鍚?#8221;銆?
涓婇潰灝辨槸涓涓猰akefile鐨勬璨岋紝涔熸槸makefile鐨勫熀紜錛屼笅闈㈣繕鏈夊緢澶歮akefile鐨勭浉鍏崇粏鑺傦紝鍑嗗濂戒簡鍚楋紵鍑嗗濂戒簡灝辨潵銆?
鏈鍚庯紝榪樺煎緱涓鎻愮殑鏄紝鍦∕akefile涓殑鍛戒護錛屽繀欏昏浠Tab]閿紑濮嬨?
褰撶劧錛屼綘鍙互浣跨敤鍒殑鏂囦歡鍚嶆潵涔﹀啓Makefile錛屾瘮濡傦細“Make.Linux”錛?#8220;Make.Solaris”錛?#8220;Make.AIX”絳夛紝濡傛灉瑕佹寚瀹氱壒瀹氱殑Makefile錛屼綘鍙互浣跨敤make鐨?#8220;-f”鍜?#8220;--file”鍙傛暟錛屽錛歮ake -f Make.Linux鎴杕ake --file Make.AIX銆?
include <filename>
鍦╥nclude鍓嶉潰鍙互鏈変竴浜涚┖瀛楃錛屼絾鏄粷涓嶈兘鏄痆Tab]閿紑濮嬨俰nclude鍜?filename>鍙互鐢ㄤ竴涓垨澶氫釜絀烘牸闅斿紑銆備婦涓緥瀛愶紝浣犳湁榪欐牱鍑犱釜Makefile錛歛.mk銆乥.mk銆乧.mk錛岃繕鏈変竴涓枃浠跺彨foo.make錛屼互鍙婁竴涓彉閲?(bar)錛屽叾鍖呭惈浜唀.mk鍜宖.mk錛岄偅涔堬紝涓嬮潰鐨勮鍙ワ細
include foo.make *.mk $(bar)絳変環(huán)浜庯細
include foo.make a.mk b.mk c.mk e.mk f.mkmake鍛戒護寮濮嬫椂錛屼細鎶婃壘瀵籭nclude鎵鎸囧嚭鐨勫叾瀹僊akefile錛屽茍鎶婂叾鍐呭瀹夌疆鍦ㄥ綋鍓嶇殑浣嶇疆銆傚氨濂藉儚C/C++鐨?include鎸囦護涓鏍楓傚鏋滄枃浠墮兘娌℃湁鎸囧畾緇濆璺緞鎴栨槸鐩稿璺緞鐨勮瘽錛宮ake浼氬湪褰撳墠鐩綍涓嬮鍏堝鎵撅紝濡傛灉褰撳墠鐩綍涓嬫病鏈夋壘鍒幫紝閭d箞錛宮ake榪樹細鍦ㄤ笅闈㈢殑鍑犱釜鐩綍涓嬫壘錛?
濡傛灉鏈夋枃浠舵病鏈夋壘鍒扮殑璇濓紝make浼氱敓鎴愪竴鏉¤鍛婁俊鎭紝浣嗕笉浼氶┈涓婂嚭鐜拌嚧鍛介敊璇傚畠浼氱戶緇澆鍏ュ叾瀹冪殑鏂囦歡錛屼竴鏃﹀畬鎴恗akefile鐨勮鍙栵紝make浼氬啀閲嶈瘯榪欎簺娌℃湁鎵懼埌錛屾垨鏄笉鑳借鍙栫殑鏂囦歡錛屽鏋滆繕鏄笉琛岋紝make鎵嶄細鍑虹幇涓鏉¤嚧鍛戒俊鎭傚鏋滀綘鎯寵make涓嶇悊閭d簺鏃犳硶璇誨彇鐨勬枃浠訛紝鑰岀戶緇墽琛岋紝浣犲彲浠ュ湪include鍓嶅姞涓涓噺鍙?#8220;-”銆傚錛?
-include <filename>
浣嗘槸鍦ㄨ繖閲屾垜榪樻槸寤鴻涓嶈浣跨敤榪欎釜鐜鍙橀噺錛屽洜涓哄彧瑕佽繖涓彉閲忎竴琚畾涔夛紝閭d箞褰撲綘浣跨敤make鏃訛紝鎵鏈夌殑Makefile閮戒細鍙楀埌瀹冪殑褰卞搷錛岃繖緇濅笉鏄綘鎯崇湅鍒扮殑銆傚湪榪欓噷鎻愯繖涓簨錛屽彧鏄負浜嗗憡璇夊ぇ瀹訛紝涔熻鏈夋椂鍊欎綘鐨凪akefile鍑虹幇浜嗘簨錛岄偅涔堜綘鍙互鐪嬬湅褰撳墠鐜涓湁娌℃湁瀹氫箟榪欎釜鍙橀噺銆?
鍦∕akefile涓紝瑙勫垯鐨勯『搴忔槸寰堥噸瑕佺殑錛屽洜涓猴紝Makefile涓彧搴旇鏈変竴涓渶緇堢洰鏍囷紝鍏跺畠鐨勭洰鏍囬兘鏄榪欎釜鐩爣鎵榪炲甫鍑烘潵鐨勶紝鎵浠ヤ竴瀹氳璁﹎ake鐭ラ亾浣犵殑鏈緇堢洰鏍囨槸浠涔堛備竴鑸潵璇達紝瀹氫箟鍦∕akefile涓殑鐩爣鍙兘浼氭湁寰堝錛屼絾鏄涓鏉¤鍒欎腑鐨勭洰鏍囧皢琚‘绔嬩負鏈緇堢殑鐩爣銆傚鏋滅涓鏉¤鍒欎腑鐨勭洰鏍囨湁寰堝涓紝閭d箞錛岀涓涓洰鏍囦細鎴愪負鏈緇堢殑鐩爣銆俶ake鎵瀹屾垚鐨勪篃灝辨槸榪欎釜鐩爣銆?
濂戒簡錛岃繕鏄鎴戜滑鏉ョ湅涓鐪嬪浣曚功鍐欒鍒欍?
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閿紑澶達級銆傝繖涓鍒欏憡璇夋垜浠袱浠朵簨錛?
targets : prerequisites ; command command ...targets鏄枃浠跺悕錛屼互絀烘牸鍒嗗紑錛屽彲浠ヤ嬌鐢ㄩ氶厤絎︺備竴鑸潵璇達紝鎴戜滑鐨勭洰鏍囧熀鏈笂鏄竴涓枃浠訛紝浣嗕篃鏈夊彲鑳芥槸澶氫釜鏂囦歡銆?
command鏄懡浠よ錛屽鏋滃叾涓嶄笌“target:prerequisites”鍦ㄤ竴琛岋紝閭d箞錛屽繀欏諱互[Tab閿甝寮澶達紝濡傛灉鍜宲rerequisites鍦ㄤ竴琛岋紝閭d箞鍙互鐢ㄥ垎鍙峰仛涓哄垎闅斻傦紙瑙佷笂錛?
prerequisites涔熷氨鏄洰鏍囨墍渚濊禆鐨勬枃浠訛紙鎴栦緷璧栫洰鏍囷級銆傚鏋滃叾涓殑鏌愪釜鏂囦歡瑕佹瘮鐩爣鏂囦歡瑕佹柊錛岄偅涔堬紝鐩爣灝辮璁や負鏄?#8220;榪囨椂鐨?#8221;錛岃璁や負鏄渶瑕侀噸鐢熸垚鐨勩傝繖涓湪鍓嶉潰宸茬粡璁茶繃浜嗐?
濡傛灉鍛戒護澶暱錛屼綘鍙互浣跨敤鍙嶆枩妗嗭紙‘\’錛変綔涓烘崲琛岀銆俶ake瀵逛竴琛屼笂鏈夊灝戜釜瀛楃娌℃湁闄愬埗銆傝鍒欏憡璇塵ake涓や歡浜嬶紝鏂囦歡鐨勪緷璧栧叧緋誨拰濡備綍鎴愭垚鐩爣鏂囦歡銆?
涓鑸潵璇達紝make浼氫互UNIX鐨勬爣鍑哠hell錛屼篃灝辨槸/bin/sh鏉ユ墽琛屽懡浠ゃ?
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鐨勫叧閿瓧錛屾垜浠皢鍦ㄥ悗闈㈣璁恒?
鍦ㄤ竴浜涘ぇ鐨勫伐紼嬩腑錛屾湁澶ч噺鐨勬簮鏂囦歡錛屾垜浠氬父鐨勫仛娉曟槸鎶婅繖璁稿鐨勬簮鏂囦歡鍒嗙被錛屽茍瀛樻斁鍦ㄤ笉鍚岀殑鐩綍涓傛墍浠ワ紝褰搈ake闇瑕佸幓鎵懼鏂囦歡鐨勪緷璧栧叧緋繪椂錛屼綘鍙互鍦ㄦ枃浠跺墠鍔犱笂璺緞錛屼絾鏈濂界殑鏂規(guī)硶鏄妸涓涓礬寰勫憡璇塵ake錛岃make鍦ㄨ嚜鍔ㄥ幓鎵俱?
Makefile鏂囦歡涓殑鐗規(guī)畩鍙橀噺“VPATH”灝辨槸瀹屾垚榪欎釜鍔熻兘鐨勶紝濡傛灉娌℃湁鎸囨槑榪欎釜鍙橀噺錛宮ake鍙細鍦ㄥ綋鍓嶇殑鐩綍涓幓鎵懼渚濊禆鏂囦歡鍜岀洰鏍囨枃浠躲傚鏋滃畾涔変簡榪欎釜鍙橀噺錛岄偅涔堬紝make灝變細鍦ㄥ綋褰撳墠鐩綍鎵句笉鍒扮殑鎯呭喌涓嬶紝鍒版墍鎸囧畾鐨勭洰褰曚腑鍘繪壘瀵繪枃浠朵簡銆?
VPATH = src:../headers涓婇潰鐨勭殑瀹氫箟鎸囧畾涓や釜鐩綍錛?#8220;src”鍜?#8220;../headers”錛宮ake浼氭寜鐓ц繖涓『搴忚繘琛屾悳绱€傜洰褰曠敱“鍐掑彿”鍒嗛殧銆傦紙褰撶劧錛屽綋鍓嶇洰褰曟案榪滄槸鏈楂樹紭鍏堟悳绱㈢殑鍦版柟錛?
鍙︿竴涓緗枃浠舵悳绱㈣礬寰勭殑鏂規(guī)硶鏄嬌鐢╩ake鐨?#8220;vpath”鍏抽敭瀛楋紙娉ㄦ剰錛屽畠鏄叏灝忓啓鐨勶級錛岃繖涓嶆槸鍙橀噺錛岃繖鏄竴涓猰ake鐨勫叧閿瓧錛岃繖鍜屼笂闈㈡彁鍒扮殑閭d釜VPATH鍙橀噺寰堢被浼鹼紝浣嗘槸瀹冩洿涓虹伒媧匯傚畠鍙互鎸囧畾涓嶅悓鐨勬枃浠跺湪涓嶅悓鐨勬悳绱㈢洰褰曚腑銆傝繖鏄竴涓緢鐏墊椿鐨勫姛鑳姐傚畠鐨勪嬌鐢ㄦ柟娉曟湁涓夌錛?
vapth浣跨敤鏂規(guī)硶涓殑< 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”鐩綍銆?
鍥犱負錛屾垜浠茍涓嶇敓鎴?#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;榪欎釜鐗規(guī)э細
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”鍛戒護鏉ヨ揪鍒版竻闄や笉鍚岀綾繪枃浠剁殑鐩殑
涓婅堪瑙勫垯絳変環(huán)浜庯細bigoutput : text.g generate text.g -big > bigoutput littleoutput : text.g generate text.g -little > littleoutput 鍏朵腑錛?$(subst output,,$@)涓殑“$”琛ㄧず鎵ц涓涓狹akefile鐨勫嚱鏁幫紝鍑芥暟鍚嶄負subst錛屽悗闈㈢殑涓哄弬鏁般傚叧浜庡嚱鏁幫紝灝嗗湪鍚庨潰璁茶堪銆傝繖閲岀殑榪欎釜鍑芥暟鏄埅鍙栧瓧絎︿覆鐨勬剰鎬濓紝“$@”琛ㄧず鐩爣鐨勯泦鍚堬紝灝卞儚涓涓暟緇勶紝“$@”渚濇鍙栧嚭鐩爣錛屽茍鎵т簬鍛戒護銆?
<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>鎵褰㈡垚鐨勭洰鏍囬泦榪涜浜屾瀹氫箟錛屽叾璁$畻鏂規(guī)硶鏄紝鍙?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涓洿澶х殑寮規(guī)с?
main.o : main.c defs.h浣嗘槸錛屽鏋滄槸涓涓瘮杈冨ぇ鍨嬬殑宸ョ▼錛屼綘蹇呴渶娓呮鍝簺C鏂囦歡鍖呭惈浜嗗摢浜涘ご鏂囦歡錛屽茍涓旓紝浣犲湪鍔犲叆鎴栧垹闄ゅご鏂囦歡鏃訛紝涔熼渶瑕佸皬蹇冨湴淇敼Makefile錛岃繖鏄竴涓緢娌℃湁緇存姢鎬х殑宸ヤ綔銆備負浜嗛伩鍏嶈繖縐嶇箒閲嶈屽張瀹規(guī)槗鍑洪敊鐨勪簨鎯咃紝鎴戜滑鍙互浣跨敤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.hgcc -MM main.c鐨勮緭鍑哄垯鏄細
main.o: main.c defs.h閭d箞錛岀紪璇戝櫒鐨勮繖涓姛鑳藉浣曚笌鎴戜滑鐨凪akefile鑱旂郴鍦ㄤ竴璧峰憿銆傚洜涓鴻繖鏍蜂竴鏉ワ紝鎴戜滑鐨凪akefile涔熻鏍規(guī)嵁榪欎簺婧愭枃浠墮噸鏂扮敓鎴愶紝璁㎝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鏄寜嬈℃潵杞藉叆鏂囦歡錛屾渶鍏堣澆鍏ョ殑[
姣忔潯瑙勫垯涓殑鍛戒護鍜屾搷浣滅郴緇烻hell鐨勫懡浠よ鏄竴鑷寸殑銆俶ake浼氫竴鎸夐『搴忎竴鏉′竴鏉$殑鎵ц鍛戒護錛屾瘡鏉″懡浠ょ殑寮澶村繀欏諱互[Tab]閿紑澶達紝闄ら潪錛屽懡浠ゆ槸绱ц窡鍦ㄤ緷璧栬鍒欏悗闈㈢殑鍒嗗彿鍚庣殑銆傚湪鍛戒護琛屼箣闂翠腑鐨勭┖鏍兼垨鏄┖琛屼細琚拷鐣ワ紝浣嗘槸濡傛灉璇ョ┖鏍兼垨絀鴻鏄互Tab閿紑澶寸殑錛岄偅涔坢ake浼氳涓哄叾鏄竴涓┖鍛戒護銆?
鎴戜滑鍦║NIX涓嬪彲鑳戒細浣跨敤涓嶅悓鐨凷hell錛屼絾鏄痬ake鐨勫懡浠ら粯璁ゆ槸琚?#8220;/bin/sh”鈥斺擴NIX鐨勬爣鍑哠hell瑙i噴鎵ц鐨勩傞櫎闈炰綘鐗瑰埆鎸囧畾涓涓叾瀹冪殑Shell銆侻akefile涓紝“#”鏄敞閲婄錛屽緢鍍廋/C++涓殑“//”錛屽叾鍚庣殑鏈瀛楃閮借娉ㄩ噴銆?
閫氬父錛宮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”鍒欐槸鍏ㄩ潰紱佹鍛戒護鐨勬樉紺恒?
褰撲緷璧栫洰鏍囨柊浜庣洰鏍囨椂錛屼篃灝辨槸褰撹鍒欑殑鐩爣闇瑕佽鏇存柊鏃訛紝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”絳夊悗緙銆?
姣忓綋鍛戒護榪愯瀹屽悗錛宮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箞榪欎釜瑙勫垯涓殑鎵鏈夊懡浠ゅ皢浼氬拷鐣ラ敊璇傝繖浜涙槸涓嶅悓綰у埆鐨勯槻姝㈠懡浠ゅ嚭閿欑殑鏂規(guī)硶錛屼綘鍙互鏍規(guī)嵁浣犵殑涓嶅悓鍠滄璁劇疆銆?
榪樻湁涓涓鎻愪竴涓嬬殑make鐨勫弬鏁扮殑鏄?#8220;-k”鎴栨槸“--keep-going”錛岃繖涓弬鏁扮殑鎰忔濇槸錛屽鏋滄煇瑙勫垯涓殑鍛戒護鍑洪敊浜嗭紝閭d箞灝辯粓鐩瑙勫垯鐨勬墽琛岋紝浣嗙戶緇墽琛屽叾瀹冭鍒欍?
鍦ㄤ竴浜涘ぇ鐨勫伐紼嬩腑錛屾垜浠細鎶婃垜浠笉鍚屾ā鍧楁垨鏄笉鍚屽姛鑳界殑婧愭枃浠舵斁鍦ㄤ笉鍚岀殑鐩綍涓紝鎴戜滑鍙互鍦ㄦ瘡涓洰褰曚腑閮戒功鍐欎竴涓鐩綍鐨凪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箞浣犲彲浠ヤ嬌鐢ㄨ繖鏍風殑澹版槑錛?濡傛灉浣犱笉鎯寵鏌愪簺鍙橀噺浼犻掑埌涓嬬駭Makefile涓紝閭d箞浣犲彲浠ヨ繖鏍峰0鏄庯細export <variable ...>濡傦細unexport <variable ...>紺轟緥涓錛? export variable = value 鍏剁瓑浠蜂簬錛? variable = value export variable 鍏剁瓑浠蜂簬錛? export variable := value 鍏剁瓑浠蜂簬錛? variable := value export variable 紺轟緥浜岋細 export variable += value 鍏剁瓑浠蜂簬錛? variable += value export variable濡傛灉浣犺浼犻掓墍鏈夌殑鍙橀噺錛岄偅涔堬紝鍙涓涓猠xport灝辮浜嗐傚悗闈粈涔堜篃涓嶇敤璺燂紝琛ㄧず浼犻掓墍鏈夌殑鍙橀噺銆? 闇瑕佹敞鎰忕殑鏄紝鏈変袱涓彉閲忥紝涓涓槸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”鐨勬枃浠訛紝鎵浠ョ浜岃鐨勫懡浠ゅ氨鏄妸榪欎釜鏂囦歡鏀規(guī)敼鍚嶅瓧銆傝繕鏄妸榪欎釜鍛戒護鍖呮斁鍒頒竴涓ず渚嬩腑鏉ョ湅鐪嬪惂銆?foo.c : foo.y $(run-yacc)鎴戜滑鍙互鐪嬭錛岃浣跨敤榪欎釜鍛戒護鍖咃紝鎴戜滑灝卞ソ鍍忎嬌鐢ㄥ彉閲忎竴鏍楓傚湪榪欎釜鍛戒護鍖呯殑浣跨敤涓紝鍛戒護鍖?#8220;run-yacc”涓殑“$^”灝辨槸“foo.y”錛?#8220;$@”灝辨槸“foo.c”錛堟湁鍏寵繖縐嶄互“$”寮澶寸殑鐗規(guī)畩鍙橀噺錛屾垜浠細鍦ㄥ悗闈粙緇嶏級錛宮ake鍦ㄦ墽琛屽懡浠ゅ寘鏃訛紝鍛戒護鍖呬腑鐨勬瘡涓懡浠や細琚緷嬈$嫭绔嬫墽琛屻?/pre>
]]>
澶у宸茬粡涔犳儻浜庡井杞彁渚涚殑鍔熻兘寮哄ぇ鐨処DE錛屽凡緇忓緢灝戣冭檻鎵嬪姩緙栬繛欏圭洰浜嗭紝鎵璋撴妧澶氫笉鍘嬭韓錛屾湁絀虹殑鏃跺欒繕鏄殢鎴戜竴鍧椾簡瑙d竴涓嬪懡浠よ緙栬瘧銆?/p>
C/C++/VC++紼嬪簭鍛樻垨鏈塙nix/Linux緙栫▼緇忛獙搴旇寰堢啛鎮(zhèn)夛紝浠ュ墠鎴戞浘鍐欒繃涓綃囨枃绔犳弿榪扮敤csc/vbc鏉ヨ繘琛屽懡浠よ緙栬瘧錛屼粖澶╁啀浠嬬粛涓涓婱S鎻愪緵鐨勬洿鍔犲揩鎹鋒湁鏁堢殑緙栬瘧宸ュ叿NMake銆?
MSDN鐨勬弿榪? Microsoft 紼嬪簭緇存姢瀹炵敤宸ュ叿 (NMAKE.EXE) 鏄竴涓?32 浣嶏紝鍩轟簬璇存槑鏂囦歡涓寘鍚殑鍛戒護鐢熸垚欏圭洰鐨勫伐鍏楓?/p>
NMake鍏鋒湁涓板瘜鐨勯夐」錛屽彲浠ュ畬鎴愬鏉傜紪璇戞搷浣溿傚畠鍙互杈ㄥ埆婧愪唬鐮佺殑鏀瑰姩錛屽茍閫夋嫨鎬х殑緙栬瘧錛屼負浣犺妭鐪佸ぇ閲忎笉蹇呰鐨勭紪璇戞椂闂淬?/p>
璇硶錛歂MAKE [options] [macros] [targets] [@commandfile]
璇存槑錛氬叾涓紝options鏄疦MAKE鐨勯夐」錛?a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/vccore/html/_asug_macros_and_nmake.htm" target=_blank>macros鏄湪鍛戒護琛屼腑鐨勫畯瀹氫箟錛宼argets鏄疦MAKE鐨勭洰鏍囨枃浠跺垪琛紝commandfile鏄寘鍚懡浠よ杈撳叆鐨勬枃鏈枃浠訛紙鎴栧搷搴旀枃浠訛級銆?
NMAKE 浣跨敤鎸囧畾 /F 閫夐」鐨凪akefile(鐢熸垚鏂囦歡,閫氬父鍚嶅瓧鏄痬akefile)錛涘鏋滄湭鎸囧畾 /F 閫夐」錛屽垯浣跨敤褰撳墠鐩綍涓嬬殑Makefile銆傚鏋滄湭鎸囧畾Makefile錛屽垯 NMAKE 浣跨敤鎺ㄧ悊瑙勫垯鐢熸垚鍛戒護琛?targets銆?
NMake鏈韓寰堢畝鍗曪紝涓嶯MAKE閰嶅悎鐨勬槸Makefile銆侻akefile鐨勮娉曟瘮杈冨鏉傦紝閫氬父闇瑕佸紑鍙戣呰嚜宸辨墜鍔ㄧ紪鍐橫akefile錛屼笅涓鑺傛垜浠緇嗚瑙akefile銆?
涓婇潰鐨刼ptions鍜宮acros鍋氫簡MSDN鐨勯摼鎺ワ紝鍐呭杈冨錛岃鑷繁鏌ヨ鐩稿叧欏碉紝鍙互浠?a href="ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/vccore/html/_asug_overview.3a_.nmake_reference.htm" target=_blank>榪欓噷榪涘叆NMake鐨凪SDN甯姪欏甸潰錛屽湪綰垮府鍔╃偣榪欓噷銆?
娉細鏈妭鍐呭鏉ヨ嚜MSDN錛岀啛鎮(zhèn)夋鑺傜殑鏈嬪弸鍙互鐩存帴璺寵繃
Makefile鐨勭粍鎴愰儴鍒嗗寘鎷細鎴愭枃浠跺寘鍚細
a.鎻忚堪鍧?/strong>
鎻忚堪鍧楁槸鍚庨潰鍙窡鏈夊懡浠ゅ潡鐨勪緷璧栭」琛岋細
targets... : dependents... commands...
渚濊禆欏硅鎸囧畾涓鎴栧涓洰鏍囦互鍙婇浂鎴栧涓緷璧栭」銆傜洰鏍囧繀欏諱綅浜庤棣栥傜敤鍐掑彿 (:) 灝嗙洰鏍囧拰渚濊禆欏瑰垎寮錛涘厑璁鎬嬌鐢ㄧ┖鏍兼垨鍒惰〃絎︺傝嫢瑕佹媶鍒嗚錛岃鍦ㄧ洰鏍囨垨渚濊禆欏瑰悗闈嬌鐢ㄥ弽鏂滄潬 (\ )銆傚鏋滅洰鏍囦笉瀛樺湪銆佺洰鏍囩殑鏃墮棿鎴蟲瘮渚濊禆欏規(guī)棭鎴栬呯洰鏍囨槸浼洰鏍囷紝鍒?NMAKE 鎵ц鍛戒護銆傚鏋滄煇渚濊禆欏規(guī)槸鍏朵粬鍦版柟鐨勭洰鏍囷紝騫朵笖涓嶅瓨鍦ㄦ垨瀵逛簬鑷繁鐨勪緷璧栭」宸茶繃鏈燂紝鍒?NMAKE 鍦ㄦ洿鏂板綋鍓嶄緷璧栭」涔嬪墠鏇存柊璇ヤ緷璧栭」銆?
濡傛灉渚濊禆欏瑰凡榪囨湡錛屽垯鎻忚堪鍧楁垨鎺ㄧ悊瑙勫垯鎸囧畾瑕佽繍琛岀殑鍛戒護鍧椼侼MAKE 鍦ㄨ繍琛屽懡浠や箣鍓嶆樉紺烘瘡涓懡浠わ紝闄ら潪浣跨敤浜?/S 閫夐」銆?strong>.SILENT銆?strong>!CMDSWITCHES 鎴?@銆傚鏋滄弿榪板潡鍚庨潰娌℃湁绱ц窡鍛戒護鍧楋紝NMAKE 灝嗘煡鎵懼尮閰嶇殑鎺ㄧ悊瑙勫垯銆?/p>
鍛戒護鍧楀寘鍚竴涓垨澶氫釜鍛戒護錛屾瘡涓懡浠や綅浜庡悇鑷殑鍛戒護琛屼笂銆傚湪渚濊禆欏癸紙鎴栬鍒欙級鍜屽懡浠ゅ潡涔嬮棿涓嶈兘鍑虹幇絀鴻銆備絾鏄彲浠ュ嚭鐜板彧鍖呭惈絀烘牸鎴栧埗琛ㄧ鐨勮錛涜琛岃瑙i噴涓虹┖鍛戒護錛屽茍涓斾笉鍑虹幇閿欒銆傚懡浠よ涔嬮棿鍏佽鏈夌┖琛屻?/p>
鍛戒護琛屼互涓涓垨澶氫釜絀烘牸鎴栧埗琛ㄧ寮濮嬨傚悗闈㈢揣璺熺潃鎹㈣絎︾殑鍙嶆枩鏉?( \ ) 鍦ㄥ懡浠や腑琚В閲婁負絀烘牸錛涘湪琛屽熬浣跨敤鍙嶆枩鏉犵戶緇笅涓琛屽懡浠ゃ傚鏋滃弽鏂滄潬鍚庣揣璺熸湁鍏朵粬浠諱綍瀛楃錛堝寘鎷┖鏍兼垨鍒惰〃絎︼級錛屽垯 NMAKE 鎸夊師涔夎В閲婂弽鏂滄潬銆?/p>
鏃犺鍚庨潰鏄惁绱ц窡鏈夊懡浠ゅ潡錛屽墠闈㈠甫鍒嗗彿 (;) 鐨勫懡浠ゅ彲浠ュ嚭鐜板湪渚濊禆欏硅涓婃垨鎺ㄧ悊瑙勫垯涓細
project.obj : project.c project.h ; cl /c project.c
c.瀹?/strong>
瀹忕敤鍙︿竴涓瓧絎︿覆鏇挎崲鐢熸垚鏂囦歡涓殑鐗瑰畾瀛楃涓層備嬌鐢ㄥ畯鍙互錛?
鍙互瀹氫箟鎮(zhèn)?strong>鑷繁鐨勫畯鎴栦嬌鐢?NMAKE 鐨?strong>棰勫畾涔夊畯銆?/p>
d.鎺ㄧ悊瑙勫垯
鎺ㄧ悊瑙勫垯鎻愪緵鍛戒護鏉ユ洿鏂扮洰鏍囧茍鎺ㄧ悊鐩爣鐨勪緷璧栭」銆傛帹鐞嗚鍒欎腑鐨勬墿灞曞悕涓庡叿鏈夌浉鍚屽熀鍚嶇О鐨勫崟涓洰鏍囧拰渚濊禆欏瑰尮閰嶃傛帹鐞嗚鍒欐槸鐢ㄦ埛瀹氫箟鐨勶紝鎴栭瀹氫箟鐨勶紱棰勫畾涔夌殑瑙勫垯鍙互閲嶆柊瀹氫箟銆?/p>
濡傛灉榪囨湡鐨勪緷璧栭」娌℃湁鍛戒護錛屽茍涓斿鏋?.SUFFIXES 鍖呭惈渚濊禆欏圭殑鎵╁睍鍚嶏紝鍒?NMAKE 浣跨敤鍏舵墿灞曞悕涓庡綋鍓嶆垨鎸囧畾鐩綍涓殑鐩爣鍜岀幇鏈夋枃浠跺尮閰嶇殑瑙勫垯銆傚鏋滄湁澶氫釜瑙勫垯涓庣幇鏈夋枃浠跺尮閰嶏紝.SUFFIXES 鍒楄〃灝嗙‘瀹氫嬌鐢ㄥ摢涓涓鍒欙紱鍒楄〃浼樺厛綰т粠宸﹀悜鍙蟲寜闄嶅簭鎺掑垪銆傚鏋滀緷璧栨枃浠朵笉瀛樺湪錛屽茍涓旀湭鍦ㄥ彟涓涓弿榪板潡涓綔涓虹洰鏍囧垪鍑猴紝鍒欐帹鐞嗚鍒欏彲浠ヤ粠鍏鋒湁鐩稿悓鍩哄悕縐扮殑鍙︿竴涓枃浠跺垱寤虹己灝戠殑渚濊禆欏廣傚鏋滄弿榪板潡鐨勭洰鏍囨病鏈変緷璧栭」鎴栧懡浠わ紝鎺ㄧ悊瑙勫垯鍙互鏇存柊鐩爣銆傚嵆浣夸笉瀛樺湪鎻忚堪鍧楋紝鎺ㄧ悊瑙勫垯涔熷彲浠ョ敓鎴愬懡浠よ鐩爣銆傚嵆浣挎寚瀹氫簡鏄懼紡渚濊禆欏癸紝NMAKE 涔熷彲浠ヨ皟鐢ㄦ帹鐞嗕緷璧栭」鐨勮鍒欍?/p>
e.鐐規(guī)寚浠?/strong>
鍦ㄦ弿榪板潡涔嬪鐨勮棣栨寚瀹氱偣鎸囦護銆傜偣鎸囦護浠ュ彞鐐?( . ) 寮濮嬶紝鍚庨潰璺熶竴涓啋鍙?(:)銆傚厑璁鎬嬌鐢ㄧ┖鏍兼垨鍒惰〃絎︺傜偣鎸囦護鍚嶅尯鍒嗗ぇ灝忓啓騫朵笖搴斾負澶у啓銆?/p>
| 鎸囦護 | 浣滅敤 |
|---|---|
| .IGNORE : | 蹇界暐浠庢寚瀹氳鎸囦護鐨勪綅緗埌鐢熸垚鏂囦歡鏈熬涔嬮棿錛岀敱鍛戒護榪斿洖鐨勯潪闆墮鍑轟唬鐮併傞粯璁ゆ儏鍐典笅錛屽鏋滃懡浠よ繑鍥為潪闆墮鍑轟唬鐮侊紝NMAKE 灝嗘殏鍋溿傝嫢瑕佽繕鍘熼敊璇鏌ワ紝璇蜂嬌鐢?!CMDSWITCHES銆傝嫢瑕佸拷鐣ュ崟涓懡浠ょ殑閫鍑轟唬鐮侊紝璇蜂嬌鐢ㄧ煭鍒掔嚎 (-) 淇グ絎︺傝嫢瑕佸拷鐣ユ暣涓枃浠剁殑閫鍑轟唬鐮侊紝璇蜂嬌鐢?/I 閫夐」銆?/td> |
| .PRECIOUS : targets | 鑻ユ洿鏂?targets 鐨勫懡浠ゆ殏鍋滐紝鍒欏皢 targets 淇濈暀鍦ㄧ鐩樹笂錛涜嫢鍛戒護閫氳繃鍒犻櫎鏂囦歡澶勭悊涓柇錛屽垯璇ユ寚浠ゆ棤鏁堛傜敤涓鎴栧涓┖鏍兼垨鍒惰〃絎﹀垎闅旂洰鏍囧悕縐般傞粯璁ゆ儏鍐典笅錛屽鏋滈氳繃浣跨敤 CTRL+C 鎴?CTRL+BREAK 緇勫悎閿腑鏂敓鎴愶紝NMAKE 灝嗗垹闄ょ洰鏍囥?strong>.PRECIOUS 鐨勬瘡涓嬈′嬌鐢ㄩ兘搴旂敤浜庢暣涓敓鎴愭枃浠訛紱澶氭鎸囧畾鏄瘡璁$殑銆?/td> |
| .SILENT : | 鍙栨秷浠庢寚瀹氳鎸囦護鐨勪綅緗埌鐢熸垚鏂囦歡鏈熬涔嬮棿鐨勫凡鎵ц鍛戒護鐨勬樉紺恒傞粯璁ゆ儏鍐典笅錛孨MAKE 鏄劇ず瀹冭皟鐢ㄧ殑鍛戒護銆傝嫢瑕佽繕鍘熷洖鏄撅紝璇蜂嬌鐢?!CMDSWITCHES銆傝嫢瑕佸彇娑堝崟涓懡浠ょ殑鍥炴樉錛岃浣跨敤 @ 淇グ絎︺傝嫢瑕佸彇娑堟暣涓枃浠剁殑鍥炴樉錛岃浣跨敤 /S 閫夐」銆?/td> |
| .SUFFIXES : list | 鍒楀嚭鎺ㄧ悊瑙勫垯鍖歸厤鐨勬墿灞曞悕錛涢瀹氫箟涓猴細.exe .obj .asm .c .cpp .cxx .bas .cbl .for .pas .res .rc銆?/td> |
鑻ヨ鏇存敼 .SUFFIXES 鍒楄〃欏哄簭鎴栨寚瀹氭柊鍒楄〃錛岃娓呴櫎姝ゅ垪琛ㄥ茍鎸囧畾鏂扮殑璁劇疆銆傝嫢瑕佹竻闄ゆ鍒楄〃錛岃涓嶈鍦ㄥ啋鍙峰悗鎸囧畾鎵╁睍鍚嶏細
.SUFFIXES :
鑻ヨ灝嗗叾浠栧悗緙娣誨姞鍒板垪琛ㄧ殑鏈熬錛岃鎸囧畾
.SUFFIXES : suffixlist
鍏朵腑 suffixlist 鏄檮鍔犲悗緙鐨勫垪琛紝鐢變竴鎴栧涓┖鏍兼垨鍒惰〃絎﹀垎闅斻傝嫢瑕佹煡鐪?.SUFFIXES 鐨勫綋鍓嶈緗紝璇瘋繍琛岄夐」涓?/P 鐨?NMAKE銆?/p>
f.棰勫鐞嗘寚浠?/strong>
鍙互閫氳繃浣跨敤棰勫鐞嗘寚浠ゅ拰琛ㄨ揪寮忔帶鍒?NMAKE 浼氳瘽銆傞澶勭悊鎸囦護鍙互鏀劇疆鍦ㄧ敓鎴愭枃浠舵垨 Tools.ini 鏂囦歡涓備嬌鐢ㄦ寚浠ゅ彲浠ユ湁鏉′歡鍦板鐞嗙敓鎴愭枃浠訛紝鏄劇ず閿欒淇℃伅錛屽寘鎷叾浠栫敓鎴愭枃浠訛紝鍙栨秷瀹氫箟瀹忎互鍙婃墦寮鎴栧叧闂煇浜涢夐」銆?/p>
鐪嬩簡涓鍫嗙悊璁猴紝寰堢瘡浜嗗惂錛熶笅闈㈢湅涓孌電畝鍗曠殑MakeFile
# 瀹忓畾涔?
SOURCES=AssemblyInfo.cs \
Form1.cs \
Form2.cs \
Form3.cs \
HelloWorld.cs
# 寮曠敤瑙勫垯
# 鐩爣:
CLRProfiler.exe : $(SOURCES) #<-錛嶄緷璧栭」
# 鏍囧織
# 涓嬮潰鏄懡浠?
csc /t:winexe /out:HelloWorld.exe /r:System.Windows.Forms.dll $(SOURCES)
clean:
del HelloWorld.exe
|
灝嗕笂榪頒唬鐮佷繚瀛樹負Makefile(娌℃湁鍚庣紑)鏀懼湪浣犵殑欏圭洰鏂囦歡澶逛笅, 鐒跺悗鎵撳紑VS2003.NET鍛戒護琛岀獥鍙o紝榪涘叆欏圭洰澶規(guī)墍鍦ㄨ礬寰勶紝鎵撳叆NMake鍥炶濺, ok
紺轟緥2
涓嬮潰婕旂ず涓涓嬪涓」鐩椂鐨勭紪璇戯紝姣忎釜鍗曠嫭鐨勯」鐩垱寤哄崟鐙殑makefile錛岃В鍐蟲柟妗堜笅鏀句竴涓葷殑makefile
all:
# 鍒嗗埆瀵歸」鐩繘琛岀紪璇?
cd project1
nmake
cd ..
cd project2
nmake
cd ..
cd project3
nmake
cd ..
# 灝嗙紪璇戠粨鏋滄眹鎬誨埌褰撳墠璺緞
copy project1\project1.dll
copy project2\project2.dll
copy project3\project3.exe
clean:
# 娓呴櫎緙栬瘧緇撴灉
del project1.dll
del project2.dll
del project3.exe
cd project1
nmake clean
cd ..
cd project2
nmake clean
cd ..
cd project3
nmake clean
cd ..
|
鏈枃綆鍗曚粙緇嶄簡NMAKE鐨勭敤娉曪紝騫跺Makefile鐨勮娉曞仛浜嗕粙緇嶃傜瘒騫呮墍闄愶紝鏃笉鑳介潰闈勘鍒幫紝鍙堜笉鑳芥繁鍏ュ墫鏋愶紝鍙笇鏈涜兘澶熻鏇村浜轟簡瑙f宸ュ叿銆傜瑪鑰呬篃鏄垰鍒氭帴瑙︼紝緇忛獙涓嶅錛岃繕璇峰悇浣嶇綉鍙嬪澶氭媿鐮栵紒
| 絎﹀悎 | 浣滅敤 |
|---|---|
| ^ (caret) | 鐢ㄤ簬鍏抽棴鏌愪簺瀛楃鎵鍏鋒湁鐨勭壒孌婃剰涔夛紝浣垮叾鍙〃紺哄瓧闈笂鐨勬剰涔夈備緥濡傦細^#abc琛ㄧず#abc榪欎釜瀛楃涓詫紝鑰?abc鍒欑敤浜庡湪makefile涓姞鍏ユ敞閲婏紝#鍦ㄨ繖閲屼負娉ㄩ噴鏍囧織錛屽氨鍍廋++涓殑//銆傚彟澶栵紝鍦ㄤ竴琛岀殑鏈熬鍔犱笂^錛屽彲浠ヤ嬌琛屽熬鐨勫洖杞︽崲琛岀鎴愪負瀛椾覆鐨勪竴閮ㄥ垎銆? |
| # (number sign) | 娉ㄩ噴鏍囧織錛孨MAKE浼氬拷鐣ユ墍鏈変粠#寮濮嬪埌涓嬩竴涓崲琛岀涔嬮棿鐨勬墍鏈夋枃鏈傝繖閲岃娉ㄦ剰鐨勬槸錛氬湪command lines涓笉鑳藉瓨鍦ㄦ敞閲娿傚洜涓哄浜巆ommand lines錛孨MAKE鏄皢鍏舵暣琛屼紶閫掔粰OS鐨勩傞氬父瀵逛簬command lines鐨勬敞閲婇兘鏄斁鍦ㄨ涓庤涔嬮棿銆? |
| \ (backslash) | 鐢ㄤ簬灝嗕袱琛屽悎騫朵負涓琛屻傚皢鍏舵斁鍦ㄨ灝撅紝NMAKE灝變細灝嗚灝劇殑鍥炶濺鎹㈣絎﹁В閲婁負絀烘牸錛坰pace錛夈?/td> |
| % (percent symbol) | 琛ㄧず鍏跺悗鐨勫瓧絎︿覆涓轟竴鏂囦歡鍚嶃?/td> |
| ( (left parentheses) | |
| ) (right parentheses) | |
| { | |
| } | |
| ! (exclamation symbol) | 鍛戒護淇グ絎?/td> |
| @ (at sign) | 鍛戒護淇グ絎?/td> |
| - (hyphen) | |
| : (colon) | 鐢ㄤ簬dependent lines鍜宨nference rules涓紝鐢ㄤ簬鍒嗛殧target鍜宒ependent銆?/td> |
| ; (semicolon) | 濡傛灉瀵逛簬涓涓猟ependent line鍙湁涓鏉″懡浠わ紝鍒欏彲浠ュ皢璇ュ懡浠ゆ斁鍦╠ependent line鐨勫悗闈紝浜岃呬箣闂寸敤“錛?#8221;鍒嗛殧銆?/td> |
| $ (dolor sign) | 鐢ㄤ簬璋冪敤瀹?/td> |
DSW:鍏ㄧО鏄疍eveloper Studio Workspace錛屾渶楂樼駭鍒殑閰嶇疆鏂囦歡錛岃褰曚簡鏁翠釜宸ヤ綔絀洪棿鐨勯厤緗俊鎭紝濂規(guī)槸涓涓函鏂囨湰鐨勬枃浠訛紝鍦╲c鍒涘緩鏂伴」鐩殑鏃跺欒嚜鍔ㄧ敓鎴?br>DSP:鍏ㄧО鏄疍eveloper Studio Project錛屼篃鏄竴涓厤緗枃浠訛紝涓嶈繃濂硅褰曠殑鏄竴涓」鐩殑鎵鏈夐厤緗俊鎭紝綰枃鏈枃浠?br>OPT錛氫笌DSW銆丏SP閰嶅悎浣跨敤鐨勯厤緗枃浠訛紝濂硅褰曚簡涓庢満鍣ㄧ‖浠舵湁鍏崇殑淇℃伅錛屽悓涓涓」鐩湪涓嶅悓鐨勬満鍣ㄤ笂鐨刼pt鏂囦歡鍐呭鏄笉鍚岀殑
CLW錛氳褰曚簡璺烠lassWizard鐩稿叧鐨勪俊鎭紝濡傛灉涓㈠け浜哻lw鏂囦歡錛岄偅涔堝湪Class View闈㈡澘閲屽氨娌℃湁綾諱俊鎭?br>PLG錛氬疄闄呬笂鏄竴涓秴鏂囨湰鏂囦歡錛屽彲浠ョ敤Internet Explorer鎵撳紑錛岃褰曚簡Build鐨勮繃紼嬶紝鏄竴涓棩蹇楀瀷鏂囦歡
RC錛氳祫婧愭弿榪版枃浠訛紝璁板綍浜嗘墍鏈夌殑璧勬簮淇℃伅錛屽湪璧勬簮緙栬緫鍣ㄩ噷浣滅殑淇敼錛屽疄闄呬笂閮芥槸瀵筊C鏂囦歡鐨勪慨鏀?br>RC2錛氶檮鍔犵殑璧勬簮鎻忚堪鏂囦歡錛屼笉鑳界洿鎺ヨ祫婧愮紪杈戝櫒淇敼錛屽彧鑳芥墜宸ユ坊鍔狅紝鍙互鐢ㄦ潵娣誨姞棰濆鐨勮祫婧?br>RES錛氱粡榪囪祫婧愮紪杈戝櫒緙栬瘧涔嬪悗鐨勮祫婧愭枃浠訛紝浠ヤ簩榪涘埗鏂瑰紡瀛樻斁
SBR錛氱紪璇戝櫒鐢熸垚鐨勬祻瑙堜俊鎭枃浠訛紝鍦ㄤ唬鐮佸鑸殑鏃跺欓潪甯告湁鐢紝濂歸渶瑕佸湪緙栬瘧鏃舵寚瀹?FR鎴栬?Fr寮鍏?br>BSC錛欱SCMAKE.EXE灝嗘墍鏈夌殑SBR鏂囦歡浣滀負杈撳叆錛岀粡榪囧鐞嗕箣鍚庤緭鍑轟竴涓狟SC鏂囦歡錛屽湪浠g爜瀵艱埅鐨勬椂鍊欏疄闄呯敤鍒扮殑鏄疊SC鏂囦歡
ILK錛氬綋閫夊畾娓愬鍨嬬紪璇戣繛鎺ユ椂錛岃繛鎺ュ櫒鑷姩鐢熸垚ILK鏂囦歡錛岃褰曡繛鎺ヤ俊鎭?br>PDB錛氬叏縐版槸Program DataBase錛屽嵆紼嬪簭鏁版嵁搴撴枃浠訛紝鐢ㄦ潵璁板綍璋冭瘯淇℃伅錛屾槸涓涓浉褰撻噸瑕佺殑鏂囦歡錛屾病鏈変粬錛岀▼搴忔棤娉曟甯歌皟璇?br>LIB錛氬鏋滈」鐩緭鍑烘槸Dll鐨勮瘽錛屼竴鑸細杈撳嚭涓涓窡欏圭洰鍚屽悕鐨凩ib鏂囦歡錛岃褰曡緭鍑虹殑鍑芥暟淇℃伅
EXP錛氬悓Lib錛屾槸璺烡ll涓璧風敓鎴愮殑杈撳嚭鏂囦歡
PCH錛氬叏縐版槸PreCompiled Header錛屽氨鏄鍏堢紪璇戝ソ鐨勫ご鏂囦歡錛屽湪緙栬瘧鏃舵寚瀹?Yu寮鍏蟲椂緙栬瘧鍣ㄨ嚜鍔ㄧ敓鎴?/p>