锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
-------------------------------------------------------------------------------------------------------------------- [HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\FontAndColors\{A27B4E24-A735-4D1D-B8E7-9716E1E3D8E0}] 錛僫 nclude <>鍏堟悳绱?I緙栬瘧閫夐」鐨勮礬寰勶紝鐒跺悗鎼滅儲鐜鍙橀噺INCLUDE錛?"鍏堟悳绱㈢埗鏂囦歡鐨勮礬寰勶紝鐒跺悗鎵嶆槸鍓嶉潰涓や釜璺緞銆?/p>
鐢–璁捐涓涓姩鎬佸闀跨殑鏁扮粍錛岄渶瑕佺敤鍒癕ALLOC鍜孯EALLOC錛屽涓庡悓涓涓寚閽堬紝濡傛灉鍐呭瓨涓嶅瀛樺偍鏁版嵁錛屽氨鐢≧EALLOC閲嶆柊鍒嗛厤澶氫竴鍊嶇殑鍐呭瓨銆傚茍涓旇繑鍥炵殑鎸囬拡涓嶈兘鐩存帴緇欏師鏉ョ殑鎸囬拡錛屽洜涓哄鏋滃垎閰嶅け璐ワ紝閭d箞鍘熸潵鐨勬暟鎹氨浼?xì)涓㈠け銆?/p>
浼犻掑嚱鏁板湴鍧浣滀負(fù)鍙傛暟 棣栧厛瀹氫箟浠ュ嚱鏁板湴鍧浣滀負(fù)鍙傛暟鐨勫嚱鏁?/p>
} } int fun1(int n,int(*f)(int b)) } 瀹炵幇鏁e垪琛細(xì)浣跨敤涓涓暎鍒楀嚱鏁幫紝灝嗛」鏁e垪鍒頒竴涓暟緇勯噷闈紝姣忎釜鏁扮粍鍏冪礌鏄竴涓摼琛紝璁板綍榪欎釜鏁e垪鍊肩殑鎵鏈夐」銆?/p>
CMemoryState 綾誨彲鐢ㄤ簬媯(gè)鏌ュ唴瀛樻硠闇層?/p>
鏋勯犲嚱鏁板拰鏋愭瀯鍑芥暟閮芥病鏈夎繑鍥炲?/p>
綾葷殑鎴愬憳緙虹渷鏄鏈夌殑. 閲嶈澆渚濋潬鍙傛暟涓嶅悓鑰屼笉鏄繑鍥炲肩殑涓嶅悓,鍥犱負(fù)鎴戜滑鍙互鍦ㄨ皟鐢ㄥ嚱鏁扮殑鏃跺欏拷鐣ヨ繑鍥炲?榪欎釜鏃跺欑紪璇戝櫒鏃犳硶紜畾璇ヨ皟鐢ㄩ偅涓嚱鏁? 鏋勯犲嚱鏁板彲浠ユ牴鎹弬鏁扮被鍨嬩笉鍚屽尯鍒?涔熷彲浠ユ牴鎹弬鏁頒釜鏁頒笉鍚屽尯鍒?浣嗗鏋滀竴涓瀯閫犲嚱鏁扮殑鍙傛暟鏈夌己鐪佸艱屼笖鍓嶉潰鐨勫弬鏁頒笌鍏跺畠鏋勯犲嚱鏁扮浉鍚?閭d箞濡傛灉鍦ㄨ皟鐢ㄧ殑鏃跺欑敤鍒頒簡緙虹渷鍊?緙栬瘧鍣ㄦ棤娉曞垎杈ㄨ璋冪敤閭d釜鍑芥暟,浼?xì)鎶ラ? 鍙互鍦ㄥ畾涔夊嚱鏁扮殑鏃跺?璁╂煇涓弬鏁板彧鏈夌被鍨嬪悕鑰屾病鏈夋爣璇嗙,榪欐牱鍋氱殑鐩殑鏄負(fù)浜嗗皢鏉ュ彲鑳介渶瑕佹彃鍏ヤ竴涓弬鏁?鍦ㄨ皟鐢ㄧ殑鏃跺欓殢渚跨粰榪欎釜浣嶇疆涓涓煎氨鍙互浜? int temp(int a,int,int b) ~鎸変綅姹傚弽 const 瀛樻斁鍦ㄧ鍙瘋〃閲?涓嶄細(xì)琚垎閰嶅唴瀛?濡傛灉浣跨敤&絎﹀彿,灝變細(xì)寮鴻揩緙栬瘧鍣ㄤ負(fù)甯擱噺鍒嗛厤鍦板潃,const鏁扮粍涔熶細(xì)琚垎閰嶅唴瀛? const int* p錛沬nt const* p;鎸囧悜甯擱噺鐨勬寚閽堬紝瀹冪殑鍐呭(*p)涓嶈兘琚敼鍙橈紝涔熶笉鑳藉皢瀹冪殑鍊艱祴int * const p,甯告寚閽堬紝鍊間笉鍙樸傜粰闈炲父閲忔寚閽堛?br>瀵逛復(fù)鏃跺璞¤浣跨敤甯稿煎紩鐢ㄦ帴鏀訛紝鍥犱負(fù)涓存椂瀵硅薄鏄父閲忋?/p>
瀵逛簬const鎴愬憳鍙橀噺錛屽繀欏誨湪鏋勯犲嚱鏁板墠(鏋勯犲嚱鏁板垵濮嬪寲琛?瀵瑰畠璧嬪垵鍊?鑾刼nst涔熷彲浠ュ湪榪欓噷璧嬪?浣嗘病鏈夊繀瑕?鍙互杞埌鏋勯犲嚱鏁頒綋鍐?铏界劧鍦ㄥ垵濮嬪寲琛ㄩ噷鏁堢巼鏇撮珮)銆備換浣曠被鍨嬬殑鎴愬憳鍙橀噺閮戒笉鑳藉湪澹版槑鐨勬椂鍊欒祴鍊箋?/p>
綾諱腑鐨勫父閲廲onst鏄鏌愪釜鍏蜂綋瀵硅薄鑰岃█鐨勶紝濡傛灉闇瑕佸鏁翠釜綾葷殑甯稿鹼紝浣跨敤enum. char *p="123456"; 濡傛灉鎴愬憳鍑芥暟琚0鏄庝負(fù)const,閭d箞鍏朵腑涓嶈兘鍚湁鏀瑰彉鎴愬憳鍙橀噺鍊肩殑璇彞(浣嗗彲浠ユ敼鍙樿mutable淇グ鐨勬垚鍛樺彉閲?),涔熶笉鑳借皟鐢ㄩ潪const鎴愬憳鍑芥暟,濡傛灉瀵硅薄琚0鏄庝負(fù)const,閭d箞瀹冨彧鑳借皟鐢╟onst鎴愬憳鍑芥暟. volatile鐨勭敤娉曞悓const,鐢氳嚦鍙互浣跨敤const volatile鍋氫慨楗版病,volatile鏍囪瘑鏁版嵁鍙兘琚埆鐨勮繘紼嬫敼鍙?鍥犳鏈夊繀瑕佸湪姣忔浣跨敤鐨勬椂鍊欓噸璇昏繖涓暟鎹?榪欏湪浼樺寲鏈熼棿鐗瑰埆閲嶈,闃叉緙栬瘧鍣ㄥ仛涓浜涘亣璁? 緇欏畯鐨勫弬鏁版渶濂芥槸綆鍗曞彉閲忥紝濡傛灉涓嶆槸錛屽a++,閭d箞鍙橀噺鍦ㄥ畯涓嚭鐜板嚑嬈★紝a灝變細(xì)琚姞澶氬皯嬈°傛渶濂戒笉鐢ㄥ畯鍋氱被浼煎嚱鏁扮殑浜嬫儏錛屽湪綾諱腑錛岀敤鍐呰仈鍑芥暟浠f浛瀹忥紝涓鏍峰彲浠ュ緱鍒伴珮鏁堢巼銆?/p>
鍦ㄧ被涓畾涔夌殑鍑芥暟鑷姩鎴愪負(fù)鍐呰仈鍑芥暟錛屽湪綾誨錛屼嬌鐢╥nline鍏抽敭瀛椼?/p>
涓嶅簲璇ヤ嬌鐢╬ublic鎴愬憳鍙橀噺錛岃屾槸搴旇浣跨敤鍐呰仈鍑芥暟瀛樺彇榪欎簺鍙橀噺錛屼嬌鐢ㄩ噸杞藉彲浠ュ彧鐢ㄤ竴涓嚱鏁板悕瀛楀畬鎴愬瓨鍙栥?/p>
涓涓▼搴忕殑鎵鏈夋枃浠訛紝鎵鏈夌殑鍚嶅瓧錛堜笉鍦ㄥ嚱鏁版垨綾諱腑錛夌己鐪侀兘鏄閮ㄨ繛鎺ワ紝榪欐剰鍛崇潃涓嶅悓鏂囦歡涓浉鍚岀殑鍚嶅瓧錛堜笉鍦ㄥ嚱鏁版垨綾諱腑錛変細(xì)寮曡搗鍐茬獊錛屽鏋滃榪欎簺鍚嶅瓧鐢╯tatic淇グ錛屽氨浼?xì)鍙樻垚鍐呴儴杩炴帴锛屽悕瀛椾粎鍦ň~栬瘧鍗曞厓鍐呭彲瑙併俥xtern鏄痵tatic鐨勫弽涔夎瘝錛岃〃紺哄閮ㄨ繛鎺ワ紝鍚岀己鐪佺殑鎰忎箟鐩稿悓銆備袱縐嶈繛鎺ョ殑鍚嶅瓧閮戒細(xì)瀛樺偍鍦ㄩ潤鎬佸瓨鍌ㄥ尯銆?/p>
涓鏃︾敤浜庝慨楗板眬閮ㄥ彉閲忥紝static灝變笉鍐嶈〃紺哄彲瑙佹э紝鑰屽彧鏀瑰彉鍙橀噺鐨勫瓨璐被鍨嬨?/p>
register琛ㄧず甯屾湜榪欎釜鍙橀噺琚斁鍦ㄥ瘎瀛樺櫒閲岋紝鍥犱負(fù)瀹冪粡甯歌鐢ㄥ埌錛屽簲璇ラ伩鍏嶄嬌鐢ㄨ繖涓叧閿瓧錛屽洜涓鴻繖鏂歸潰閫氬父鏈哄櫒姣斾漢鏇存搮闀褲?/p>
綾諱腑鐨剆tatic鍙橀噺錛堝寘鎷敤static淇グ鐨刢onst錛夊繀欏誨湪綾誨拰鍑芥暟澶栫殑鍏ㄥ眬浣嶇疆鍒濆鍖栵紝鍒濆鍖栫殑璇硶鏄細(xì)static 綾誨瀷 綾?:鍙橀噺鍚?鍊鹼紱 瀛樺湪宓屽綾誨拰灞閮ㄧ被:綾諱腑瀹氫箟鐨勭被鍜屽嚱鏁頒腑瀹氫箟鐨勭被,鍚庤呬笉鑳芥湁闈欐佹垚鍛樺彉閲?鏄劇劧錛屾病鏈夊姙娉曞垵濮嬪寲榪欑static鍙橀噺). 璋冪敤c搴?鍦ㄥ0鏄庣殑鏃跺欒浣跨敤extern "C" 鍑芥暟澹版槑,鎸囨槑榪欐槸涓涓猚榪炴帴.鍥犱負(fù)c++鍚宑鐨勭紪璇戝櫒涓嶅悓,浼?xì)湄?fù)鍑芥暟浜х敓涓嶅悓鐨勫唴閮ㄥ悕,鎸夌収c++鐨勬柟寮忚繛鎺鍑芥暟,浼?xì)鎵句笉鍒板簱涓殑鍑芥曨C綋.褰撶劧,閫氬父鎯呭喌涓嬪簱鐨勫紑鍙戜笂宸茬粡涓烘垜浠仛濂戒簡榪欎簺. 寮曠敤蹇呴』琚垵濮嬪寲,涓斿紩鐢ㄧ殑瀵硅薄涓嶈兘鏀瑰彉.涓嶈兘寮曠敤null. int f(const int&) 鏃犺繑鍥炲肩殑鍑芥暟鏄痸oid綾誨瀷. void inf(int*&i){i++;} 璋冪敤:int *i=0; inf(i); 閫氳繃鍊間紶閫掔粰鍑芥暟錛屾垨鑰呭嚱鏁拌繑鍥炰竴涓璞?鏄嬌鐢ㄤ綅鎷瘋礉寤虹珛瀵硅薄,榪欑鎯呭喌涓嬬紪璇戝櫒浼?xì)璋冪敤鎷疯礉鏋勯犲嚱鏁?濡傛灉娌℃湁緙栬瘧鍣ㄤ細(xì)寤虹珛涓涓己鐪佺殑),浣嗗璞¢攢姣佹椂浼?xì)璋冪敤鏋愭瀯鍑芥? 濡傛灉鎯崇姝㈤氳繃鍊間紶閫掓煇涓璞?鍙澹版槑涓涓鏈夌殑鎷瘋礉鏋勯犲嚱鏁?姝ゆ椂緙栬瘧鍣ㄨ涓虹敤鎴鋒帴綆′簡榪欓」宸ヤ綔,涓嶄細(xì)寤虹珛緙虹渷鐨勬嫹璐濇瀯閫犲嚱鏁?鑰岀敤鎴峰緩绔嬬殑鍑芥暟鏄鏈夌殑,娌℃硶璋冪敤,緙栬瘧鍣ㄥ氨浼?xì)鎶ラ? 鍙互瀹氫箟鎸囧悜綾葷殑鎴愬憳鍙橀噺鍜屾垚鍛樺嚱鏁扮殑鎸囬拡錛岀▼搴忎笉蹇呬嬌鐢ㄥ嚱鏁扮殑鍚嶅瓧灝卞彲浠ヨ皟鐢ㄥ畠錛屾兂璧蜂簡楂橀氱殑CDMA紼嬪簭妗嗘灦.c++緙栫▼鎬濇兂絎?0绔犮?/p>
涓涓寚鍚戝嚱鏁扮殑鎸囬拡: 鍙互閲嶈澆鍑犱箮鎵鏈夌殑榪愮畻絎?浣嗗浜庣幇鍦╟涓病鏈夋剰涔夌殑榪愮畻絎︽槸涓嶈兘閲嶈澆鐨?涔熶笉鑳芥敼鍙樿繍綆楃鐨勫弬鏁頒釜鏁板拰浼樺厛綰? 閲嶈澆榪愮畻絎︾殑榪斿洖鍊?濡傛灉闇瑕佽繑鍥炲璞℃湰韜?鏍規(guī)嵁闇瑕佽繑鍥?br>瀵硅薄鐨勬寚閽堟垨鑰呭紩鐢?濡傛灉鏄繑鍥炰復(fù)鏃剁敓鎴愮殑瀵硅薄,閭d箞榪斿洖瀵硅薄. 閲嶈澆榪愮畻絎︾殑榪斿洖鍊兼槸鍚﹀父閲?褰撹繑鍥炵殑鏄竴涓復(fù)鏃跺煎緱鏃跺?濡?%,&,>>,榪欎簺榪愮畻絎﹀緱鍒扮殑緇撴灉瑕佽祴緇欏彟澶栦竴涓彉閲?榪欐椂榪斿洖鍊兼槸const,濡傛灉榪斿洖鍊肩洿鎺ョ敤浜庡彉閲?濡?=,+=,榪欐槸榪斿洖鍊間笉瑕佸姞const. 鍑芥暟榪斿洖瀵硅薄鐨勬椂鍊?榪斿洖涓涓復(fù)鏃跺璞℃瘮鏂板緩涓涓璞″湪榪斿洖鏁堢巼瑕侀珮寰堝,鍥犱負(fù)榪欐椂璋冪敤鐨勬槸鏅氭瀯閫犲嚱鏁拌屼笉鏄嫹璐濇瀯閫犲嚱鏁?鑰屼笖涓嶉渶瑕佽皟鐢ㄦ瀽鏋勫嚱鏁?铏界劧鏂板緩涓涓璞″啀榪斿洖榪斿洖鐨勪篃鏄竴涓復(fù)鏃跺璞? 鏅鴻兘鎸囬拡(smart pointer):瀵硅薄,鍖呭鍣?榪唬鍣? 鑷姩綾誨瀷杞崲:鍙互緙栫▼瀹炵幇鑷姩綾誨瀷杞崲.濡傞渶瑕佷粠瀵硅薄one鍒皌wo,閭d箞鍙渶瑕佷負(fù)two瀹氫箟涓涓互one&涓哄弬鏁扮殑鏋勯犲嚱鏁?褰撶紪璇戝櫒鍙戠幇闇瑕佽繘琛屼粠瀵硅薄one鍒皌wo鐨勮漿鎹㈢殑鏃跺?浼?xì)鑷姩妫鏌wo鐨勫畾涔?鎵懼埌榪欎釜鏋勯犲嚱鏁?鏋勯犱竴涓猼wo瀵硅薄.濡傛灉闇瑕佹樉寮忕被鍨嬭漿鎹?鍦ㄦ瀯閫犲嚱鏁板墠鍔犱竴涓?explicit 榪樻湁涓縐嶈嚜鍔ㄧ被鍨嬭漿鎹㈡柟娉曟槸:涓洪渶瑕佽漿鎹㈢殑瀵硅薄閲嶈澆涓涓繍綆楃,榪愮畻絎︿互瑕佽漿鎹㈠埌鐨勫璞$殑鍚嶅瓧鍛藉悕.鏃犻』澹版槑榪斿洖鍊? 閲嶈澆璧嬪兼搷浣滅"=",榪斿洖鍙互鏄紩鐢ㄤ篃鍙互鏄?鍓嶈呮晥鐜囪緝楂?浣嗚璁板緱姝ゆ椂榪斿洖鐨勫紩鐢ㄤ笉鑳芥槸灞炰簬灞閮ㄥ璞$殑.閫氬父榪斿洖*this. return String(s1+s2); 涓嶴tring temp(s1+s2);return temp;鐨勬晥鐜囨槸涓嶅悓鐨勶紝鍚庤呰榪涜瀵硅薄鎷瘋礉錛岃屽墠鑰呯洿鎺ュ皢涓存椂瀵硅薄鍒涘緩鍦ㄥ嚱鏁扮殑榪斿洖鍖恒傚悓鏃朵篃鏇村姞綆媧併?/p>
鍑芥暟涓皯鐢╯tatic鍙橀噺銆傝鐩稿悓鐨勮緭鍏ヤ駭鐢熺浉鍚岀殑杈撳嚭錛岃繖鏍風(fēng)殑浠g爜渚夸簬浣跨敤鍜岀淮鎶ゃ?/p>
瀵瑰嚱鏁扮殑鍙傛暟鍜岃繑鍥炲肩殑鏈夋晥鎬ц繘琛屾鏌ャ?/p>
縐瀬浣跨敤鏂█(ASSERT),鍚屾椂瑕佸姞涓婃敞閲婏紝闃叉灝嗘潵蹇樿ASSERT鐨勭洰鐨勩?/p>
涔嬫墍浠ユ湁浜嗘寚閽堣繕瑕佸紩鍏ュ紩鐢紝鏄負(fù)浜嗗鍔熻兘鍔犱互闄愬埗錛岄槻姝㈠彂鐢熸剰澶栵紝灝卞儚瀵瑰弬鏁板姞涓奵onst闄愬畾鐨勭洰鐨勪竴鏍楓?/p>
鍔ㄦ佸垎閰嶅唴瀛樼殑鍘熷垯: 瑕佺敵璇蜂竴鍧楀唴瀛樺鍒舵暟緇刢har a[]鐨勫唴瀹?搴旇鐢寵鐨勫唴瀛樺ぇ灝忔槸sizeof(char)*(strlen(a)+1); 濡傛灉閫氳繃鍙傛暟浼犻掓暟緇?鏁扮粍鍚嶈嚜鍔ㄩ鍖栦負(fù)涓涓寚閽? 瀵瑰唴瀛樺垎閰嶅け璐ヨ繘琛屽鐞嗘湁涓ょ鏂規(guī)硶: unsigned涓庢病鏈塽nsigned 綾誨瀷鍙槸琛ㄧず鑼冨洿涓嶅悓,澶у皬鐩稿悓. 濡傛灉涓嶇粰綾誨畾涔夋嫹璐濇瀯閫犲嚱鏁板拰璧嬪煎嚱鏁幫紝濡傛灉綾諱腑鏈夋寚閽堝彉閲忥紝灝變細(xì)瀵艱嚧閿欒錛屽鏋滄寚閽堟寚鍚戝姩鎬佸唴瀛樺尯錛岄偅榪欏潡鍐呭瓨浼?xì)涓㈠け锛岃屼袱涓寚閽堢浉鍚屼竴涓潡鍐呭瓨錛屽鑷村叾鍊兼棤娉曞垽瀹氾紝鑰屼笖涓や釜鍑芥暟鐨勬瀽鏋勫嚱鏁頒細(xì)灝嗚繖鍧楀唴瀛橀噴鏀句袱嬈★紝瀵艱嚧鍑洪敊銆?br>String a("hello"); 鍦ㄧ戶鎵垮綋涓紝鏋勯犲嚱鏁幫紝鏋愭瀯鍑芥暟錛岃祴鍊煎嚱鏁伴兘涓嶈兘琚戶鎵匡紝鍦ㄧ紪鍐欏瓙綾繪椂瑕佹敞浠ヤ笅鍑犵偣錛?br>1瀛愮被蹇呴』鍦ㄦ瀯閫犲嚱鏁扮殑鍒濆鍖栬〃璋冪敤鍩虹被鐨勬瀯閫犲嚱鏁般?br>2鐖剁被鍜屽瓙綾葷殑鏋愭瀯鍑芥暟閮藉繀欏繪槸virtual.//鐢ㄤ簬澶氭併?br>3瀛愮被璧嬪煎嚱鏁拌璋冪敤鐖剁被鐨勮祴鍊煎嚱鏁幫細(xì)Base::operater=(other); 閲嶈澆new鍜宒elete鐨勫師鍥犳湁涓や釜錛氶渶瑕佸弽澶嶅垎閰嶅唴瀛橈紝闇瑕佷翰鑷仛榪欎釜宸ヤ綔鎻愰珮鏁堢巼錛岃繕鏈夊氨鏄噺灝戝唴瀛樼鐗囷紝姣斿鍙互棣栧厛浣跨敤闈欐佹垚鍛樻寚閽堜繚鐣欏緢澶т竴鍧楀唴瀛?鍦ㄩ潤鎬佸瓨鍌ㄥ尯)錛屽湪鍏朵腑瀹屾垚鍐呭瓨鐨勫垎閰嶏紝騫惰嚜宸辨爣璁板垎閰嶅拰閲婃斁錛岄噴鏀劇殑鏃跺欙紝鍙槸鏍囪鍐呭瓨錛岃屼笉free閲婃斁銆?br>閲嶈澆鐨刵ew鍜宒elete鍙畬鎴愬唴瀛樼殑鍒嗛厤鍜屽洖鏀跺伐浣溿俷ew鎺ュ彈size_t鍑芥暟錛屽畬鎴愬唴瀛樼殑鍒嗛厤錛岃繑鍥炰竴涓獀oid*鎸囬拡錛宒elete鎺ュ彈涓涓獀oid*鎸囬拡錛屽皢瀹冮噴鏀俱?br>娉ㄦ剰閲嶈澆new鍜宒elete鏈変袱縐嶄笉鍚岀殑褰㈠紡錛屼竴涓敤浜庢瘡嬈″垱寤轟竴涓璞★紝鍙︿竴涓敤鏉ュ垱寤轟竴涓璞℃暟緇勶紝闇瑕佸姞涓奫]銆傚鏋滈噸杞戒簡鍓嶈咃紝閭d箞鍦ㄥ垱寤哄璞℃暟緇勭殑鏃跺欙紝緋葷粺浼?xì)璋冪敤鍏ㄥ眬鐨刵ew鍜宒elete. 鍙戠幇涓涓湁瓚g殑鐜拌薄錛屽彲浠ヤ嬌鐢ㄥ間負(fù)NULL鐨勬寚閽堣皟鐢ㄤ換鎰忓璞$殑鎴愬憳鍑芥暟錛屽彧瑕佸厛寮哄埗杞崲鍒拌繖涓璞★紝騫朵笖璋冪敤鐨勬槸綰唬鐮併?/p>
鎴愬憳瀵硅薄鐨勫垵濮嬪寲鍙互鍜岀埗綾繪瀯閫犲嚱鏁扮殑璋冪敤騫舵帓鏀懼湪鍒濆鍖栬〃銆?/p>
鍦ㄨ繘鍏ユ瀯閫犲嚱鏁扮殑宸︽嫭鍙峰墠錛屾墍鏈夌殑鎴愬憳鍙橀噺閮藉繀欏昏鍒濆鍖栥?/p>
鏋勯犲嚱鏁幫紝鏋愭瀯鍑芥暟錛岃祴鍊艱繍綆楄祴涓嶈緇ф壙銆?/p>
綾葷殑鍙嬪厓鑳藉璁塊棶鍏秔rivate,protected鎴愬憳錛屽瓙綾昏兘璁塊棶綾葷殑protected鎴愬憳銆?/p>
涓嶈鍦ㄦ瀽鏋勫嚱鏁頒腑鎶涘嚭寮傚父錛屽洜涓哄紓甯稿鐞嗗嚱鏁板湪鑾峰緱寮傚父鍚庤璋冪敤鏋愭瀯鍑芥暟娓呯悊瀵硅薄錛屾鏃跺啀鍙戠敓寮傚父浼?xì)瀵艰嚧绋嬪簭鏃犳硶鍐嶆崟鑾峰紓甯稿Q屽彧鑳界粓姝紙鍙兘鍦ㄨ嚜瀹氫箟鐨剆et_terminate()涓綔鏈鍚庣殑澶勭悊銆傦級銆?/p>
鎷瘋礉瀛楃涓茬殑鏂規(guī)硶 寮傚父澶勭悊鍑芥暟浼?xì)棣栧厛璋冪敤鎵鏈夊湪try鍧椾腑鍒涘緩浜嗙殑瀵硅薄鐨勬瀽鏋勫嚱鏁幫紝鐒跺悗鎵ц寮傚父澶勭悊鍑芥暟錛岀劧鍚庣戶緇繍琛屽悗闈㈢殑紼嬪簭銆備絾闂鏄紝濡傛灉涓涓瀽鏋勫嚱鏁板嚭鐜頒簡寮傚父錛屽湪鏋愭瀯鍑芥暟涓紓甯稿墠鍒涘緩鐨勫爢涓婄殑鎵鏈夊璞¢兘鏃犳硶璋冪敤鍏舵瀽鏋勫嚱鏁版甯擱攢姣併傛柟娉曟槸浣跨敤妯℃澘錛屽茍鑷垵濮嬪寲琛ㄥ垱寤鴻繖浜涙ā鏉垮璞°?/p>
set_unexpceted鍙互鎴幏娌℃湁琚嚱鏁板紓甯歌鏍艱鏄庡寘鎷緱寮傚父錛岃繕鍙互綆鍗曠殑鐢ㄤ竴涓猼hrow;灝嗚繖涓紓甯鎬綔涓哄凡鐭ュ紓甯稿啀嬈℃姏鍑猴紝濡傛灉鏈夌浉搴旂殑catch璇彞錛岄偅涔堝氨鍙互鎹曡幏榪欎釜寮傚父銆?/p>
鎶涘嚭寮傚父鐨勫瓙綾伙紝浼?xì)琚兘澶熸崟鑾峰叾鐖毒c誨紓甯哥殑澶勭悊鍣ㄦ崟鑾楓傝繖鏃朵細(xì)浜х敓鍒囩墖錛屽嵆澶勭悊鍣ㄦ敹鍒扮殑鏄竴涓埗綾伙紝浣跨敤寮曠敤鑰屼笉鏄紶閫掑煎彲浠ラ伩鍏嶈繖涓棶棰樸?br> try dynamic_cast<>鐢ㄤ簬鍚戜笅鏄犲皠銆?br>base* b=new derived; RTTI榪樺彲浠ヤ嬌鐢╰ypeinfo().name()鐨勬柟娉曡繑鍥炲璞d銆倀ypeinfo()榪斿洖typeinfo瀵硅薄錛屼嬌鐢ㄥ墠瑕佸寘鍚ご鏂囦歡typeinfo.h. class B B* p=new D; typeid(p)==typeid(B*) 瀵瑰紩鐢ㄧ殑鍔ㄦ佹槧灝勪篃瑕佸埗瀹氬埌涓涓紩鐢ㄤ笂錛屽鏋滃け璐ヤ笉鏄繑鍥濶ULL,鍥犱負(fù)搴旂敤涓嶈涓虹┖錛岃屾槸浜х敓涓涓紓甯革紝鍥犳瀵瑰紩鐢ㄧ殑鍔ㄦ佹槧灝勫繀欏諱嬌鐢ㄥ紓甯稿鐞嗐?/p>
瀵圭┖鎸囬拡浣跨敤typeid()涔熶細(xì)浜х敓寮傚父錛屽彲浠ュ湪浣跨敤涔嬪墠媯(gè)鏌ユ寚閽堟槸鍚︿負(fù)NULL鏉ラ伩鍏嶈繖涓棶棰樸?/p>
鍦ㄥ閲嶇戶鎵跨殑鎯呭喌涓嬶紝浼犵粺鐨勫己鍒剁被鍨嬭漿鎹㈠彲鑳芥棤娉曟甯稿伐浣滐紝浣嗗姩鎬佹槧灝勫拰typeid宸ヤ綔鐨勫緢濂姐?/p>
瑕佹槸鍔ㄦ佺被鍨嬬被鍨嬭漿鎹紝闇瑕佸熀綾誨寘鍚玽irtual鎴愬憳鍑芥暟錛屽茍涓攙c緙栬瘧鍣ㄦ湁/GR閫夐」銆傜粡榪囧姩鎬佺被鍨嬭漿鎹紝鐢辯埗綾昏漿鎹㈣屾潵鐨勫瓙綾繪寚閽堝彲浠ヨ皟鐢ㄥ瓙綾諱腑鏂版坊鍔犺岀埗綾諱腑娌℃湁鐨勬柟娉曘?/p>
static_cast 閫氬父涓嶆槸蹇呴渶鐨勶紝浣嗗畠浼?xì)璁┚c誨瀷杞崲鏇村姞閱掔洰銆?/p>
const_cast鐢ㄤ簬灝嗗父閲忓拰volatile鏄犲皠緇欐櫘閫氭寚閽堛?/p>
reinterpret_cast鏄嵄闄╁茍涓斿彲縐繪鎬у緢宸殑杞崲錛屽畠?yōu)畣瀵硅薄鐪嬩綔浜寴q涘埗鏁拌繘琛岃漿鎹€傛渶濂戒笉瑕佷嬌鐢ㄣ?/p>
C++涓紝灝嗙粨鏋勫悕鐩存帴浣滀負(fù)綾誨瀷鍚嶄嬌鐢紝鑰屼笉闇瑕佽薄c涓偅鏍蜂嬌鐢╰ypedef struct 緇撴瀯鍚峽} 綾誨瀷鍚? WINDOWS鏍稿績緙栫▼ 鍐呮牳瀵硅薄鐨勫畨鍏ㄥ睘鎬ч氬父鍦ㄥ垱寤烘湇鍔″櫒紼嬪簭鐨勬椂鍊欑敤鍒幫紝浼犻掍竴涓狽ULL鍙互鑾峰緱緙虹渷鐨勫畨鍏ㄥ睘鎬с?/p>
褰撲笉鍐嶄嬌鐢ㄦ煇涓唴鏍稿璞$殑鏃跺欙紝鍙互浣跨敤BOOL CloseHandle(HANDLE)鍏抽棴鍙ユ焺錛岀郴緇熶細(xì)鑷姩灝嗗唴鏍稿璞′俊鎭竻闄ゅ嚭榪涚▼鐨勫彞鏌勮〃錛堟鍙ユ焺琛ㄤ繚瀛樹笖浠呬繚瀛樿榪涚▼浣跨敤鐨勬墍鏈夊唴鏍稿璞′俊鎭傦級錛屽茍鑷姩涓哄唴鏍稿璞$殑寮曠敤璁℃暟鍑忎竴銆傚鏋滃繕璁板叧闂彞鏌勪篃涓嶈绱э紝鍦ㄨ繘紼嬫帹鍑哄悗錛岀郴緇熶細(xì)鑷姩媯(gè)鏌ヨ繘紼嬬殑鍙ユ焺琛紝娓呯悊娌℃湁閲婃斁鐨勫彞鏌勶紝鍥犳蹇樿鍏抽棴鍙ヤ笉涓瀹氫細(xì)閫犳垚鍐呭瓨娉勬紡銆?/p>
紼嬪簭鐨勮繘鍏ョ偣WinMain鐨勭涓涓弬鏁版椂榪涚▼鐨勫疄渚嬪彞鏌勶紝涔熸槸榪涚▼鏄犲皠鍒拌櫄鎷熷湴鍧絀洪棿鐨勮搗濮嬪湴鍧錛寁c++榛樿鏄?x00400000.鍙互鐢℅etModuleHandle()寰楀埌榪欎釜鍊?br>PTSTR GetCommandLine()鑾峰緱鍛戒護(hù)琛?br>PWSTR CommandLineToArgvW()鍒嗚В鍛戒護(hù)琛?/p>
姣忎釜榪涚▼閮芥湁涓涓笌浠栫浉鍏崇殑鐜鍧椼?br>VarName1=VarValue1\0 GetEnvironmentVariable() //鑾峰緱鐜鍙橀噺鍊?br>ExpandEnvironmentStrings()//灞曞紑%鍖呰9鐨勭幆澧冨彉閲忓?br>SetEnvironmentVariable() //璁懼畾鐜鍙橀噺 榪涚▼鐨勪翰緙樻э細(xì)榪涚▼鐨勭嚎紼嬭寮鴻揩鍐岰PU鐨勫瓙闆嗕笂榪愯銆?/p>
瀛愯繘紼嬮粯璁ょ戶鎵跨埗榪涚▼鐨勯敊璇爣蹇椼?br>SetErrorMode(UINT) //璁懼畾閿欒妯″紡 榪涚▼緇存姢褰撳墠椹卞姩鍣ㄥ拰鐩綍淇℃伅 鑾峰緱緋葷粺鐗堟湰錛?br>GetVersion() windows2000鏀寔浣滀笟綆$悊錛?閫氳繃灝嗚繘紼嬪姞鍏ヤ綔涓氾紝鍙互瀵硅繘紼嬬殑榪愯鏉冮檺錛屼嬌鐢ㄧ殑璧勬簮榪涜闄愬埗銆傛柟娉曞涓嬶細(xì) 緇堟浣滀笟涓墍鏈夎繘紼嬬殑榪愯 鏌ヨ浣滀笟緇熻淇℃伅 鐩戣浣滀笟鐨勮繍琛岋細(xì) 榪涚▼鐢變袱閮ㄥ垎緇勬垚錛氳繘紼嬪唴鏍稿璞★紝 鍦板潃絀洪棿銆傝繘紼嬫槸涓嶆椿娉肩殑錛屽畠鐨勬墽琛屼緷璧栦簬綰跨▼銆?br>綰跨▼鐢變袱閮ㄥ垎緇勬垚錛氱嚎紼嬪唴鏍稿璞★紝綰跨▼鍫嗘爤銆?/p>
媯(gè)鏌ョ嚎紼嬫槸鍚﹂鍑猴細(xì) 鑾峰緱榪愯鏃墮棿錛?br>GetProcessTimes() 綰跨▼鎴栬繘紼嬬殑浼彞鏌勮漿鍖栦負(fù)瀹炲彞鏌勶細(xì) 浼彞鏌勭敤浜庢湰綰跨▼錛岃幏寰楄繖涓彞騫朵笉浼?xì)濯?jiǎng)鍝嶅唴鏍稿璞$殑璁℃暟錛岃屽疄鍙ユ焺鐢ㄤ簬浼犻掔粰瀛愯繘紼嬨?/p>
綰跨▼鐨勬殏鍋滃拰榪愯錛?br>ResumeThread(HANDLE) 綰跨▼浼戠湢錛?br>Sleep(DWORD dwMilliseconds); 鍙互鑾峰緱鍜屼慨鏀圭嚎紼嬬殑涓婁笅鏂囷紝浣跨敤涔嬪墠瑕丼uspendThread() 鏀瑰彉榪涚▼鐨勪紭鍏堢駭://璁頒綇榪涚▼鏄笉鍙互璋冨害鐨勶紝璋冨害鐨勫崟浣嶆槸綰跨▼銆?br>BOOL銆SetPriorityClass(); 璁懼畾綰跨▼鐨勭浉瀵逛紭鍏堢駭錛?br>int GetThreadPriority(HANDLE hThread); Microsoft淇濈暀浜嗛殢鏃朵慨鏀硅皟搴︾畻娉曠殑鏉冨埄錛屽洜姝や嬌鐢ㄧ浉瀵逛紭鍏堢駭錛屽彲浠ヤ繚璇佺▼搴忓湪灝嗘潵鐨勭郴緇熶笂涔熷彲浠ユ甯歌繍琛屻?br>緇撳悎榪涚▼浼樺厛綰у拰綰跨▼鐨勭浉瀵逛紭鍏堢駭錛屽氨鍙互寰楀埌綰跨▼鐨勫熀鏈紭鍏堢駭銆傜嚎紼嬬殑褰撳墠浼樺厛綰т笉鍙互浣庝簬鍩烘湰浼樺厛綰э紝 浜茬紭鎬ф槸瀵瑰澶勭悊鍣ㄧ郴緇熸潵璇寸殑錛屼負(fù)浜嗚兘鍒╃敤淇濈暀鍦╟pu楂橀熺紦瀛樺拰NUMA(闈炵粺涓鍐呭瓨璁塊棶錛夌粨鏋勮綆楁満鏈彃浠舵澘涓婂唴瀛樹腑鐨勬暟鎹紝緋葷粺灝介噺綰跨▼涓婃榪愯浣跨敤鐨凜PU鏉ヨ繍琛岀嚎紼嬶紝鍖呮嫭杞翰緙樻э紙WIN2000榛樿錛夊拰紜翰緙樻э紙鐢ㄦ埛鍙互閫夋嫨CPU) 涓寸晫鍖轟繚璇佸叾涓殑璧勬簮錛堥氬父鏄悇縐嶅叡浜彉閲忥級琚師瀛愮殑璁塊棶錛屽綋榪涘叆涓寸晫鍖哄悗錛屽叾浠栬闂繖浜涜祫婧愮殑綰跨▼灝嗕笉浼?xì)琚皟搴︺?/p>
綰跨▼鍚屾鍖呮嫭鐢ㄦ埛鏂瑰紡鍜屽唴鏍告柟寮忥紝鐢ㄦ埛鏂瑰紡鍖呮嫭鍘熷瓙鎿嶄綔鍜屼復(fù)鐣屽尯錛屽畠鐨勭壒鐐規(guī)槸閫熷害蹇紝浣嗗姛鑳芥湁闄愩傚唴鏍告柟寮忓埄鐢ㄥ唴鏍稿璞$殑閫氱煡鐘舵佹潵鍚屾綰跨▼錛岀敱浜庨渶瑕佺敱鐢ㄦ埛鏂瑰紡鍒囨崲鍒板唴鏍告柟寮忥紙榪欑鍒囨崲寰堝簾鏃墮棿錛夛紝涓旂郴緇熻榪涜寰堝鎿嶄綔錛屾晥鐜囪緝浣庯紝浣嗗姛鑳藉己澶э紙鑳藉璁懼畾瓚呮椂鍊肩瓑,鍙互鍚屾澶氫釜榪涚▼鐨勭嚎紼嬶級銆?/p>
鍐呮牳鏂瑰紡鍚屾鐨勫師鐞嗭細(xì)綰跨▼浣胯嚜宸辮繘鍏ヤ紤鐪犵姸鎬侊紝絳夊緟鍐呮牳瀵硅薄鐢辨湭閫氱煡鐘舵佸彉涓哄凡閫氱煡鐘舵併?/p>
鍙浜庢湭閫氱煡鐘舵佸彉鍜屽凡閫氱煡鐘舵佺殑鍐呮牳瀵硅薄錛氳繘紼嬶紝綰跨▼錛屼綔涓氾紝鏂囦歡淇敼閫氱煡錛屾椂闂達(dá)紝鍙瓑寰呭畾鏃跺櫒錛屾枃浠訛紝鎺у埗鍙拌緭鍏ワ紝淇″彿閲忥紝浜掓枼浣撱?/p>
榪涚▼鍜岀嚎紼嬪湪寤虹珛鏃跺浜庢湭閫氱煡鐘舵侊紝鍦ㄩ鍑烘椂鍙樹負(fù)宸查氱煡鐘舵併?/p>
絳夊緟鍑芥暟錛?br>DWORD WaitForSingleObject(HANDLE hObject,DWORD dwMilliseconds); 浜嬩歡鍐呮牳瀵硅薄錛氭湁涓ょ錛屼漢宸ヤ簨浠跺璞★細(xì)褰撳畠寰楀埌閫氱煡鐨勬椂鍊欙紝鎵鏈夌瓑寰呯殑綰跨▼閮藉彉涓哄彲璋冨害綰跨▼錛涜嚜鍔ㄩ噸緗殑浜嬩歡錛氬綋浜嬩歡寰楀埌閫氱煡鐨勬椂鍊欙紝鍙湁涓涓瓑寰呯嚎紼嬪彉涓哄彲璋冨害鐨勭嚎紼嬨傚垱寤轟簨浠跺唴鏍稿璞★細(xì) 絳夊緟瀹氭椂鍣ㄥ唴鏍稿璞★細(xì)鏄湪鏌愪釜鏃墮棿鎴栨寜瑙勫畾鐨勯棿闅旀椂闂村彂鍑鴻嚜宸辯殑淇″彿閫氱煡鐨勫唴鏍稿璞°?br>HANDLE CreateWaitableTimer(PSECURITY_ATTRIBUTES psa,BOOL fManualReset,PCSTR pszName); 淇″彿閲忓唴鏍稿璞?br>濡傛灉褰撳墠璧勬簮鐨勬暟閲忓ぇ浜?錛屽彂鍑轟俊鍙?br>濡傛灉褰撳墠璧勬簮鏁伴噺絳変簬0錛屼笉鍙戝嚭淇″彿 浜掓枼浣撳唴鏍稿璞★細(xì)浜掓枼浣撶‘淇濆鍗曚釜璧勬簮鐨勪簰鏂ヨ闂傚畠鍖呭惈涓涓嬌鐢ㄦ暟閲忥紝涓涓嚎紼婭D,涓涓掑綊璁℃暟鍣?br>涓庝復(fù)鐣屽尯鐨勫尯鍒細(xì)鑳藉鍚屾澶氫釜榪涚▼涓殑綰跨▼錛屽彲浠ヨ瀹氳秴鏃跺箋?br>濡傛灉ID涓?錛岄偅涔堣〃紺烘病鏈夌嚎紼嬪崰鐢ㄤ簰鏂ヤ綋錛屼簰鏂ヤ綋鍙戝嚭淇″彿銆?br>濡傛灉ID涓嶄負(fù)0錛岃〃紺哄崰鐢ㄨ祫婧愮殑綰跨▼ID錛屼笉鍙戝嚭淇″彿銆?/p>
HANDLE CreateMutex(PSECURITY_ATTRIBUTES psa, 閲婃斁璧勬簮錛?br>BOOL ReleaseMutex(HANDLE hMutex); 棰濆鐨勫嚱鏁幫細(xì) windows2000鎻愪緵浜嗗涓嬪嚑縐嶇嚎紼嬫睜鍑芥暟鐢ㄤ簬綰跨▼綆$悊錛?br>涓銆佸紓姝ヨ皟鐢ㄥ嚱鏁? 綰跨▼姹犱笉鑳借緗嚎紼嬩釜鏁扮殑涓婇檺錛屽惁鍒欐帓闃熶釜鏁拌秴榪囩嚎紼嬩釜鏁頒笂闄愮殑鏃跺欙紝浼?xì)瀵艰嚧鎵鏈夌殑綰跨▼閮借涓柇銆?/p>
宸ヤ綔欏圭洰鍑芥暟濡傛灉璁塊棶浜嗗凡緇忚鍗歌澆鐨凞LL,浼?xì)漶旂敓杩濊璁块棶銆?/p>
鍒犻櫎瀹氭椂鍣細(xì) 閲嶆柊璁懼畾瀹氭椂鍣細(xì)//涓嶈兘淇敼宸茬粡瑙﹀彂鐨勫崟姝ュ畾鏃跺櫒銆?br>BOOL ChangeTimerQueueTimer( 鍒犻櫎瀹氭椂鍣ㄩ槦鍒楋細(xì) 涓夈佸綋鍗曚釜鍐呮牳瀵硅薄鍙樹負(fù)宸查氱煡鐘舵佹椂璋冪敤鍑芥暟 dwFlags鍙互浼犻掑弬鏁幫細(xì)WT_EXECUTEINWAITTHREAD,瀹冭絳夊緟緇勪歡寰楃嚎紼嬩箣涓榪愯宸ヤ綔欏圭洰鍑芥暟銆傛敞鎰忛」鍚屽墠銆?/p>
濡傛灉絳夊緟鐨勫唴鏍稿璞℃槸鑷姩閲嶇疆鐨勶紝閭d箞浼?xì)瀵艰嚧宸ヤ綔鍑芥暟琚弽澶嶈皟鐢ㄥQ屼紶閫扺T_EXECUTEONLYONCE浼?xì)閬垮厤杩櫩U嶆儏鍐點(diǎn)?/p>
鍙栨秷絳夊緟緇勪歡鐨勬敞鍐岀姸鎬侊細(xì) 鍥涖佸綋寮傛I/O璇鋒眰瀹屾垚鏃惰皟鐢ㄥ嚱鏁?br>灝嗚澶囧拰綰跨▼姹犵殑闈濱/O緇勪歡鍏寵仈 宸ヤ綔鍑芥暟鍘熷瀷錛?br>VOID WINAPI OverlappedCompletionRoutine( Windows鐨勫唴瀛樼粨鏋?/p>
浠?8錛?000錛屽埌64浣嶇殑windows,鍐呭瓨綆$悊鏂瑰紡閮芥槸涓嶅悓鐨勶紝32浣嶇殑win2000鐢ㄦ埛鍐呭瓨鏄粠0x10000鍒?x7fffffff錛?4kB-2G),2000 Advanced server鍙互杈懼埌錛?4kB-3G),鍏朵腑鏈楂?4kB涔熸槸紱佹榪涘叆鐨勩傚啀寰涓婂垯鐢辯郴緇熶嬌鐢ㄣ?8鍒欐槸浠?x400000-0x7fffffff(4M-2G),2G-3G鏄郴緇熺敤鏉ュ瓨鏀?2浣嶅叡浜暟鎹殑鍦版柟錛屽寰堝緋葷粺鍔ㄦ佽繛鎺ュ簱銆?-4M鏄負(fù)浜嗗吋瀹?6浣嶇▼搴忎繚鐣欑殑銆?G-4G鐢辯郴緇熻嚜韜嬌鐢ㄣ?8鐨勫唴鏍稿尯鏄笉鍙椾繚鎶ょ殑錛?000鍙椾繚鎶ゃ?br>瀵硅櫄鎷熷湴鍧絀洪棿鐨勫垎閰嶇О浣滀繚鐣欙紝浣跨敤铏氭嫙鍐呭瓨鍒嗛厤鍑芥暟(VirtualAlloc),閲婃斁浣跨敤VirtualFree(),鐩墠錛屾墍鏈塩pu騫沖彴鐨勫垎閰嶇矑搴﹂兘鏄?4kB,欏甸潰澶у皬鍒欎笉鍚岋紝x86鏄?kB,Alpha鏄?kB,緋葷粺鍦ㄤ繚鐣欏唴瀛樼殑鏃跺欒瀹氳浠庡垎閰嶇矑搴﹁竟鐣屽紑濮嬶紝騫朵笖鏄〉闈㈢殑鏁存暟鍊嶏紝鐢ㄦ埛浣跨敤VirtualAlloc閮介伒瀹堣繖涓瀹氾紝浣嗙郴緇熶笉鏄紝瀹冩槸浠庨〉闈㈣竟鐣屽紑濮嬪垎閰嶇殑銆?/p>
灝嗙墿鐞嗗瓨鍌ㄥ櫒鏄犲皠鍒頒繚鐣欑殑鍐呭瓨鍖哄煙鐨勮繃紼嬬О涓烘彁浜ょ墿鐞嗗瓨鍌ㄥ櫒錛屾彁浜ゆ槸浠ラ〉闈負(fù)鍗曚綅榪涜鐨勶紝涔熶嬌鐢╒irtualAlloc鍑芥暟銆?/p>
鐗╃悊瀛樺偍鍣ㄦ槸鐢卞唴瀛樺拰錛堢‖鐩樹笂鐨勶級欏墊枃浠剁粍鎴愮殑錛屽鏋滆闂殑鏁版嵁鏄湪欏墊枃浠朵腑錛屽垯縐頒負(fù)欏甸潰澶辨晥錛宑pu浼?xì)鎶婅畨K棶閫氱煡鎿嶄綔緋葷粺錛屾搷浣滅郴緇熻礋璐e皢鏁版嵁璋冨叆鍐呭瓨錛屽茍鎸囧cpu鍐嶆榪愯涓婃澶辨晥鐨勬寚浠ゃ?/p>
褰撳惎鍔ㄤ竴涓▼搴忕殑鏃跺欙紝緋葷粺騫朵笉鏄皢鏁翠釜鏂囦歡璇誨叆鍐呭瓨鎴栬呴〉鏂囦歡錛岃屾槸灝嗚繖涓枃浠剁洿鎺ユ槧灝勫埌铏氭嫙鍐呭瓨絀洪棿錛屽茍灝嗛渶瑕佺殑鏁版嵁璇誨叆鍐呭瓨錛屽嵆灝嗙‖鐩樹笂鐨勬枃浠舵湰韜綋浣滈〉鏂囦歡錛堣櫧鐒朵笉鏄級銆傚綋紜洏涓婄殑涓涓▼搴忕殑鏂囦歡鏄犲儚錛堣繖鏄釜exe鏂囦歡鎴栬卍ll鏂囦歡錛夌敤浣滃湴鍧絀洪棿鐨勭墿鐞嗗瓨鍌ㄥ櫒錛屽畠縐頒負(fù)鍐呭瓨鏄犲皠鏂囦歡銆傚綋涓涓?exe鎴栬卍ll鏂囦歡琚姞杞芥椂錛岀郴緇熷皢鑷姩淇濈暀涓涓湴鍧絀洪棿鐨勫尯鍩燂紝騫跺皢璇ユ枃浠舵槧灝勫埌璇ュ尯鍩熶腑銆備絾緋葷粺涔熸彁渚涗簡涓緇勫嚱鏁幫紝鐢ㄤ簬灝嗘暟鎹枃浠舵槧灝勫埌涓涓湴鍧絀洪棿鐨勫尯鍩熶腑銆?/p>
榪樻湁涓変釜鐗規(guī)畩鐨勪繚鎶ゅ睘鎬э細(xì)PAGE_NOCACHE PAGE_WRITECOMBINE PAGE_GUARD,鍓嶄袱涓敤浜庨┍鍔ㄧ▼搴忓紑鍙戯紝鏈鍚庝竴涓彲浠ヨ搴旂敤紼嬪簭鍦ㄩ〉闈㈣鍐欏叆鐨勬椂鍊欒幏寰椾竴涓紓甯搞?/p>
鍧楃殑鎰忔濇槸涓緇勭浉閭?cè)潥剻宓闈㈠Q屽畠浠叿鏈夌浉鍚岀殑淇濇姢灞炴э紝騫朵笖鍙楃浉鍚岀被鍨嬬殑鐗╃悊瀛樺偍鍣ㄦ敮鎸併?br>璧嬩簣铏氭嫙鍐呭瓨欏甸潰淇濇姢灞炴х殑鎰忎箟鏄負(fù)浜嗘彁楂樻晥鐜囷紝鑰屼笖榪欎釜灞炴ф諱細(xì)琚墿鐞嗗瓨鍌ㄥ櫒鐨勪繚鎶ゅ睘鎬у彇浠c?/p>
濡傛灉鏁版嵁鍦ㄥ唴瀛樹腑娌℃湁瀵歸綈錛岄偅涔坈pu瑕佸嬈¤闂墠鑳藉緱鍒版暟鎹紝鏁堢巼寰堜綆銆?/p>
鍐呭瓨綆$悊鍑芥暟錛?/p>
鑾峰緱緋葷粺淇℃伅錛?br>VOID GetSystemInfo(LPSYSTEM_INFO psinf);//鍙互寰楀埌欏甸潰澶у皬錛屽垎閰嶇矑搴︼紝鏈澶у唴瀛樺湴鍧錛屾渶灝忓唴瀛樺湴鍧銆?/p>
鑾峰緱鍐呭瓨鐘舵侊細(xì) 鑾峰緱鍐呭瓨鍦板潃鐨勬煇浜涗俊鎭細(xì) DWORD VirtualQuery( 鍐呭瓨鏄犲皠鏂囦歡鐨勪紭鐐癸細(xì) 榪涚▼鐨勫惎鍔ㄨ繃紼嬶細(xì) 浣跨敤鍐呭瓨鏄犲皠鏂囦歡錛?br>1 鍒涘緩鎴栨墦寮涓涓枃浠跺唴鏍稿璞★細(xì) 3 灝嗘枃浠舵槧灝勫埌榪涚▼鐨勫湴鍧絀洪棿錛?br>PVOID MapViewOfFile( 灝嗘枃浠舵槧鍍忓啓鍏ョ鐩橈細(xì) windows淇濊瘉鍗曚釜鏂囦歡鏄犲皠瀵硅薄鐨勫涓鍥懼叿鏈夌浉鍏蟲с備絾涓嶄繚璇佷絾涓枃浠剁殑澶氫釜鏄犲皠瀵硅薄鏈夌浉鍏蟲с?/p>
浣跨敤MapViewOfFileEx浠f浛MapViewOfFile鍙互璁懼畾鏂囦歡鏄犲皠鐨勫熀鍦板潃錛?br>PVOID MapViewOfFileEx( 浣跨敤鍐呭瓨鏄犲皠鏂囦歡鍦ㄨ繘紼嬮棿鍏變韓鏁版嵁 鍙互鍦ㄩ〉鏂囦歡涓洿鎺ュ垱寤烘枃浠舵槧灝勫璞★紝鏂規(guī)硶鏄粰C(jī)reateFileMapping鍑芥暟鐨刪File鍙傛暟浼犻捍NVALID_HANDLE_VALUE.娉ㄦ剰錛?br>CreateFile()鍑芥暟榪愯澶辮觸涔熶細(xì)榪斿洖榪欎釜鍙傛暟錛屽洜姝や竴瀹氳媯(gè)鏌reateFile錛堬級鐨勮繑鍥炲箋傝浣忥紝鏂囦歡鍑芥暟榪愯澶辮觸鐨勫彲鑳芥уお澶т簡銆?/p>
絎笁绔狅細(xì)澶氫釜榪涚▼鍏變韓瀵硅薄銆?/p>
鍫嗘爤錛氫紭鐐癸細(xì)鍙互涓嶈冭檻鍒嗛厤綺掑害鍜岄〉闈㈣竟鐣屼箣綾葷殑闂錛岄泦涓簿鍔涘鐞嗘墜澶寸殑浠誨姟錛岀己鐐規(guī)槸錛氬垎閰嶅拰閲婃斁鍐呭瓨鍧楃殑閫熷害姣斿叾浠栨満鍒舵參錛屽茍涓旀棤娉曠洿鎺ユ帶鍒剁墿鐞嗗瓨鍌ㄥ櫒鐨勬彁浜ゅ拰鍥炴敹銆?/p>
榪涚▼鐨勯粯璁ゅ爢鏍堟槸1MB,鍙互浣跨敤/HEAP閾炬帴寮鍏寵皟鏁村ぇ灝忥紝DLL娌℃湁鐩稿叧鐨勫爢鏍堛?/p>
鍫嗘爤鐨勯棶棰樺湪浜庯細(xì)寰堝windows鍑芥暟瑕佷嬌鐢ㄤ復(fù)鏃跺唴瀛樺潡錛岃繘紼嬬殑澶氫釜綰跨▼瑕佸垎閰嶅唴瀛樺潡錛岃繖浜涘唴瀛橀兘鏄湪榛樿鍫嗘爤涓婂垎閰嶇殑錛屼絾瑙勫畾鏃墮棿鍐咃紝姣忔鍙兘鐢變竴涓嚎紼嬭兘澶熷垎閰嶅拰閲婃斁榛樿鍫嗘爤鐨勫唴瀛樺潡錛屽叾浠栨兂瑕佸鐞嗗唴瀛樺潡鐨勭嚎紼嬪繀欏葷瓑寰呫傝繖縐嶆柟娉曞閫熷害鍙堝獎(jiǎng)鍝嶃傚彲浠ヤ負(fù)榪涚▼鐨勭嚎紼嬪垱寤鴻緟鍔╁爢鏍堬紝浣唚indows鍑芥暟鍙兘浣跨敤榛樿鍫嗘爤銆?/p>
鑾峰彇榪涚▼榛樿鍫嗘爤鍙ユ焺錛?br>HANDLE GetProcessHeap(); 鍒涘緩杈呭姪鍫嗘爤鐨勭悊鐢?br>1 淇濇姢緇勪歡錛?br>澶氫釜緇勪歡鐨勬暟鎹販鍚堜氦鍙夌殑瀛樻斁鍦ㄤ竴鍧楀唴瀛橀噷錛岄偅涔堜竴涓粍浠剁殑閿欒鎿嶄綔寰堝鏄撳獎(jiǎng)鍝嶅埌鍙﹀涓涓粍浠躲傝岃瀹氫綅閿欒鐨勬潵婧愬皢鍗佸垎鍥伴毦銆?br>2 鏇存湁鏁堢殑鍐呭瓨綆$悊 鍒涘緩杈呭姪鍫嗘爤錛?br>HANDLE HeapCreate( 浠庡爢鏍堜腑鍒嗛厤鍐呭瓨錛?br>PVOID HeapAlloc( 鏀瑰彉鍐呭瓨鍧楃殑澶у皬錛?br>PVOID HeapReAlloc( 媯(gè)绱㈠唴瀛樺潡鐨勫ぇ灝忥細(xì) 閲婃斁鍐呭瓨鍧? 鎾ら攢鍫嗘爤錛?br>BOOL HeapDestroy(HANDLE hHeap); 浣跨敤杈呭姪鍫嗘爤鐨勬柟娉曪細(xì)閲嶈澆瀵硅薄鐨刵ew鎿嶄綔絎︼紝鍦ㄨ緟鍔╁爢涓婂垎閰嶅唴瀛橈紝騫剁粰瀵硅薄娣誨姞涓涓潤鎬佸彉閲忕敤浜庝繚瀛樺爢鍙ユ焺銆?/p>
鍏跺畠鍫嗘爤鍑芥暟錛?br>鑾峰彇榪涚▼涓墍鏈夊爢鏍堝緱鍙ユ焺錛?br>DWORD GetProcessHeaps(DWORD dwNumHeaps,PHANDLE pHeaps); BOOL HeapLock(HANDLE hHeap); 閬嶅巻鍫嗘爤錛?br>BOOL HeapWalk( 鍚勪釜dll涔熷彲浠ユ湁鑷繁鐨勮緭鍏ヨ〃銆?/p>
濡備綍緙栧啓DLL: 鍏跺畠鐨勫悓緙栧啓鏅欳++紼嬪簭瀹屽叏鐩稿悓銆?"C" 琛ㄧず鎸塁鏂瑰紡閾炬帴鍜岃皟鐢ㄥ嚱鏁般侰++緙栬瘧鍣ㄧ己鐪佹寜鐓_stdcall鏂瑰紡緙栬瘧鍜岃皟鐢紝榪欑鏂瑰紡浼?xì)鏀瑰彉鍑芥暟鐨勫唴閮ㄥ悕瀛椼傛澶勫鏋滄妸"C"閮藉幓鎺変篃鍙互錛屼絾C紼嬪簭灝嗘棤娉曡皟鐢ㄣ傚彟澶栵紝浣跨敤GetProcAddress鍑芥暟鏃朵篃浼?xì)鍙戠敓鍥伴毦锛屽洜湄?fù) 涓ゆ璋冪敤LoardLibrary騫朵笉浼?xì)瑁呰浇涓啤dll鏂囦歡錛屽彧鏄皢dll鏄犲皠榪涜繘紼嬬殑鍦板潃絀洪棿銆傜郴緇熶細(xì)鑷姩涓烘瘡涓繘紼嬬淮鎶や竴涓猟ll鐨勮鏁般侳reeLiabray浼?xì)鋴设鏁板噺涓錛屽鏋滆鏁頒負(fù)0錛岀郴緇熷氨浼?xì)灏哾ll浠庤繘紼嬬殑鍦板潃絀洪棿鍗歌澆銆?/p>
DWORD GetModuleFileName( 鍑犱釜鍑芥暟鐨勭敤娉曪細(xì)錛堟敞鎰廏etProcAddress()鍑芥暟鐨勭敤娉曪紝濡備綍瀹氫箟鍜屼嬌鐢ㄤ竴涓嚱鏁版寚閽堬級 int main() } return 0; BOOL IsCharAlpha(TCHAR ch); 綰跨▼鏈湴瀛樺偍(TLS):涓鴻繘紼嬬殑姣忎釜綰跨▼瀛樺偍縐佹湁鏁版嵁銆傜敤浜庨偅浜涗竴嬈′紶閫掑弬鏁板悗澶氭璋冪敤鐨勫嚱鏁幫紙鍑芥暟浼?xì)淇濆瓨涓妺啤璋冪敤鐨勬暟鎹Q夈?br>瀹炵幇鏂規(guī)硶錛氳繘紼嬩腑鏈変竴涓綅鏍囧織鏍?wèi)缁勫Q坵in2000鐨勮繖涓暟緇勫ぇ灝忚秴榪?000錛夈傚湪姣忎釜綰跨▼涓湁涓涓搴旂殑PVOID鏁扮粍銆傞氳繃璁懼畾浣嶆爣蹇楁爲(wèi)緇勭殑鏌愪釜浣嶆潵鍒嗛厤姣忎釜綰跨▼涓殑PVOID鏁扮粍寰楃浉搴斿崟鍏冦傚嚱鏁伴渶瑕佹瘡嬈℃绱㈢嚎紼嬬殑PVOID鏁扮粍錛岃幏寰楄綰跨▼鐨勭浉搴旀暟鎹?/p>
DWORD TlsAlloc(); //涓烘瘡涓嚎紼嬪垎閰嶄竴涓┖鐨凱VOID鏁扮粍鍗曞厓銆?/p>
BOOL TlsSetValue( //綰跨▼璁懼畾鑷繁鐨凱VOID鏁扮粍鍗曞厓銆?br>DWORD dwTlsIndex, PVOID TlsGetValue( BOOL TLSFree( 闈欐乀LS:__declspec(thread) DWORD gt_dwStartTime=0;//鍙兘淇グ鍏ㄥ眬鎴栬呴潤鎬佸彉閲忋?/p>
DLL鎸傛帴錛堣繘紼嬫敞鍏ワ級錛氳鑷繁鐨凞LL鎻掑叆鍒板叾浠栬繘紼嬬殑鍦板潃絀洪棿銆?/p>
1 浣跨敤娉ㄥ唽琛ㄦ彃鍏LL 3 浣跨敤榪滅▼綰跨▼鏉ユ彃鍏LL 緇撴瀯鍖栧紓甯稿鐞嗭細(xì) 寮傚父澶勭悊紼嬪簭錛歘_try{}__exception(寮傚父榪囨護(hù)琛ㄨ揪寮?{} EXCEPTION_EXECUTE_HANDLE 鍙互瀵瑰紓甯歌繃婊よ〃杈懼紡榪涜紜紪鐮侊紝涔熷彲浠ョ敤涓涓皟鐢ㄤ竴涓嚱鏁版潵鍐沖畾榪囨護(hù)琛ㄨ揪寮忥紝鍑芥暟鐨勮繑鍥炲兼槸LONG.渚嬪錛屽彲浠ヨ繘琛屼竴瀹氬鐞嗭紝鐒跺悗榪斿洖EXCEPTION_CONTINUE_EXECUTION錛屽啀嬈℃墽琛屽嚭閿欒鍙ャ備絾鍙兘鍐嶆鍑洪敊錛屽洜姝よ繖縐嶆柟娉曞繀欏誨皬蹇冿紝闃叉鐢熸垚姝誨驚鐜?/p>
DWORD GetExceptionCode() 鍙互鑾峰緱寮傚父縐嶇被銆傚畠鍙兘鍦╛_except鍚庣殑鎷彿鎴栬呭紓甯稿鐞嗙▼搴忎腑璋冪敤銆?/p>
鍙戠敓寮傚父鍚庯紝鎿嶄綔緋葷粺浼?xì)鍍忓紩钃v寮傚父鐨勭嚎紼嬬殑鏍堥噷鍘嬪叆涓変釜緇撴瀯:EXCEPTION_RECORD CONTEXT EXCEPTION_POINTERS,鍏朵腑絎笁涓粨鏋勫寘鍚袱涓垚鍛樻寚閽堬紝鍒嗗埆鎸囧悜鍓嶄袱涓粨鏋勶紝浣跨敤鍑芥暟鍙互鑾峰緱絎笁涓粨鏋勭殑鎸囬拡錛?br>PEXCEPTION_POINTERS GetExceptionInformation();//浠呭彲浠ュ湪寮傚父榪囨護(hù)鍣ㄤ腑璋冪敤,鏃_exception鍚庨潰鐨勫皬鎷彿銆?/p>
閫楀彿琛ㄨ揪寮忥細(xì)浠庡乏鍒板彸瀵規(guī)墍鏈夌殑琛ㄨ揪寮忔眰鍊鹼紝騫惰繑鍥炴渶鏈夐潰鐨勮〃杈懼紡鐨勫箋?/p>
寮曞彂杞歡寮傚父錛?br>VOID RaiseException( 緙虹渷璋冭瘯鍣ㄦ墍鍦ㄦ敞鍐岃〃錛?br>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug Debugger 璋冭瘯鍣ㄦ寕鎺ュ埌琚皟璇曡繘紼?br>BOOL DebugActiveProcess(DWORD dwProcessID); 浣嶆搷浣滅>>鍜?lt;<涓嶄細(xì)鍋氬驚鐜綅縐伙紝鍗充笉浼?xì)鎶娍U誨嚭鐨勪綅鏀懼埌鍙︿竴澶淬?/p>
澶氭佹у拰鍔ㄦ佽仈緙栫殑瀹炵幇榪囩▼鍒嗘瀽 銆銆涓銆佸熀紜錛?/p>
銆銆1銆佸鎬佹э細(xì)浣跨敤鍩虹綾葷殑鎸囬拡鍔ㄦ佽皟鐢ㄥ叾媧劇敓綾諱腑鍑芥暟鐨勭壒鎬с?/p>
銆銆2銆佸姩鎬佽仈緙栵細(xì)鍦ㄨ繍琛岄樁孌碉紝鎵嶅皢鍑芥暟鐨勮皟鐢ㄤ笌瀵瑰簲鐨勫嚱鏁頒綋榪涜榪炴帴鐨勬柟寮忥紝鍙堝彨榪愯鏃惰仈緙栨垨鏅氭崋緇戙?/p>
銆銆浜屻佽繃紼嬫弿榪幫細(xì) 銆銆1銆佺紪璇戝櫒鍙戠幇涓涓被涓湁铏氬嚱鏁幫紝緙栬瘧鍣ㄤ細(xì)绔嬪嵆涓烘綾葷敓鎴愯櫄鎷熷嚱鏁拌〃 vtable錛堝悗闈㈡湁瀵箆table鐨勫垎鏋愶級銆傝櫄鎷熷嚱鏁拌〃鐨勫悇琛ㄩ」涓烘寚鍚戝搴旇櫄鎷熷嚱鏁扮殑鎸囬拡銆?/p>
銆銆2銆佺紪璇戝櫒鍦ㄦ綾諱腑闅愬惈鎻掑叆涓涓寚閽坴ptr錛堝vc緙栬瘧鍣ㄦ潵璇達(dá)紝瀹冩彃鍦ㄧ被鐨勭涓涓綅緗笂錛夈?/p>
銆銆鏈変竴涓姙娉曞彲浠ヨ浣犳劅鐭ヨ繖涓殣鍚寚閽堢殑瀛樺湪錛岃櫧鐒朵綘涓嶈兘鍦ㄧ被涓洿鎺ョ湅鍒板畠錛屼絾浣犲彲浠ユ瘮杈冧竴涓嬪惈鏈夎櫄鎷熷嚱鏁版椂鐨勭被鐨勫昂瀵稿拰娌℃湁铏氭嫙鍑芥暟鏃剁殑綾葷殑灝哄錛屼綘鑳藉鍙戠幇錛岃繖涓寚閽堢‘瀹炲瓨鍦ㄣ? 銆銆3銆佸湪璋冪敤姝ょ被鐨勬瀯閫犲嚱鏁版椂錛屽湪綾葷殑鏋勯犲嚱鏁頒腑錛岀紪璇戝櫒浼?xì)闅愬惈鎵цvptr涓巚table鐨勫叧鑱斾唬鐮侊紝灝唙ptr鎸囧悜瀵瑰簲鐨剉table銆傝繖灝卞皢綾諱笌姝ょ被鐨剉table鑱旂郴浜嗚搗鏉ャ?/p>
銆銆4銆佸湪璋冪敤綾葷殑鏋勯犲嚱鏁版椂錛屾寚鍚戝熀紜綾葷殑鎸囬拡姝ゆ椂宸茬粡鍙樻垚鎸囧悜鍏蜂綋鐨勭被鐨則his鎸囬拡錛岃繖鏍蜂緷闈犳this鎸囬拡鍗沖彲寰楀埌姝g‘鐨剉table錛屼粠鑰屽疄鐜頒簡澶氭佹с傚湪姝ゆ椂鎵嶈兘鐪熸涓庡嚱鏁頒綋榪涜榪炴帴錛岃繖灝辨槸鍔ㄦ佽仈緙栥?/p>
瀹氫箟綰櫄鍑芥暟鏂規(guī)硶錛歷irtual returntype function()= 0; 鎵鏈夌殑綾誨瀷閮藉彲浠ョ敤new鍔ㄦ佸垱寤猴紝鍖呮嫭綾伙紝緇撴瀯錛屽唴緗暟鎹被鍨嬨?/p>
exit()鍑芥暟鍖呭惈鍦?cstdlib"涓?/p>
娉涘瀷緙栫▼錛屼嬌鐢⊿TL搴?br>鎬誨叡鏈夎繎75涓硾鍨嬬畻娉?/p>
鎵鏈夊鍣ㄧ殑鍏遍氭搷浣滐細(xì) 搴忓垪寮忓鍣細(xì) 鐢熸垚搴忓垪寮忓鍣ㄧ殑浜旂鏂規(guī)硶錛?br>1 浜х敓絀虹殑瀹瑰櫒錛?br>list<string> slist; 鏈?涓柟娉曠敤浜庢搷浣滃紑濮嬪拰鏈熬鐨勫厓绱狅細(xì)push_front() pop_front() push_back() pop_back(),鐢變簬pop鎿嶄綔浠呭垹闄ゅ厓绱犺屼笉榪斿洖鍏冪礌錛屽洜姝よ繕闇瑕乫ront() back()鏂規(guī)硶鍙栧紑濮嬪拰鏈熬鐨勫厓绱狅紝鍙﹀錛寁ector涓嶅寘鎷琾ush_front() pop_front鏂規(guī)硶錛屽緢鏄劇劧錛屾棤娉曞疄鐜般?/p>
intert鐨勫洓縐嶅彉褰細(xì) erase鐨勪袱縐嶅彉褰細(xì) list涓嶆敮鎸乮terator鐨勫亸縐昏繍綆?/p>
瀵逛簬甯稿煎鍣紝浣跨敤甯歌凱浠e櫒錛?br>const vector<string> cs_vec; iterator鍙互褰撲綔鎸囬拡鐢紝鍙互鐢?鍙栧唴瀹癸紝涔熷彲浠ョ敤->璋冪敤瀵硅薄鐨勬垚鍛樸?/p>
浣跨敤娉涘瀷綆楁硶 find():綰挎ф悳绱㈡棤搴忛泦鍚?br>binary_search():浜屽垎鎼滅儲鏈夊簭闆嗗悎銆?br>count()錛氳繑鍥炲厓绱犱釜鏁般?br>search():鎼滅儲搴忓垪錛屽鏋滃瓨鍦ㄨ繑鍥炵殑iterator鎸囧悜搴忓垪棣栭儴錛屽惁鍒欐寚鍚戝鍣ㄦ湯灝俱?br>max_element(begin,end):榪斿洖鍖洪棿鍐呯殑鏈澶у箋?br>copy(begin,end,begin):鍏冪礌澶嶅埗銆?br>sort(begin,end):鎺掑簭銆?/p>
function objects:錛僫 nclude <functional> adapter:閫傞厤鍣ㄣ?br>bind1st:灝嗘暟鍊肩粦瀹氬埌function object鐨勭涓涓弬鏁般?br>bind2nd:灝嗘暟鍊肩粦瀹氬埌function object鐨勭浜屼釜鍙傛暟銆?/p>
浣跨敤map: words["vermeer"]=1; map<string,int>::iterator it=words.begin(); 鏌ユ壘map鍏冪礌鐨勬柟娉? 浣跨敤set: //鍔犲叆鍏冪礌 涓巗et鐩稿叧鐨勭畻娉?br>set_intersection() set_union() set_difference() set_symmetric_difference() 浣跨敤insertion adapters: 浣跨敤STL閫氬父浼?xì)鏈夊緢澶氳鍛婂Q屼負(fù)浜嗛伩鍏嶅湪璋冭瘯妯″紡錛坉ebug mode錛夊嚭鐜版伡浜虹殑璀﹀憡錛屼嬌鐢ㄤ笅闈㈢殑緙栬瘧鍣ㄥ懡浠わ細(xì) #pragma warning(disable: 4786) strncpy(dest,source,count) if(count銆?strlen(source)),閭d箞null緇撳熬涓嶄細(xì)琚姞鍦╠est鐨勫熬閮紝濡傛灉count>strlen(source),閭d箞涓嶈凍鐨勯儴鍒嗕細(xì)鐢╪ull濉厖銆?/p>
鐢變簬瀵歸綈鐨勫叧緋伙紝涓嬮潰涓や釜緇撴瀯浣跨敤sizeof錛屽墠鑰呮槸12錛屽悗鑰呮槸16銆?br>struct DNSAnswer 瀛愮被鍙互浣跨敤鐖剁被鐨勪繚鎶ゆ垚鍛橈紝鑰屽弸鍏冩瘮瀛愮被鐨勬潈闄愯繕澶э紝鍙互浣跨敤綾葷殑縐佹湁鍜屼繚鎶ゆ垚鍛樸?/p>
鍦ㄥ唴瀛樺垎閰嶅け璐ョ殑鎯呭喌涓嬶紝緋葷粺鍙湁鍦ㄥ嚭閿欏鐞嗗嚱鏁頒負(fù)絀虹殑鎯呭喌涓嬶紝鎵嶄細(xì)鎶涘嚭寮傚父錛歴td::bad_alloc(),鍚﹀垯浼?xì)鍙嶅璋冪敤澶勭悊鍑芥暟迤堝啀娆疂璇曞垎閰嶅唴瀛樸?/p>
濡傛灉閲嶈澆浜哊EW錛岄偅涔堝湪緇ф壙鐨勬椂鍊欒灝忓績錛屽鏋滃瓙綾繪病鏈夎鐩朜EW錛岄偅涔堝畠浼?xì)鍘讳娇鐢ㄧ埗绫荤殑NEW 錛屽洜姝ゅ簲璇ュ湪new錛宒elete涓仛媯(gè)鏌?br>if (size != sizeof(base)) // 濡傛灉鏁伴噺“閿欒”錛岃鏍囧噯operator new錛宐ase涓虹被鍚?br> return ::operator new(size); // 鍘誨鐞嗚繖涓姹?/p>
if (size != sizeof(base)) { // 濡傛灉size"閿欒"錛?br> ::operator delete(rawmemory); // 璁╂爣鍑唎perator鏉ュ鐞嗚姹?br> return; c++鏍囧噯瑙勫畾錛岃鏀寔0鍐呭瓨璇鋒眰錛堝垎閰嶄竴涓瓧鑺傦級錛屽茍涓斿彲浠ュ垹闄ULL鎸囬拡錛堢洿鎺ヨ繑鍥烇級銆?/p>
鍦ㄥ垱寤虹嚎紼嬬殑鏃跺欙紝浼犻掔殑鍙橀噺涓瀹氳鏄叏灞鎴栬呴潤鎬佺殑鍙橀噺錛屽洜涓轟紶閫掔殑鏄彉閲忕殑鍦板潃錛屽鏋滄槸灞閮ㄥ彉閲忓湴鍧寰堝揩灝變細(xì)澶辨晥銆?/p>
涓葷嚎紼嬮鍑哄悗錛屽叾瀛愮嚎紼嬭嚜鍔ㄧ粨鏉熴?/p>
鏅鴻兘鎸囬拡錛氬畠鍙互閬垮厤鍐呭瓨娉勯湶錛屽洜涓烘櫤鑳芥寚閽堟槸鍦ㄦ爤涓婂垱寤虹殑錛涜繕鍙互閬垮厤鍫嗕笂鍐呭瓨鐨勯噸澶嶉噴鏀鵑敊璇紝鍥犱負(fù)瀹冧繚璇佸彧鏈変竴涓寚閽堟嫢鏈夎繖鍧楀唴瀛樼殑鎵鏈夋潈銆?/p>
1銆侀澶勭悊鍣紙Preprocessor錛?.. 1
2銆佸浣曞畾涔夊畯... 2
3銆侀澶勭悊鍣ㄦ爣璇?error鐨勭洰鐨勬槸浠涔堬紵... 4
4銆佹寰幆錛圛nfinite loops錛?.. 4
5銆佹暟鎹0鏄庯紙Data declarations錛?.. 5
6銆佸叧閿瓧static鐨勪綔鐢ㄦ槸浠涔堬紵... 6
7銆佸叧閿瓧const鏈変粈涔堝惈鎰忥紵... 7
8銆乂olatile鐨勪嬌鐢?.. 9
9銆佷綅鎿嶄綔錛圔it manipulation錛?.. 12
10銆佽闂浐瀹氱殑鍐呭瓨浣嶇疆錛圓ccessing fixed memory locations錛?.. 13
11銆佷腑鏂紙Interrupts錛?.. 13
12銆佺鍙鋒墿灞曠殑浠g爜渚嬪瓙錛圕ode examples錛?.. 15
13銆佸鐞嗗櫒瀛楅暱瀵艱嚧鐨勬暟鎹墿灞曢棶棰?.. 16
14銆佸姩鎬佸唴瀛樺垎閰嶏紙Dynamic memory allocation錛?.. 16
15銆佺敤Typedef鏋勯犲鍚堢被鍨?.. 17
16銆佹櫐娑╃殑璇硶鍙?qiáng)浠g爜椋庢?.. 18
C璇█嫻嬭瘯鏄嫑鑱樺祵鍏ュ紡緋葷粺紼嬪簭鍛樿繃紼嬩腑蹇呴』鑰屼笖鏈夋晥鐨勬柟娉曘傝繖浜涘勾錛屾垜鏃㈠弬鍔犱篃緇勭粐浜嗚澶氳繖縐嶆祴璇曪紝鍦ㄨ繖榪囩▼涓垜鎰忚瘑鍒拌繖浜涙祴璇曡兘涓洪潰璇曡呭拰琚潰璇曡呮彁渚涜澶氭湁鐢ㄤ俊鎭紝姝ゅ錛屾拠寮闈㈣瘯鐨勫帇鍔涗笉璋堬紝榪欑嫻嬭瘯涔熸槸鐩稿綋鏈夎叮鐨勩?
浠?
琚潰璇曡呯殑瑙掑害鏉ヨ錛屼綘鑳戒簡瑙h澶氬叧浜庡嚭棰樿呮垨鐩戣冭呯殑鎯呭喌銆傝繖涓祴璇曞彧鏄嚭棰樿呬負(fù)鏄劇ず鍏跺ANSI鏍囧噯緇嗚妭鐨勭煡璇嗚屼笉鏄妧鏈妧宸ц岃璁″悧錛熻繖鏄釜鎰氳牏鐨?
闂鍚楋紵濡傝浣犵瓟鍑烘煇涓瓧絎︾殑ASCII鍊箋傝繖浜涢棶棰樼潃閲嶈冨療浣犵殑緋葷粺璋冪敤鍜屽唴瀛樺垎閰嶇瓥鐣ユ柟闈㈢殑鑳藉姏鍚楋紵榪欐爣蹇楃潃鍑洪鑰呬篃璁歌姳鏃墮棿鍦ㄥ井鏈轟笂鑰屼笉鏄湪宓屽叆寮?
緋葷粺涓娿傚鏋滀笂榪頒換浣曢棶棰樼殑絳旀鏄?鏄?鐨勮瘽錛岄偅涔堟垜鐭ラ亾鎴戝緱璁ょ湡鑰冭檻鎴戞槸鍚﹀簲璇ュ幓鍋氳繖浠藉伐浣溿?
浠庨潰璇曡呯殑瑙掑害鏉ヨ錛屼竴涓祴璇曚篃璁歌兘
浠庡鏂歸潰鎻ず搴旇瘯鑰呯殑绱犺川錛氭渶鍩烘湰鐨勶紝浣犺兘浜嗚В搴旇瘯鑰匔璇█鐨勬按騫熾備笉綆℃庝箞鏍鳳紝鐪嬩竴涓嬭繖浜哄浣曞洖絳斾粬涓嶄細(xì)鐨勯棶棰樹篃鏄弧鏈夎叮銆傚簲璇曡呮槸浠ュソ鐨勭洿瑙夊仛鍑烘槑鏅?
鐨勯夋嫨錛岃繕鏄彧鏄瀻钂欏憿錛熷綋搴旇瘯鑰呭湪鏌愪釜闂涓婂崱浣忔椂鏄壘鍊熷彛鍛紝榪樻槸琛ㄧ幇鍑哄闂鐨勭湡姝g殑濂藉蹇冿紝鎶婅繖鐪嬫垚瀛︿範(fàn)鐨勬満浼?xì)鍛㈠Q熸垜鍙戠幇榪欎簺淇℃伅涓庝粬浠殑嫻嬭瘯鎴?
緇╀竴鏍鋒湁鐢ㄣ?
鏈変簡榪欎簺鎯蟲硶錛屾垜鍐沖畾鍑轟竴浜涚湡姝i拡瀵瑰祵鍏ュ紡緋葷粺鐨勮冮錛屽笇鏈涜繖浜涗護(hù)浜哄ご鐥涚殑鑰冮鑳界粰姝e湪鎵懼伐浣滅殑浜轟竴鐐瑰府鍔┿傝繖浜涢棶棰橀兘鏄垜榪欎簺騫村疄闄呯鍒扮殑銆傚叾涓湁浜涢寰堥毦錛屼絾瀹冧滑搴旇閮借兘緇欎綘涓鐐瑰惎榪?
榪欎釜嫻嬭瘯閫備簬涓嶅悓姘村鉤鐨勫簲璇曡咃紝澶у鏁板垵綰ф按騫崇殑搴旇瘯鑰呯殑鎴愮嘩浼?xì)寰堝樊锛尵l忛獙涓板瘜鐨勭▼搴忓憳搴旇鏈夊緢濂界殑鎴愮嘩銆備負(fù)浜嗚浣犺兘鑷繁鍐沖畾鏌愪簺闂鐨勫亸濂斤紝姣忎釜闂娌℃湁鍒嗛厤鍒嗘暟錛屽鏋滈夋嫨榪欎簺鑰冮涓轟綘鎵鐢紝璇瘋嚜琛屾寜浣犵殑鎰忔濆垎閰嶅垎鏁般?
1銆侀澶勭悊鍣紙Preprocessor錛?
鐢ㄩ澶勭悊鎸囦護(hù)#define 澹版槑涓涓父鏁幫紝鐢ㄤ互琛ㄦ槑1騫翠腑鏈夊灝戠錛堝拷鐣ラ棸騫撮棶棰橈級
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL錛堝ぇ灝忓啓閮借錛屽父閲忓悗闈㈠彲浠ュ姞姝ゆ爣蹇楋紝瀹忕殑鍛藉悕椋庢牸瑕佸ぇ鍐欙紝澶氫釜涔嬮棿鐢ㄤ笅鍒掔嚎錛?
鎴戝湪榪欐兂鐪嬪埌鍑犱歡浜嬫儏錛?
1) #define 璇硶鐨勫熀鏈煡璇嗭紙渚嬪錛氫笉鑳戒互鍒嗗彿緇撴潫錛屾嫭鍙風(fēng)殑浣跨敤錛堣〃杈懼紡銆佸弬鏁扮瓑瑕佹嫭璧鋒潵錛夛紝絳夌瓑錛?
2)鎳傚緱棰勫鐞嗗櫒灝嗕負(fù)浣犺綆楀父鏁拌〃杈懼紡鐨勫鹼紙闅鵑亾涓嶆槸鏇挎崲涔堬紝鍏堢畻鍐嶆浛錛熶細(xì)灝嗗父鏁板悎騫訛級錛屽洜姝わ紝鐩存帴鍐欏嚭浣犳槸濡備綍璁$畻涓騫翠腑鏈夊灝戠鑰屼笉鏄綆楀嚭瀹為檯鐨勫鹼紝鏄洿娓呮櫚鑰屾病鏈変唬浠風(fēng)殑銆?
3) 鎰忚瘑鍒拌繖涓〃杈懼紡灝嗕嬌涓涓?6浣嶆満鐨勬暣鍨嬫暟婧㈠嚭-鍥犳瑕佺敤鍒伴暱鏁村瀷絎﹀彿L,鍛婅瘔緙栬瘧鍣ㄨ繖涓父鏁版槸鐨勯暱鏁村瀷鏁般?
4) 濡傛灉浣犲湪浣犵殑琛ㄨ揪寮忎腑鐢ㄥ埌UL錛堣〃紺烘棤絎﹀彿闀挎暣鍨嬶級錛岄偅涔堜綘鏈変簡涓涓ソ鐨勮搗鐐廣傝浣忥紝絎竴鍗拌薄寰堥噸瑕併?br>
2銆佸浣曞畾涔夊畯
鍐欎竴涓?鏍囧噯"瀹廙IN 錛岃繖涓畯杈撳叆涓や釜鍙傛暟騫惰繑鍥炶緝?yōu)畯鐨勪竴涓?br>
鑰冪偣錛氾紙琛ㄨ揪寮忋佸弬鏁扮瓑瑕佹嫭璧鋒潵錛?
#define MIN(A,B) 錛堬紙A錛?<= (B) ? (A) : (B))
榪欎釜嫻嬭瘯鏄負(fù)涓嬮潰鐨勭洰鐨勮岃鐨勶細(xì)
1)
鏍囪瘑#define鍦ㄥ畯涓簲鐢ㄧ殑鍩烘湰鐭ヨ瘑銆傝繖鏄緢閲嶈鐨勩傚洜涓哄湪宓屽叆(inline)鎿嶄綔絎﹀彉涓烘爣鍑咰鐨勪竴閮ㄥ垎涔嬪墠錛屽畯鏄柟渚夸駭鐢熷祵鍏ヤ唬鐮佺殑鍞竴鏂規(guī)硶錛屽
浜庡祵鍏ュ紡緋葷粺鏉ヨ錛屼負(fù)浜嗚兘杈懼埌瑕佹眰鐨勬ц兘錛堝綋鐒朵富瑕佹槸瀹炴椂鎬у摝錛岀壓鐗蹭唬鐮佺┖闂存崲鍙栨椂闂存晥鐜囷級錛屽祵鍏ヤ唬鐮佺粡甯告槸蹇呴』鐨勬柟娉曘?
2)涓夐噸鏉′歡鎿嶄綔絎︾殑鐭ヨ瘑銆傝繖涓搷浣滅瀛樺湪C璇█涓殑鍘熷洜鏄畠浣垮緱緙栬瘧鍣ㄨ兘浜х敓姣攊f-then-else錛堝瓨鍦ㄦ潯浠惰漿縐諱細(xì)涓柇鎸囦護(hù)嫻佹按綰匡級鏇翠紭鍖栫殑浠g爜錛屼簡瑙h繖涓敤娉曟槸寰堥噸瑕佺殑銆?
3) 鎳傚緱鍦ㄥ畯涓皬蹇冨湴鎶婂弬鏁扮敤鎷彿鎷搗鏉?
4) 鎴戜篃鐢ㄨ繖涓棶棰樺紑濮嬭璁哄畯鐨勫壇浣滅敤錛屼緥濡傦細(xì)褰撲綘鍐欎笅闈㈢殑浠g爜鏃朵細(xì)鍙戠敓浠涔堜簨錛?
least = MIN(*p++, b);
姝ゅ鑰冪偣錛歩nline鍑芥暟鍜屽畯鐨勫尯鍒?br>
瀹?
鍙槸灝嗗弬鏁板畬鍏ㄦ浛鎹紝鍗矼IN(*p++, b)榪涜瀹忓睍寮鍚庝負(fù)錛堬紙*p++錛?<= (b) ? (*p++) :
(b))錛屽鏋滐紙*p++錛?<= (b)鎴愮珛錛屽垯琛ㄨ揪寮忕殑鍊間負(fù)(*p++)錛屼絾鐢變簬鍦紙*p++錛?lt;=
(b)鍒ゆ柇榪囩▼涓敼鍙樹簡p鐨勫鹼紝浣垮緱姝ゆ椂鐨? (*p++)闈烇紙*p++錛?lt;= (b)涓殑鍊間簡錛岃繚鑳屼簡錛熷彿琛ㄨ揪寮忕殑鍘熸剰銆?br>
浣嗘槸鍐呰仈inline鍑芥暟灝嗚繘琛屽弬鏁版鏌ワ紝姹傚嚭鍙傛暟鐨勫煎悗鍐嶅皢姝ゅ煎甫鍏ュ嚱鏁頒腑錛屽洜姝わ紙錛圓錛?<= (B) ? (A) : (B))涓殑A鏄竴鑷寸殑銆?br>
絎竴閮ㄥ垎錛氬畯
涓轟粈涔堣浣跨敤瀹忓憿錛?br>鍥?
涓哄嚱鏁扮殑璋冪敤蹇呴』瑕佸皢紼嬪簭鎵ц鐨勯『搴忚漿縐誨埌鍑芥暟鎵瀛樻斁鍦ㄥ唴瀛樹腑鐨勬煇涓湴鍧錛屽皢鍑芥暟鐨勭▼搴忓唴瀹規(guī)墽琛屽畬鍚庯紝鍐嶈繑鍥炲埌杞幓鎵ц璇ュ嚱鏁板墠鐨勫湴鏂廣傝繖縐嶈漿縐繪搷浣滆姹?
鍦ㄨ漿鍘繪墽琛屽墠瑕佷繚瀛樼幇鍦哄茍璁板繂鎵ц鐨勫湴鍧錛岃漿鍥炲悗瑕佹仮澶嶇幇鍦猴紝騫舵寜鍘熸潵淇濆瓨鍦板潃緇х畫鎵ц銆傚洜姝わ紝鍑芥暟璋冪敤瑕佹湁涓瀹氱殑鏃墮棿鍜岀┖闂存柟闈㈢殑寮閿錛屼簬鏄皢褰卞搷鍏舵晥
鐜囥?br>鑰屽畯鍙槸鍦ㄩ澶勭悊鐨勫湴鏂規(guī)妸浠g爜灞曞紑錛屼笉闇瑕侀澶栫殑絀洪棿鍜屾椂闂存柟闈㈢殑寮閿錛屾墍浠ヨ皟鐢ㄤ竴涓畯姣旇皟鐢ㄤ竴涓嚱鏁版洿鏈夋晥鐜囥?br>浣嗘槸瀹忎篃鏈夊緢澶氱殑涓嶅敖浜烘剰鐨勫湴鏂廣?br>1銆佸畯涓嶈兘璁塊棶瀵硅薄鐨勭鏈夋垚鍛樸?br>2銆佸畯鐨勫畾涔夊緢瀹規(guī)槗浜х敓浜屾剰鎬с?br>
3銆佸畯瀹氫箟鐨勫父閲忓湪浠g爜鍖猴紝寰堝璋冭瘯鍣ㄤ笉鑳藉瀵瑰叾璋冭瘯
鎴戜滑涓句釜渚嬪瓙錛?br>#define square(x) (x*x)
閬垮厤榪欎簺閿欒鐨勬柟娉曪紝涓鏄粰瀹忕殑鍙傛暟閮藉姞涓婃嫭鍙楓?br>#define square(x) ((x)*(x))
絎簩閮ㄥ垎錛氬唴鑱斿嚱鏁?br>浠庝笂闈㈢殑闃愯堪錛屽彲浠ョ湅鍒板畯鏈変竴浜涢毦浠ラ伩鍏嶇殑闂錛屾庝箞瑙e喅鍛紵
鍐呰仈鍑芥暟鏄唬鐮佽鎻掑叆鍒拌皟鐢ㄨ呬唬鐮佸鐨勫嚱鏁般傚鍚?#define 瀹忥紝鍐呰仈鍑芥暟閫氳繃閬垮厤琚皟鐢ㄧ殑寮閿鏉ユ彁楂樻墽琛屾晥鐜囷紝灝ゅ叾鏄畠鑳藉閫氳繃璋冪敤錛?#8220;榪囩▼鍖栭泦鎴?#8221;錛夎緙栬瘧鍣ㄤ紭鍖栥?br>
鍐?
鑱斿嚱鏁板拰瀹忓緢綾諱技錛岃屾湰璐ㄥ尯鍒湪浜庯紝瀹忔槸鐢遍澶勭悊鍣ㄥ瀹忚繘琛屾浛浠o紝鑰屽唴鑱斿嚱鏁版槸閫氳繃緙栬瘧鍣ㄦ帶鍒舵潵瀹炵幇鐨勩傝屼笖鍐呰仈鍑芥暟鏄湡姝g殑鍑芥暟錛屽彧鏄湪闇瑕佺敤鍒扮殑鏃?
鍊欙紝鍐呰仈鍑芥暟鍍忓畯涓鏍風(fēng)殑灞曞紑錛屾墍浠ュ彇娑堜簡鍑芥暟鐨勫弬鏁板帇鏍堬紝鍑忓皯浜嗚皟鐢ㄧ殑寮閿銆備綘鍙互璞¤皟鐢ㄥ嚱鏁頒竴鏍鋒潵璋冪敤鍐呰仈鍑芥暟錛岃屼笉蹇呮媴蹇冧細(xì)浜х敓浜庡鐞嗗畯鐨勪竴浜涢棶棰樸?br>澹版槑鍐呰仈鍑芥暟鐪嬩笂鍘誨拰鏅氬嚱鏁伴潪甯哥浉浼鹼細(xì)
void f(int i, char c);
褰撲綘瀹氫箟涓涓唴鑱斿嚱鏁版椂錛屽湪鍑芥暟瀹氫箟鍓嶅姞涓?inline 鍏抽敭瀛楋紝騫朵笖灝嗗畾涔夋斁鍏ュご鏂囦歡錛?br>inline void f(int i, char c)
{
// ...
}
鍐呰仈鍑芥暟蹇呴』鏄拰鍑芥暟浣撶殑瀹氫箟鐢蟲槑鍦ㄤ竴璧鳳紝鎵嶆湁鏁堛?br>鍍忚繖鏍風(fēng)殑鐢蟲槑inline function(int i)鏄病鏈夋晥鏋滅殑錛岀紪璇戝櫒鍙槸鎶婂嚱鏁頒綔涓烘櫘閫氱殑鍑芥暟鐢蟲槑錛屾垜浠繀欏誨畾涔夊嚱鏁頒綋銆?br>inline int function(int i) {return i*i;}
榪欐牱鎴戜滑鎵嶇畻瀹氫箟浜嗕竴涓唴鑱斿嚱鏁般傛垜浠彲浠ユ妸瀹冧綔涓轟竴鑸殑鍑芥暟涓鏍瘋皟鐢ㄣ備絾鏄墽琛岄熷害紜瘮涓鑸嚱鏁扮殑鎵ц閫熷害瑕佸揩銆?br>
褰撶劧錛屽唴鑱斿嚱鏁頒篃鏈変竴瀹氱殑灞闄愭с傚氨鏄嚱鏁頒腑鐨勬墽琛屼唬鐮佷笉鑳藉お澶氫簡錛屽鏋滐紝鍐呰仈鍑芥暟鐨勫嚱鏁頒綋榪囧ぇ錛屼竴鑸殑緙栬瘧鍣ㄤ細(xì)鏀懼純鍐呰仈鏂瑰紡錛岃岄噰鐢ㄦ櫘閫氱殑鏂瑰紡璋冪敤鍑芥暟銆傝繖鏍鳳紝鍐呰仈鍑芥暟灝卞拰鏅氬嚱鏁版墽琛屾晥鐜囦竴鏍蜂簡銆?br>鏈変笂闈㈢殑涓よ呯殑鐗規(guī)э紝鎴戜滑鍙互鐢ㄥ唴鑱斿嚱鏁板畬鍏ㄥ彇浠i澶勭悊瀹忋?br>
3銆侀澶勭悊鍣ㄦ爣璇?error鐨勭洰鐨勬槸浠涔堬紵
濡傛灉浣犱笉鐭ラ亾絳旀錛岃鐪嬪弬鑰冩枃鐚?銆傝繖闂瀵瑰尯鍒嗕竴涓甯哥殑浼欒鍜屼竴涓功鍛嗗瓙鏄緢鏈夌敤鐨勩傚彧鏈変功鍛嗗瓙鎵嶄細(xì)璇籆璇█璇炬湰鐨勯檮褰曞幓鎵懼嚭璞¤繖縐嶉棶棰樼殑絳旀銆傚綋鐒跺鏋滀綘涓嶆槸鍦ㄦ壘涓涓功鍛嗗瓙錛岄偅涔堝簲璇曡呮渶濂藉笇鏈涜嚜宸變笉瑕佺煡閬撶瓟妗堛?br>
4銆佹寰幆錛圛nfinite loops錛?
宓屽叆寮忕郴緇熶腑緇忓父瑕佺敤鍒版棤闄愬驚鐜紝浣犳庝箞鏍風(fēng)敤C緙栧啓姝誨驚鐜憿錛?榪欎釜闂鐢ㄥ嚑涓В鍐蟲柟妗堛?
鎴戦閫夌殑鏂規(guī)鏄細(xì)
while(1)
{
}
涓浜涚▼搴忓憳鏇村枩嬈㈠涓嬫柟妗堬細(xì)
for(;;) 錛堟澶勭殑鍒ゆ柇鏁堢巼瑕佷綆鐨勫錛屽湪姹囩紪浠g爜涓湅鐪嬶紵錛燂紵錛?br>
{
}
榪?
涓疄鐜版柟寮忚鎴戜負(fù)闅撅紝鍥犱負(fù)榪欎釜璇硶娌℃湁紜垏琛ㄨ揪鍒板簳鎬庝箞鍥炰簨銆傚鏋滀竴涓簲璇曡呯粰鍑鴻繖涓綔涓烘柟妗堬紝鎴戝皢鐢ㄨ繖涓綔涓轟竴涓満浼?xì)鍘绘帰绌朵粬浠瑯q欐牱鍋氱殑鍩烘湰鍘熺悊銆傚鏋?
浠栦滑鐨勫熀鏈瓟妗堟槸錛?鎴戣鏁欑潃榪欐牱鍋氾紝浣嗕粠娌℃湁鎯沖埌榪囦負(fù)浠涔堛?榪欎細(xì)緇欐垜鐣欎笅涓涓潖鍗拌薄銆?
錛堝緢澶氭椂鍊欓潰璇曞畼鍏蟲敞浣犳濊冮棶棰樼殑鏂瑰紡錛屾槸鍚︾暀鎰忔煇浜涗笢瑗垮杽浜庢濊冿紝鍙兘騫舵病鏈夊閿欙紝鍙槸鍋忓ソ鑰屽凡錛屾瘮濡俶emset鍜宮emcopy浠ュ強(qiáng)strcpy閮?
鑳芥嫹璐濆瓧絎︿覆錛屽埌搴曟湁浠涔堝尯鍒憿錛熺湅浣犳槸鍚﹀杽浜庢瘮杈冩槸鍚﹀叧娉ㄧ粏鑺傦級
絎笁涓柟妗堟槸鐢?goto 錛坓oto璇彞鍦–涓槸搴旇灝介噺閬垮厤鐨勶紝鍙湪澶勭悊閿欒浠g爜鏃剁敤錛?br>
Loop:
...
goto Loop;
搴旇瘯鑰呭緇欏嚭涓婇潰鐨勬柟妗堬紝榪欒鏄庢垨鑰呬粬鏄竴涓眹緙栬璦紼嬪簭鍛橈紙榪欎篃璁告槸濂戒簨錛夋垨鑰呬粬鏄竴涓兂榪涘叆鏂伴鍩熺殑BASIC/FORTRAN紼嬪簭鍛樸?
5銆佹暟鎹0鏄庯紙Data declarations錛?
鐢ㄥ彉閲廰緇欏嚭涓嬮潰鐨勫畾涔?
a) 涓涓暣鍨嬫暟錛圓n integer錛?
b)涓涓寚鍚戞暣鍨嬫暟鐨勬寚閽堬紙 A pointer to an integer錛?
c)涓涓寚鍚戞寚閽堢殑鐨勬寚閽堬紝瀹冩寚鍚戠殑鎸囬拡鏄寚鍚戜竴涓暣鍨嬫暟錛?A pointer to a pointer to an integers錛?
d)涓涓湁10涓暣鍨嬫暟鐨勬暟緇勶紙 An array of 10 integers錛?
e) 涓涓湁10涓寚閽堢殑鏁扮粍錛岃鎸囬拡鏄寚鍚戜竴涓暣鍨嬫暟鐨勩傦紙An array of 10 pointers to integers錛?
f) 涓涓寚鍚戞湁10涓暣鍨嬫暟鏁扮粍鐨勬寚閽堬紙 A pointer to an array of 10 integers錛?
g) 涓涓寚鍚戝嚱鏁扮殑鎸囬拡錛岃鍑芥暟鏈変竴涓暣鍨嬪弬鏁板茍榪斿洖涓涓暣鍨嬫暟錛圓 pointer to a function that takes an integer as an argument and returns an integer錛?
h)
涓涓湁10涓寚閽堢殑鏁扮粍錛岃鎸囬拡鎸囧悜涓涓嚱鏁幫紝璇ュ嚱鏁版湁涓涓暣鍨嬪弬鏁板茍榪斿洖涓涓暣鍨嬫暟錛?An array of ten pointers to
functions that take an integer argument and return an integer 錛?
絳旀鏄細(xì)
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer // 涓嶆槸錛坕nt x錛夛紝涓嶉渶瑕佸叿浣撶殑鍙傛暟
h) int (*a[10])(int)錛堝彲浠ヤ粠e銆乬綾繪瘮寰楀埌錛? // An array of 10 pointers to functions that take an integer argument and return an integer
浜?
浠粡甯稿0縐拌繖閲屾湁鍑犱釜闂鏄偅縐嶈緲諱竴涓嬩功鎵嶈兘鍥炵瓟鐨勯棶棰橈紝鎴戝悓鎰忚繖縐嶈娉曘傚綋鎴戝啓榪欑瘒鏂囩珷鏃訛紝涓轟簡紜畾璇硶鐨勬紜э紝鎴戠殑紜煡浜嗕竴涓嬩功銆備絾鏄綋鎴戣闈㈣瘯
鐨勬椂鍊欙紝鎴戞湡鏈涜闂埌榪欎釜闂錛堟垨鑰呯浉榪戠殑闂錛夈傚洜涓哄湪琚潰璇曠殑榪欐鏃墮棿閲岋紝鎴戠‘瀹氭垜鐭ラ亾榪欎釜闂鐨勭瓟妗堛傚簲璇曡呭鏋滀笉鐭ラ亾鎵鏈夌殑絳旀錛堟垨鑷沖皯澶ч儴鍒嗙瓟
妗堬級錛岄偅涔堜篃灝辨病鏈変負(fù)榪欐闈㈣瘯鍋氬噯澶囷紝濡傛灉璇ラ潰璇曡呮病鏈変負(fù)榪欐闈㈣瘯鍋氬噯澶囷紝閭d箞浠栧張鑳戒負(fù)浠涔堝仛鍑嗗鍛紵
6銆佸叧閿瓧static鐨勪綔鐢ㄦ槸浠涔堬紵
榪欎釜綆鍗曠殑闂寰堝皯鏈変漢鑳藉洖絳斿畬鍏ㄣ傚湪C璇█涓紝鍏抽敭瀛梥tatic鏈変笁涓槑鏄劇殑浣滅敤錛?
1)鍦ㄥ嚱鏁頒綋鍐咃紝涓涓澹版槑涓洪潤鎬佺殑鍙橀噺鍦ㄨ繖涓鍑芥暟琚皟鐢ㄨ繃紼嬩腑緇存寔鍏跺間笉鍙橈紙璇ュ彉閲忓瓨鏀懼湪闈欐佸彉閲忓尯錛夈?
2) 鍦ㄦā鍧楀唴錛堜絾鍦ㄥ嚱鏁頒綋澶栵級錛屼竴涓澹版槑涓洪潤鎬佺殑鍙橀噺鍙互琚ā鍧楀唴鎵鐢ㄥ嚱鏁拌闂紝浣嗕笉鑳借妯″潡澶栧叾瀹冨嚱鏁拌闂傚畠鏄竴涓湰鍦扮殑鍏ㄥ眬鍙橀噺銆?
3) 鍦ㄦā鍧楀唴錛屼竴涓澹版槑涓洪潤鎬佺殑鍑芥暟鍙彲琚繖涓妯″潡鍐呯殑鍏跺畠鍑芥暟璋冪敤銆傞偅灝辨槸錛岃繖涓嚱鏁拌闄愬埗鍦ㄥ0鏄庡畠鐨勬ā鍧楃殑鏈湴鑼冨洿鍐呬嬌鐢ㄣ?
澶у鏁板簲璇曡呰兘姝g‘鍥炵瓟絎竴閮ㄥ垎錛屼竴閮ㄥ垎鑳芥紜洖絳旂浜岄儴鍒嗭紝浣嗘槸寰堝皯鐨勪漢鑳芥噦寰楃涓夐儴鍒嗐傝繖鏄竴涓簲璇曡呯殑涓ラ噸鐨勭己鐐癸紝鍥犱負(fù)浠栨樉鐒朵笉鎳傚緱鏈湴鍖栨暟鎹拰浠g爜鑼冨洿鐨勫ソ澶勫拰閲嶈鎬с?
鑰冪偣錛氬湪宓屽叆寮忕郴緇熶腑錛岃鏃跺埢鎳傚緱縐繪鐨勯噸瑕佹э紝紼嬪簭鍙兘鏄緢澶氱▼搴忓憳鍏卞悓鍗忎綔鍚屾椂瀹屾垚錛屽湪瀹氫箟鍙橀噺鍙?qiáng)鍑芥暟鐨剺q囩▼錛屽彲鑳戒細(xì)閲嶅悕錛岃繖緇欑郴緇熺殑闆嗘垚甯︽潵楹葷儲錛屽洜姝や繚璇佷笉鍐茬獊鐨勫姙娉曟槸鏄劇ず鐨勮〃紺烘鍙橀噺鎴栬呭嚱鏁版槸鏈湴鐨勶紝static鍗沖彲銆?br>
鍦↙inux鐨勬ā鍧楃紪紼嬩腑錛岃繖涓鏉″緢鏄庢樉錛屾墍鏈夌殑鍑芥暟鍜屽叏灞鍙橀噺閮借鐢╯tatic鍏抽敭瀛楀0鏄庯紝灝嗗叾浣滅敤鍩熼檺鍒跺湪鏈ā鍧楀唴閮紝涓庡叾浠栨ā鍧楀叡浜殑鍑芥暟鎴栬呭彉閲忚EXPORT鍒板唴鏍鎬腑銆?br>
static鍏抽敭瀛楄嚦灝戞湁涓嬪垪n涓綔鐢細(xì)
錛?錛夎緗彉閲忕殑瀛樺偍鍩燂紝鍑芥暟浣撳唴static鍙橀噺鐨勪綔鐢ㄨ寖鍥翠負(fù)璇ュ嚱鏁頒綋錛屼笉鍚屼簬auto鍙橀噺錛岃鍙橀噺鐨勫唴瀛樺彧琚垎閰嶄竴嬈★紝鍥犳鍏跺煎湪涓嬫璋冪敤鏃朵粛緇存寔涓婃鐨勫鹼紱
錛?錛夐檺鍒跺彉閲忕殑浣滅敤鍩燂紝鍦ㄦā鍧楀唴鐨剆tatic鍏ㄥ眬鍙橀噺鍙互琚ā鍧楀唴鎵鐢ㄥ嚱鏁拌闂紝浣嗕笉鑳借妯″潡澶栧叾瀹冨嚱鏁拌闂紱
錛?錛夐檺鍒跺嚱鏁扮殑浣滅敤鍩燂紝鍦ㄦā鍧楀唴鐨剆tatic鍑芥暟鍙彲琚繖涓妯″潡鍐呯殑鍏跺畠鍑芥暟璋冪敤錛岃繖涓嚱鏁扮殑浣跨敤鑼冨洿琚檺鍒跺湪澹版槑瀹冪殑妯″潡鍐咃紱
錛?錛夊湪綾諱腑鐨剆tatic鎴愬憳鍙橀噺鎰忓懗鐫瀹冧負(fù)璇ョ被鐨勬墍鏈夊疄渚嬫墍鍏變韓錛屼篃灝辨槸璇村綋鏌愪釜綾葷殑瀹炰緥淇敼浜嗚闈欐佹垚鍛樺彉閲忥紝鍏朵慨鏀瑰間負(fù)璇ョ被鐨勫叾瀹冩墍鏈夊疄渚嬫墍瑙侊紱
錛?錛夊湪綾諱腑鐨剆tatic鎴愬憳鍑芥暟灞炰簬鏁翠釜綾繪墍鎷ユ湁錛岃繖涓嚱鏁頒笉鎺ユ敹this鎸囬拡錛屽洜鑰屽彧鑳借闂被鐨剆tatic鎴愬憳鍙橀噺銆?br>
7銆佸叧閿瓧const鏈変粈涔堝惈鎰忥紵
鎴?
鍙涓鍚埌琚潰璇曡呰錛?const鎰忓懗鐫甯告暟"錛堜笉鏄父鏁幫紝鍙互鏄彉閲忥紝鍙槸浣犱笉鑳戒慨鏀瑰畠錛夛紝鎴戝氨鐭ラ亾鎴戞鍦ㄥ拰涓涓笟浣欒呮墦浜ら亾銆傚幓騫碊an
Saks宸茬粡鍦ㄤ粬鐨勬枃绔犻噷瀹屽叏姒傛嫭浜哻onst鐨勬墍鏈夌敤娉曪紝鍥犳ESP(璇戣咃細(xì)Embedded Systems
Programming)鐨勬瘡涓浣嶈鑰呭簲璇ラ潪甯哥啛鎮(zhèn)塩onst鑳藉仛浠涔堝拰涓嶈兘鍋氫粈涔?濡傛灉浣犱粠娌℃湁璇誨埌閭g瘒鏂囩珷錛屽彧瑕佽兘璇村嚭const鎰忓懗鐫"鍙"灝卞彲
浠ヤ簡銆傚敖綆¤繖涓瓟妗堜笉鏄畬鍏ㄧ殑絳旀錛屼絾鎴戞帴鍙楀畠浣滀負(fù)涓涓紜殑絳旀銆傦紙濡傛灉浣犳兂鐭ラ亾鏇磋緇嗙殑絳旀錛屼粩緇嗚涓涓婼aks鐨勬枃绔犲惂銆傦級
濡傛灉搴旇瘯鑰呰兘姝g‘鍥炵瓟榪欎釜闂錛屾垜灝嗛棶浠栦竴涓檮鍔犵殑闂錛氫笅闈㈢殑澹版槑閮芥槸浠涔堟剰鎬濓紵
Const鍙槸涓涓慨楗扮錛屼笉綆℃庝箞鏍穉浠嶇劧鏄竴涓猧nt鍨嬬殑鍙橀噺
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
鏈川錛歝onst鍦ㄨ皝鍚庨潰璋佸氨涓嶅彲淇敼錛宑onst鍦ㄦ渶鍓嶉潰鍒欏皢鍏跺悗縐諱竴浣嶅嵆鍙紝浜岃呯瓑鏁?br>
鍓嶄袱涓殑浣滅敤鏄竴鏍鳳紝a鏄竴涓父鏁村瀷鏁般傜涓変釜鎰忓懗鐫a鏄竴涓寚鍚戝父鏁村瀷鏁扮殑鎸囬拡錛堜篃灝辨槸錛屾寚鍚戠殑鏁村瀷鏁版槸涓嶅彲淇敼鐨勶紝浣嗘寚閽堝彲浠ワ紝姝ゆ渶甯歌浜庡嚱鏁扮殑鍙傛暟錛屽綋浣犲彧寮曠敤浼犺繘鏉ユ寚閽堟墍鎸囧悜鐨勫兼椂搴旇鍔犱笂const淇グ絎︼紝紼嬪簭涓慨鏀圭紪璇戝氨涓嶉氳繃錛屽彲浠ュ噺灝戠▼搴忕殑bug錛夈?br>
絎洓涓剰鎬漚鏄竴涓寚鍚戞暣鍨嬫暟鐨勫父鎸囬拡錛堜篃灝辨槸璇達(dá)紝鎸囬拡鎸囧悜鐨勬暣鍨嬫暟鏄彲浠ヤ慨鏀圭殑錛屼絾鎸囬拡鏄笉鍙慨鏀圭殑錛夈傛渶鍚庝竴涓剰鍛崇潃a鏄竴涓寚鍚戝父鏁村瀷鏁扮殑甯告寚閽堬紙涔熷氨鏄錛屾寚閽堟寚鍚戠殑鏁村瀷鏁版槸涓嶅彲淇敼鐨勶紝鍚屾椂鎸囬拡涔熸槸涓嶅彲淇敼鐨勶級銆?br>
濡傛灉搴旇瘯鑰呰兘姝g‘鍥炵瓟榪欎簺闂錛岄偅涔堜粬灝辯粰鎴戠暀涓嬩簡涓涓ソ鍗拌薄銆傞『甯︽彁涓鍙ワ紝涔熻浣犲彲鑳戒細(xì)闂紝鍗充嬌涓嶇敤鍏抽敭瀛?錛屼篃榪樻槸鑳藉緢瀹規(guī)槗鍐欏嚭鍔熻兘姝g‘鐨勭▼搴忥紝閭d箞鎴戜負(fù)浠涔堣繕瑕佸姝ょ湅閲嶅叧閿瓧const鍛紵鎴戜篃濡備笅鐨勫嚑涓嬬悊鐢憋細(xì)
1)
鍏抽敭瀛梒onst鐨勪綔鐢ㄦ槸涓虹粰璇諱綘浠g爜鐨勪漢浼犺揪闈炲父鏈夌敤鐨勪俊鎭紝瀹為檯涓婏紝澹版槑涓涓弬鏁頒負(fù)甯擱噺鏄負(fù)浜嗗憡璇変簡鐢ㄦ埛榪欎釜鍙傛暟鐨勫簲鐢ㄧ洰鐨勩傚鏋滀綘鏇捐姳寰堝鏃墮棿娓呯悊
鍏跺畠浜虹暀涓嬬殑鍨冨溇錛屼綘灝變細(xì)寰堝揩瀛︿細(xì)鎰熻阿榪欑偣澶氫綑鐨勪俊鎭傦紙褰撶劧錛屾噦寰楃敤const鐨勭▼搴忓憳寰堝皯浼?xì)鐣欎笅鐨勫瀮鍦捐鍒汉鏉ユ竻鐞嗙殑銆傦級
2) 閫氳繃緇欎紭鍖栧櫒涓浜涢檮鍔犵殑淇℃伅錛屼嬌鐢ㄥ叧閿瓧const涔熻鑳戒駭鐢熸洿绱у噾鐨勪唬鐮併?
3) 鍚堢悊鍦頒嬌鐢ㄥ叧閿瓧const鍙互浣跨紪璇戝櫒寰堣嚜鐒跺湴淇濇姢閭d簺涓嶅笇鏈涜鏀瑰彉鐨勫弬鏁幫紝闃叉鍏惰鏃犳剰鐨勪唬鐮佷慨鏀廣傜畝鑰岃█涔嬶紝榪欐牱鍙互鍑忓皯bug鐨勫嚭鐜般?br>
const鍏抽敭瀛楄嚦灝戞湁涓嬪垪n涓綔鐢細(xì)
錛?錛夋闃繪涓涓彉閲忚鏀瑰彉錛屽彲浠ヤ嬌鐢╟onst鍏抽敭瀛椼傚湪瀹氫箟璇onst鍙橀噺鏃訛紝閫氬父闇瑕佸瀹冭繘琛屽垵濮嬪寲錛屽洜涓轟互鍚庡氨娌℃湁鏈轟細(xì)鍐嶅幓鏀瑰彉瀹冧簡錛?br>錛?錛夊鎸囬拡鏉ヨ錛屽彲浠ユ寚瀹氭寚閽堟湰韜負(fù)const錛屼篃鍙互鎸囧畾鎸囬拡鎵鎸囩殑鏁版嵁涓篶onst錛屾垨浜岃呭悓鏃舵寚瀹氫負(fù)const錛?br>錛?錛夊湪涓涓嚱鏁板0鏄庝腑錛宑onst鍙互淇グ褰㈠弬錛岃〃鏄庡畠鏄竴涓緭鍏ュ弬鏁幫紝鍦ㄥ嚱鏁板唴閮ㄤ笉鑳芥敼鍙樺叾鍊鹼紱
錛?錛夊浜庣被鐨勬垚鍛樺嚱鏁幫紝鑻ユ寚瀹氬叾涓篶onst綾誨瀷錛屽垯琛ㄦ槑鍏舵槸涓涓父鍑芥暟錛屼笉鑳戒慨鏀圭被鐨勬垚鍛樺彉閲忥紱
錛?錛夊浜庣被鐨勬垚鍛樺嚱鏁幫紝鏈夋椂鍊欏繀欏繪寚瀹氬叾榪斿洖鍊間負(fù)const綾誨瀷錛屼互浣垮緱鍏惰繑鍥炲間笉涓?#8220;宸﹀?#8221;銆備緥濡傦細(xì)
const classA operator*(const classA& a1,const classA& a2);
銆銆operator*鐨勮繑鍥炵粨鏋滃繀欏繪槸涓涓猚onst瀵硅薄銆傚鏋滀笉鏄紝榪欐牱鐨勫彉鎬佷唬鐮佷篃涓嶄細(xì)緙栬瘧鍑洪敊錛?br>classA a, b, c;
(a * b) = c; // 瀵筧*b鐨勭粨鏋滆祴鍊?
銆銆鎿嶄綔(a * b) = c鏄劇劧涓嶇鍚堢紪紼嬭呯殑鍒濊》錛屼篃娌℃湁浠諱綍鎰忎箟銆?br>
8銆乂olatile鐨勪嬌鐢?br>鍏抽敭瀛梫olatile鏈変粈涔堝惈鎰?騫剁粰鍑轟笁涓笉鍚岀殑渚嬪瓙銆?
涓
涓畾涔変負(fù)volatile鐨勫彉閲忔槸璇磋繖鍙橀噺鍙兘浼?xì)琚剰鎯充笉鍒板湴鏀瑰彉锛寴q欐牱錛岀紪璇戝櫒灝變笉浼?xì)鍘诲亣璁緲q欎釜鍙橀噺鐨勫間簡銆傜簿紜湴璇村氨鏄紝浼樺寲鍣ㄥ湪鐢ㄥ埌榪欎釜鍙橀噺鏃跺繀欏?
姣忔閮藉皬蹇冨湴閲嶆柊璇誨彇榪欎釜鍙橀噺鐨勫鹼紝鑰屼笉鏄嬌鐢ㄤ繚瀛樺湪瀵勫瓨鍣ㄩ噷鐨勫浠斤紙鐢變簬璁塊棶瀵勫瓨鍣ㄧ殑閫熷害瑕佸揩榪嘡AM錛屾墍浠ョ紪璇戝櫒涓鑸兘浼?xì)浣滃噺灏戝瓨鍙栧閮≧AM鐨勪紭
鍖栵級銆備笅闈㈡槸volatile鍙橀噺鐨勫嚑涓緥瀛愶細(xì)
1) 騫惰璁懼鐨勭‖浠跺瘎瀛樺櫒錛堝錛氱姸鎬佸瘎瀛樺櫒錛岄氬父鍦ㄥご鏂囦歡涓皢紜歡瀵勫瓨鍣ㄥ湴鍧define涓烘煇涓剰涔夋槑紜殑琛ㄨ揪寮忥級
2) 涓涓腑鏂湇鍔″瓙紼嬪簭涓細(xì)璁塊棶鍒扮殑闈炶嚜鍔ㄥ彉閲?Non-automatic variables錛屽嵆static鍙橀噺) 錛涘湪涓柇鏈嶅姟紼嬪簭涓慨鏀圭殑渚涘叾浠栫▼搴忔嫻嬬敤鐨勫彉閲忛渶瑕佸姞volatile澹版槑錛涘惁鍒欑紪璇戝櫒鍙兘瀵瑰彉閲忔洿鏂頒竴嬈″悗姣忔閮戒嬌鐢ㄧ紦瀛樺間笉鍐嶇珛鍗蟲洿鏂幫紱
3) 澶氱嚎紼嬪簲鐢ㄤ腑琚嚑涓換鍔″叡浜殑鍙橀噺錛堝彲鑳借澶氫釜綰跨▼闅忔椂淇敼錛?
鍥?
絳斾笉鍑鴻繖涓棶棰樼殑浜烘槸涓嶄細(xì)琚泧浣g殑銆傛垜璁や負(fù)榪欐槸鍖哄垎C紼嬪簭鍛樺拰宓屽叆寮忕郴緇熺▼搴忓憳鐨勬渶鍩烘湰鐨勯棶棰樸傛悶宓屽叆寮忕殑瀹朵紮浠粡甯稿悓紜歡銆佷腑鏂丷TOS絳夌瓑鎵撲氦閬擄紝
鎵鏈夎繖浜涢兘瑕佹眰鐢ㄥ埌volatile鍙橀噺銆備笉鎳傚緱volatile鐨勫唴瀹瑰皢浼?xì)甯︽潵鐏鹃毦銆傚亣璁捐闈㈣瘯鑰呮紜湴鍥炵瓟浜嗚繖鏄棶棰橈紙鍡紝鎬鐤戞槸鍚︿細(xì)鏄繖鏍鳳級錛屾垜灝?
紼嶅井娣辯┒涓涓嬶紝鐪嬩竴涓嬭繖瀹朵紮鏄笉鏄洿姝f噦寰梫olatile瀹屽叏鐨勯噸瑕佹с?
1)涓涓弬鏁版棦鍙互鏄痗onst榪樺彲浠ユ槸volatile鍚楋紵瑙i噴涓轟粈涔堛?
2); 涓涓寚閽堝彲浠ユ槸volatile 鍚楋紵瑙i噴涓轟粈涔堛?
3); 涓嬮潰鐨勫嚱鏁版湁浠涔堥敊璇細(xì)
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
涓嬮潰鏄瓟妗堬細(xì)
1)鏄殑銆備竴涓緥瀛愭槸鍙鐨勭姸鎬佸瘎瀛樺櫒銆傚畠鏄痸olatile鍥犱負(fù)瀹冨彲鑳借鎰忔兂涓嶅埌鍦版敼鍙樸傚畠鏄痗onst鍥犱負(fù)紼嬪簭涓嶅簲璇ヨ瘯鍥懼幓淇敼瀹冦?
2); 鏄殑銆傚敖綆¤繖騫朵笉寰堝父瑙併備竴涓緥瀛愭槸褰撲竴涓腑鏂湇鍔″瓙紼嬪簭淇敼涓涓寚鍚戜竴涓猙uffer鐨勬寚閽堟椂銆?
3) 榪欐浠g爜鏈夌偣鍙樻併傝繖孌典唬鐮佺殑鐩殑鏄敤鏉ヨ繑鍥炴寚閽?ptr鎸囧悜鍊肩殑騫蟲柟錛屼絾鏄紝鐢變簬*ptr鎸囧悜涓涓獀olatile鍨嬪弬鏁幫紝緙栬瘧鍣ㄥ皢浜х敓綾諱技涓嬮潰鐨勪唬鐮侊細(xì)
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
鐢變簬*ptr鐨勫煎彲鑳借鎰忔兂涓嶅埌鍦拌鍙橈紝鍥犳a鍜宐鍙兘鏄笉鍚岀殑銆傜粨鏋滐紝榪欐浠g爜鍙兘榪斾笉鏄綘鎵鏈熸湜鐨勫鉤鏂瑰鹼紒姝g‘鐨勪唬鐮佸涓嬶細(xì)
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
鍏充簬volatile鍏抽敭瀛楀湪涓柇鍑芥暟涓殑褰卞搷瀹炰緥
涓插彛鍙戦佹暟鎹紝涓柇涓鍏舵嫻嬶紝褰撲腑鏂駭鐢熷悗錛岀疆鎺ユ敹鏍囧織錛屼富寰幆涓嫻嬫涓繪爣蹇楋紝鏈敤valotile淇グ鏃訛紝緙栬瘧緇撴灉濡備笅錛?br>
[0xe59f41bc] ldr r4錛?x30203378 ; = #0x302096f0
0x302031b8 [0xe5d40000] ldrb r0錛孾r4錛?0]
while(!uart1_rxFlag); //uart1_rxFlag涓哄叏灞鍙橀噺錛屽湪涓插彛鎺ユ敹涓柇涓疆1
0x302031bc [0xe3500000] cmp r0錛?0
0x302031c0 [0x0afffffd] beq 0x302031bc; (Can_Int_Test + 0x17c)
鍗?
緙栬瘧鍣ㄥ鍏惰繘琛屼簡浼樺寲錛岃鍙栦竴嬈art1_rxFlag鐨勫間箣鍚庯紝灝嗗叾瀛樻斁鍦ㄥ瘎瀛樺櫒r0涓紝姣旇緝鍚庯紝鏉′歡涓嶆弧瓚籌紝緇х畫絳夊緟錛屼絾鏈噸鏂板彇瀛樺偍鍣ㄤ腑
uart1_rxFlag鐨勫鹼紝姝ゆ椂鍗充嬌涓柇鏈嶅姟鍑芥暟涓慨鏀逛簡uart1_rxFlag鐨勫鹼紝姣旇緝澶勪粛鐒朵笉鑳藉彂鐜幫紝灝卞嚭鐜頒簡鏃犺濡備綍紼嬪簭灝卞仠鍦ㄦ澶勭殑闂?
棰樸?br>
// 鍔犱簡volatile鍏抽敭瀛楀悗錛岀紪璇戠殑緇撴灉
302031b4 ldr r4錛?x30203378 ; = #0x302096f0
while(uart1_rxFlag == 0);
302031b8 [0xe5d40000] ldrb r0錛孾r4錛?0]
302031bc [0xe3500000] cmp r0錛?0
302031c0 [0x0afffffc] beq 0x302031b8 ; (Can_Int_Test + 0x288)
娣誨姞浜嗗叧閿瓧鍚庯紝姣旇緝涓嶇瓑錛岃煩杞埌閲嶆柊鍙栧瓨鍌ㄥ櫒涓殑uart1_rxFlag錛屽洜姝や換浣曟椂鍊檜art1_rxFlag鐨勫奸兘鏄渶鏂扮殑銆?br>
涓瀹氱▼搴︾殑浼樺寲錛屽幓鎺変簡璇誨彇uart1_rxFlag鍦板潃鐨勮鍙ャ?br>
瀹?
涔変竴涓槗澶辨у彉閲忥紝緙栬瘧鍣ㄦ湁涓縐嶆妧鏈彨鏁版嵁嫻佸垎鏋愶紝鍒嗘瀽紼嬪簭涓殑鍙橀噺鍦ㄥ摢閲岃璧嬪箋佸湪鍝噷浣跨敤銆佸湪鍝噷澶辨晥錛屽垎鏋愮粨鏋滃彲浠ョ敤浜庡父閲忓悎騫訛紝甯擱噺浼犳挱絳変紭鍖栥?
褰撶紪璇戝櫒媯(gè)鏌ュ埌浠g爜娌℃湁淇敼瀛楁鐨勫鹼紝灝辨湁鍙兘鍦ㄤ綘璁塊棶瀛楁鏃舵彁渚涗笂嬈¤闂殑緙撳瓨鍊鹼紝榪欒兘澶熸彁楂樼▼搴忕殑鏁堢巼錛屼絾鏈夋椂榪欎簺浼樺寲浼?xì)甯︽潵闂锛屼笉鏄垜浠E嬪簭鎵闇
瑕佺殑錛岀壒鐐規(guī)槸瀵圭‖浠跺瘎瀛樺櫒鎿嶄綔鐨勭▼搴忥紝榪欐椂鍙互鐢╲olatile鍏抽敭瀛楃姝㈠仛榪欎簺浼樺寲銆?br>
澶氫換鍔$幆澧冧笅鍚勪換鍔¢棿鍏變韓鐨勬爣蹇楀簲璇ュ姞voatile鍏抽敭瀛楋細(xì)鍦ㄥ綰跨▼璁塊棶鏌愬瓧孌墊椂錛屼唬鐮佸笇鏈涜繖浜涜闂兘澶熸搷浣滐紙璇誨彇錛夊埌瀛楁鐨勬渶鏂板鹼紝鍚屾椂鍐欏埌鍙橀噺鐨勬搷浣滆兘绔嬪嵆鏇存柊錛涘瀛楁鍔犱笂volatile鍏抽敭瀛楋紝閭d箞瀵硅瀛楁鐨勪換浣曡姹傦紙璇?鍐欙級閮戒細(xì)绔嬪埢寰楀埌鎵ц銆?br>
9銆佷綅鎿嶄綔錛圔it manipulation錛?
宓屽叆寮忕郴緇熸繪槸瑕佺敤鎴峰鍙橀噺鎴栧瘎瀛樺櫒榪涜浣嶆搷浣溿傜粰瀹氫竴涓暣鍨嬪彉閲廰錛屽啓涓ゆ浠g爜錛岀涓涓緗產(chǎn)鐨刡it 3錛岀浜屼釜娓呴櫎a 鐨刡it 3銆傚湪浠ヤ笂涓や釜鎿嶄綔涓紝瑕佷繚鎸佸叾瀹冧綅涓嶅彉銆?瀵硅繖涓棶棰樻湁涓夌鍩烘湰鐨勫弽搴?
1)涓嶇煡閬撳浣曚笅鎵嬨傝琚潰鑰呬粠娌″仛榪囦換浣曞祵鍏ュ紡緋葷粺鐨勫伐浣溿?
2) 鐢╞it fields銆侭it fields鏄鎵斿埌C璇█姝昏鐨勪笢瑗匡紝瀹冧繚璇佷綘鐨勪唬鐮佸湪涓嶅悓緙栬瘧鍣ㄤ箣闂存槸涓嶅彲縐繪鐨勶紝鍚屾椂涔熶繚璇佷簡鐨勪綘鐨勪唬鐮佹槸涓嶅彲閲嶇敤鐨勩?br>
3) 鐢?#defines 鍜?bit masks 鎿嶄綔銆傝繖鏄竴涓湁鏋侀珮鍙Щ妞嶆х殑鏂規(guī)硶錛屾槸搴旇琚敤鍒扮殑鏂規(guī)硶銆傛渶浣崇殑瑙e喅鏂規(guī)濡備笅錛?
#define BIT3 (0x1 << 3) 錛堥噰鐢ㄥ畯灝嗘暟瀛楀畾涔変負(fù)鏈夋剰涔夌殑BIT3錛屾槑紜紝涓嶆槗鍑洪敊錛屾敼璧鋒潵鏂逛究錛?br>
static int a;
void set_bit3(void)
{
a |= BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}
涓
浜涗漢鍠滄涓鴻緗拰娓呴櫎鍊艱屽畾涔変竴涓帺鐮侊紙寰呮搷浣滀綅鍏?錛屽叾浣欎綅鍏?鐨勬暟錛屽浜庢煇涓剰涔夐潬澶氫綅鍚屾椂琛ㄧず鐨勬渶濂藉甫涓婃帺鐮侊紝闅旂鍏朵粬浣嶇殑褰卞搷錛夊悓鏃跺畾涔変竴浜涜鏄?
甯告暟錛岃繖涔熸槸鍙互鎺ュ彈鐨勩傛垜甯屾湜鐪嬪埌鍑犱釜瑕佺偣錛氳鏄庡父鏁般亅=鍜?amp;=~鎿嶄綔錛屽厛鍙栧弽鍐?amp;鏄鏌愪綅娓?鐨勬渶濂芥搷浣溿?
鑰冪偣錛?br>
鍦ㄥ祵鍏ュ紡緋葷粺涓紝鏃跺埢瑕佸叧娉ㄧЩ妞嶆э紝鍏蜂綋鐨勭▼搴忎腑涓嶈鍑虹幇鍏蜂綋鐨勬暟瀛楋紝榪欎簺鏁板瓧閮藉簲璇efine鎴愭煇涓湁鎰忎箟鐨勭鍙鳳紝鍙鎬у彲縐繪鎬ч兘寰堝己錛屾瘮濡?br>
#define BIT(x) (0x1 << (x))
X浣滀負(fù)鍙傛暟鍙互寰堟柟渚跨殑瀵逛換鎰忎綅榪涜鎿嶄綔錛屾剰涔夋槑紜紝鏇存敼鏇挎崲鏂逛究
10銆佽闂浐瀹氱殑鍐呭瓨浣嶇疆錛圓ccessing fixed memory locations錛?
宓屽叆寮忕郴緇熺粡甯稿叿鏈夎姹傜▼搴忓憳鍘昏闂煇鐗瑰畾鐨勫唴瀛樹綅緗殑鐗圭偣銆?
鍦?
鏌愬伐紼嬩腑錛岃姹傝緗竴緇濆鍦板潃涓?x67a9鐨勬暣鍨嬪彉閲忕殑鍊間負(fù)0xaa66銆傜紪璇戝櫒鏄竴涓函綺圭殑ANSI緙栬瘧鍣ㄣ傚啓浠g爜鍘誨畬鎴愯繖涓浠誨姟銆傝繖涓闂?gòu)箣璇曚綘鏄?
鍚︾煡閬撲負(fù)浜嗚闂竴緇濆鍦板潃鎶婁竴涓暣鍨嬫暟寮哄埗杞崲錛坱ypecast錛変負(fù)涓鎸囬拡鏄悎娉曠殑銆傝繖涓闂鐨勫疄鐜版柟寮忛殢鐫涓漢椋庢牸涓嶅悓鑰屼笉鍚屻傚吀鍨嬬殑綾諱技浠g爜濡備笅錛?
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55;
A more obscure approach is: ( 涓涓緝鏅︽訂鐨勬柟娉曟槸)錛?
*(int * const)(0x67a9) = 0xaa55;
鍗充嬌浣犵殑鍝佸懗鏇存帴榪戠浜岀鏂規(guī)錛屼絾鎴戝緩璁綘鍦ㄩ潰璇曟椂浣跨敤絎竴縐嶆柟妗堛?
鍦ㄥ祵鍏ュ紡緋葷粺涓紝瀵逛簬澶ч噺姝ょ被鍨嬫暟鎹紜歡瀵勫瓨鍣ㄥ簲璇ラ噰鐢ㄥ涓嬫柟寮?br>
typedef volatile unsigned int HARD_REG;
#define REG_NAME (*(HARD_REG *)ADDR)
鍗沖皢ADDR寮哄埗杞崲涓轟竴涓寚鍚慔ARD_REG綾誨瀷鏁版嵁鐨勬寚閽堬紝*HARD_REG涓簐olatile鐨勬棤絎﹀彿鏁村瀷鏁?br>
11銆佷腑鏂紙Interrupts錛?
涓?
鏂槸宓屽叆寮忕郴緇熶腑閲嶈鐨勭粍鎴愰儴鍒嗭紝榪欏鑷翠簡寰堝緙栬瘧寮鍙戝晢鎻愪緵涓縐嶆墿灞?璁╂爣鍑咰鏀寔涓柇銆傚叾浠h〃浜嬪疄鏄紝浜х敓浜嗕竴涓柊鐨勫叧閿瓧
__interrupt錛?1鍗沖姝わ級銆備笅闈㈢殑浠g爜灝變嬌鐢ㄤ簡__interrupt鍏抽敭瀛楀幓瀹氫箟浜嗕竴涓腑鏂湇鍔″瓙紼嬪簭(ISR)錛岃璇勮涓涓嬭繖孌典唬鐮佺殑銆?
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}
榪欎釜鍑芥暟鏈夊お澶氱殑閿欒浜嗭紝浠ヨ嚦璁╀漢涓嶇煡浠庝綍璇磋搗浜嗭紙鍓嶆彁鏄潪鎿嶄綔緋葷粺涓嬬殑涓柇鏈嶅姟鍑芥暟錛夛細(xì)
1)ISR 涓嶈兘榪斿洖涓涓鹼紙閮藉簲璇ヤ負(fù)void綾誨瀷錛夈傚鏋滀綘涓嶆噦榪欎釜錛岄偅涔堜綘涓嶄細(xì)琚泧鐢ㄧ殑銆?
2)ISR 涓嶈兘浼犻掑弬鏁般傚鏋滀綘娌℃湁鐪嬪埌榪欎竴鐐癸紝浣犺闆囩敤鐨勬満浼?xì)绛夊悓绗竴欏廣?
3)鍦ㄨ澶氱殑澶勭悊鍣?緙栬瘧鍣ㄤ腑錛屾誕鐐逛竴鑸兘鏄笉鍙噸鍏ョ殑銆傛湁浜涘鐞嗗櫒/緙栬瘧鍣ㄩ渶瑕佽棰濆鐨勫瘎瀛樺櫒鍏ユ爤錛屾湁浜涘鐞嗗櫒/緙栬瘧鍣ㄥ氨鏄笉鍏佽鍦↖SR涓仛嫻偣榪愮畻銆傛澶栵紝ISR搴旇鏄煭鑰屾湁鏁堢巼鐨勶紝鍦↖SR涓仛嫻偣榪愮畻鏄笉鏄庢櫤鐨勩?
///////////////////////////////
鍙﹀涓柇鏈嶅姟紼嬪簭鏄繍琛屽湪鍐呮牳鎬佺殑錛坙inux錛夛紝鍐呮牳閫氬父鏄笉鏀寔嫻偣榪愮畻鐨勩?br>
http://access911.net/n/doc1.asp?mode=a&aid=4750647
鍐呮牳涓殑printk鍜屾爣鍑嗗簱鐨刾rintf涓嶄竴鏍鳳紝鍓嶈呭洜涓虹敱鍐呮牳鐩存帴瀹炵幇錛屼笉鑳芥敮鎸佹誕鐐廣?br>
鍦紲linux鍐呮牳璁捐涓庡疄鐜幫紴鐨勭涓绔犱腑鍐呮牳寮鍙戠殑鐗圭偣涓灝忚妭閲屽氨鏈夋瘮杈冧簡鍐呮牳寮鍙戜笌搴旂敤寮鍙戠殑宸紓銆傚叾涓竴鐐瑰氨鏄唴鏍哥紪紼嬫椂嫻偣鏁扮殑闂錛屼功涓湁涓鍙ヨ瘽鏄細(xì)鍐呮牳緙栫▼鏃舵誕鐐規(guī)暟寰堥毦浣跨敤
鍥犱負(fù)娌℃湁嫻偣鍗曞厓,鍐呮牳瑕佹敮鎸佹誕鐐瑰繀欏繪妸鍐呮牳浠oft-float 鏂瑰紡閲嶆柊緙栬瘧,鍏惰繛鎺ユ墍鏈夌殑搴撲篃閮借鐢╯oft-float 鏂瑰紡緙栬瘧.
鍚﹀垯鍙﹀涓縐嶆柟寮忎嬌鐢ㄦ暣鏁板畾涔夋誕鐐圭被鍨嬪姞嫻偣棰勭畻搴撳畬鎴愪綘鐨勫伐浣?
http://topic.csdn.net/u/20070417/16/a4b56569-228c-4b70-b5ab-30ee61c99a3d.html
濡傛灉浣犵殑鍐呮牳閲岀紪璇戣繘浜嗘誕鐐規(guī)敮鎸侊紝閭d箞鏄彲浠ョ殑銆傝涓嶅唴鏍告垨鏄ā鍧椾笉鑳界敤float鎴栨槸double鍐呭瀷鐨勫彉閲忔垨鍑芥暟
鍦ㄩ厤緗唴鏍哥殑鏃跺欐妸嫻偣妯℃嫙鍣ㄩ変笂錛屽簲璇ユ槸鍙互鏀寔鐨勶紝浣嗘槸閫熷害闈炲父鎱€?
鎴戞浘緇忛亣鍒拌繃錛岀‖浠舵槑鏄庢敮鎸佹誕鐐硅繍綆楃殑FPU錛屼絾鏄紪璇戝唴鏍哥殑鏃跺欓変笂浜嗘誕鐐規(guī)ā鎷熷櫒錛岀粨鏋滄墍鏈夌殑搴旂敤紼嬪簭鐨勬誕鐐硅繍綆楅熷害閮介潪甯告參銆傛墍浠ユ垜鎬鐤戣鏀寔嫻偣鍙緙栬瘧鍐呮牳鐨勬椂鍊欓変笂錛屽浜庡簲鐢ㄧ▼搴忎笉闇瑕佹庝箞鍏沖績銆?br>
///////////////////////////////
4) 涓庣涓夌偣涓鑴夌浉鎵匡紝printf()緇忓父鏈夐噸鍏ュ拰鎬ц兘涓婄殑闂銆傚鏋滀綘涓㈡帀浜嗙涓夊拰絎洓鐐癸紝鎴戜笉浼?xì)澶负闅句綘鐨勩備笉鐢ㄨ錛屽鏋滀綘鑳藉緱鍒板悗涓ょ偣錛岄偅涔堜綘鐨勮闆囩敤鍓嶆櫙瓚婃潵瓚婂厜鏄庝簡銆?
12銆佺鍙鋒墿灞曠殑浠g爜渚嬪瓙錛圕ode examples錛?
涓嬮潰鐨勪唬鐮佽緭鍑烘槸浠涔堬紝涓轟粈涔堬紵
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("> 6") : puts("<= 6");
}
Vc6.0嫻嬭瘯鎯呭喌
void main(void)
{
unsigned int a = 6;
int b = -20;
printf("unsigned int a + int b = %x\n", (a + b));
}
/*unsigned int a + int b = fffffff2*/
榪?
涓棶棰樻祴璇曚綘鏄惁鎳傚緱C璇█涓殑鏁存暟鑷姩杞崲鍘熷垯錛屾垜鍙戠幇鏈変簺寮鍙戣呮噦寰楁瀬灝戣繖浜涗笢瑗褲備笉綆″浣曪紝榪欐棤絎﹀彿鏁村瀷闂鐨勭瓟妗堟槸杈撳嚭鏄?
">6"銆傚師鍥犳槸褰撹〃杈懼紡涓瓨鍦ㄦ湁絎﹀彿綾誨瀷鍜屾棤絎﹀彿綾誨瀷鏃舵墍鏈夌殑鎿嶄綔鏁伴兘鑷姩杞崲涓烘棤絎﹀彿綾誨瀷銆傚洜姝?20鍙樻垚浜嗕竴涓潪甯稿ぇ鐨勬鏁存暟錛屾墍浠ヨ琛ㄨ揪寮?
璁$畻鍑虹殑緇撴灉澶т簬6銆傝繖涓鐐瑰浜庨綣佺敤鍒版棤絎﹀彿鏁版嵁綾誨瀷鐨勫祵鍏ュ紡緋葷粺錛堢‖浠跺瘎瀛樺櫒鐨勫煎叏閮ㄦ槸鏃犵鍙風(fēng)殑錛夋潵璇存槸涓板父閲嶈鐨勩傚鏋滀綘絳旈敊浜嗚繖涓棶棰橈紝浣犱篃灝卞埌
浜嗗緱涓嶅埌榪欎喚宸ヤ綔鐨勮竟緙樸?
13銆佸鐞嗗櫒瀛楅暱瀵艱嚧鐨勬暟鎹墿灞曢棶棰?br>璇勪環(huán)涓嬮潰鐨勪唬鐮佺墖鏂細(xì)
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
/*1's complement of zero */ 0鐨勮ˉ鐮佷負(fù)鍏?鐨勬暟
瀵逛簬涓涓猧nt鍨嬩笉鏄?6浣嶇殑澶勭悊鍣ㄤ負(fù)璇達(dá)紝涓婇潰鐨勪唬鐮佹槸涓嶆紜殑銆傚簲緙栧啓濡備笅錛?
unsigned int compzero = ~0;
榪欎竴闂鐪熸鑳芥彮闇插嚭搴旇瘯鑰呮槸鍚︽噦寰楀鐞嗗櫒瀛楅暱鐨勯噸瑕佹э紙宓屽叆寮忓鉤鍙板彲鑳芥槸8銆?6銆?2鐨勶紝縐繪鐨勮搴︽潵璇村啓鍑哄浐瀹氱殑0xFFFF鏄笉瀵圭殑錛夈傚湪鎴戠殑緇忛獙閲岋紝濂界殑宓屽叆寮忕▼搴忓憳闈炲父鍑嗙‘鍦版槑鐧界‖浠剁殑緇嗚妭鍜屽畠鐨勫眬闄愶紝鐒惰孭C鏈虹▼搴忓線寰鎶婄‖浠朵綔涓轟竴涓棤娉曢伩鍏嶇殑鐑︽伡銆?
鍒?
浜嗚繖涓樁孌碉紝搴旇瘯鑰呮垨鑰呭畬鍏ㄥ瀭澶翠撫姘斾簡鎴栬呬俊蹇冩弧婊″織鍦ㄥ繀寰椼傚鏋滄樉鐒跺簲璇曡呬笉鏄緢濂斤紝閭d箞榪欎釜嫻嬭瘯灝卞湪榪欓噷緇撴潫浜嗐備絾濡傛灉鏄劇劧搴旇瘯鑰呭仛寰椾笉閿欙紝閭d箞鎴戝氨
鎵斿嚭涓嬮潰鐨勮拷鍔犻棶棰橈紝榪欎簺闂鏄瘮杈冮毦鐨勶紝鎴戞兂浠呬粎闈炲父浼樼鐨勫簲璇曡呰兘鍋氬緱涓嶉敊銆傛彁鍑鴻繖浜涢棶棰橈紝鎴戝笇鏈涙洿澶氱湅鍒板簲璇曡呭簲浠橀棶棰樼殑鏂規(guī)硶錛堝緢閲嶈鍝︼紝闈㈣瘯鑰呭叧
娉ㄧ殑鏄綘鎬濊冮棶棰樿В鍐抽棶棰樼殑榪囩▼錛屽綋浣犱笉鐭ラ亾絳旀鏃跺崈涓囧崈涓囦笉瑕佺寽涓涓瓟妗堢粰浠栵紝鍥犱負(fù)鐜板湪涓嶆槸閫夋嫨棰橈紝闈㈣瘯瀹樿鐨勬槸榪囩▼錛屼綘鍙渶瑕佸皢浣犺冭檻闂鐨勮繃紼嬭鏄?
鐧藉氨O(jiān)K浜嗭級錛岃屼笉鏄瓟妗堛備笉綆″浣曪紝浣犲氨褰撴槸榪欎釜濞變箰鍚?..
14銆佸姩鎬佸唴瀛樺垎閰嶏紙Dynamic memory allocation錛?
灝?
綆′笉鍍忛潪宓屽叆寮忚綆楁満閭d箞甯歌錛屽祵鍏ュ紡緋葷粺榪樻槸鏈変粠鍫嗭紙heap錛変腑鍔ㄦ佸垎閰嶅唴瀛樼殑榪囩▼鐨勩傞偅涔堝祵鍏ュ紡緋葷粺涓紝鍔ㄦ佸垎閰嶅唴瀛樺彲鑳藉彂鐢熺殑闂鏄粈涔堬紵榪欓噷錛?
鎴戞湡鏈涘簲璇曡呰兘鎻愬埌鍐呭瓨紕庣墖錛岀鐗囨敹闆嗙殑闂錛屽彉閲忕殑鎸佽鏃墮棿絳夌瓑銆傝繖涓富棰樺凡緇忓湪ESP鏉傚織涓騫挎硾鍦拌璁鴻繃浜嗭紙涓昏鏄?P.J. Plauger,
浠栫殑瑙i噴榪滆繙瓚呰繃鎴戣繖閲岃兘鎻愬埌鐨勪換浣曡В閲婏級錛屾墍鏈夊洖榪囧ご鐪嬩竴涓嬭繖浜涙潅蹇楀惂錛佽搴旇瘯鑰呰繘鍏ヤ竴縐嶈櫄鍋囩殑瀹夊叏鎰熻鍚庯紝鎴戞嬁鍑鴻繖涔堜竴涓皬鑺傜洰錛氫笅闈㈢殑浠g爜鐗囨鐨勮緭
鍑烘槸浠涔堬紝涓轟粈涔堬紵
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts("Got a null pointer");
else
puts("Got a valid pointer");
榪?
鏄竴涓湁瓚g殑闂銆傛渶榪戝湪鎴戠殑涓涓悓浜嬩笉緇忔剰鎶?鍊間紶緇欎簡鍑芥暟malloc錛屽緱鍒頒簡涓涓悎娉曠殑鎸囬拡涔嬪悗錛屾垜鎵嶆兂鍒拌繖涓棶棰樸傝繖灝辨槸涓婇潰鐨勪唬鐮侊紝璇ヤ唬鐮佺殑杈?
鍑烘槸"Got a valid
pointer"銆傛垜鐢ㄨ繖涓潵寮濮嬭璁鴻繖鏍風(fēng)殑涓闂錛岀湅鐪嬭闈㈣瘯鑰呮槸鍚︽兂鍒板簱渚嬬▼榪欐牱鍋氭槸姝g‘錛堝洜涓哄鏋滅敵璇峰け璐ワ紝鍒欑▼搴忓鐞嗚涓哄唴瀛樹笉瓚充簡錛屼竴鑸細(xì)緇堟
紼嬪簭錛屾槸寰堜弗閲嶇殑闂錛燂級銆傚緱鍒版紜殑絳旀鍥虹劧閲嶈錛屼絾瑙e喅闂鐨勬柟娉曞拰浣犲仛鍐沖畾鐨勫熀鏈師鐞嗘洿閲嶈浜涖?
榪斿洖涓鍊嬫帶鎸囬嚌閭勬槸鎸囧悜 0 瀛楃瘈鐨勬寚閲濈敋鑷蟲寚鍚戜竴涓彲浠ユ搷浣滅殑鎸囬拡錛?br>
錛堝彇鍐充簬緋葷粺騫沖彴鐨勫疄鐜幫紝C99鍙?qiáng)鍏朵粬鏍囧噯瑙勫畾鍙互涓嶅悓鐨勫Q?br>
malloc(0)
in glibc returns a valid pointer to something(!?!?) while in uClibc
calling malloc(0) returns a NULL. The behavior of malloc(0) is listed
as implementation-defined by SuSv3, so both libraries are equally
correct. This difference also applies to realloc(NULL, 0). I personally
feel glibc's behavior is not particularly safe. To enable glibc
behavior, one has to explicitly enable the MALLOC_GLIBC_COMPAT option.
15銆佺敤Typedef鏋勯犲鍚堢被鍨?
鍦–璇█涓綣佺敤浠ュ0鏄庝竴涓凡緇忓瓨鍦ㄧ殑鏁版嵁綾誨瀷鐨勫悓涔夊瓧銆備篃鍙互鐢ㄩ澶勭悊鍣ㄥ仛綾諱技鐨勪簨銆備緥濡傦紝鎬濊冧竴涓嬩笅闈㈢殑渚嬪瓙錛?
#define dPS struct s *
typedef struct s * tPS;
浠ヤ笂涓ょ鎯呭喌鐨勬剰鍥鵑兘鏄瀹氫箟dPS 鍜?tPS 浣滀負(fù)涓涓寚鍚戠粨鏋剆鎸囬拡銆傚摢縐嶆柟娉曟洿濂藉憿錛燂紙濡傛灉鏈夌殑璇濓級涓轟粈涔堬紵
榪欐槸涓涓潪甯稿井濡欑殑闂錛屼換浣曚漢絳斿榪欎釜闂錛堟褰撶殑鍘熷洜鍝︼紝鑰屼笉鏄寽錛屽鏋滀綘娌℃湁鍘熷洜錛岃涓嶄細(xì)姣旂寽涓涓瓟妗堣濂界殑澶氾紝璁頒綇鍟婏紝璇磋瘽鏄璁叉牴鎹殑錛夋槸搴斿綋琚伃鍠滅殑銆傜瓟妗堟槸錛歵ypedef鏇村ソ銆傛濊冧笅闈㈢殑渚嬪瓙錛?
dPS p1,p2;
tPS p3,p4;
絎竴涓墿灞曚負(fù)
struct s * p1, p2;
涓婇潰鐨勪唬鐮佸畾涔塸1涓轟竴涓寚鍚戠粨鏋勭殑鎸囷紝p2涓轟竴涓疄闄呯殑緇撴瀯錛岃繖涔熻涓嶆槸浣犳兂瑕佺殑銆傜浜屼釜渚嬪瓙姝g‘鍦板畾涔変簡p3 鍜宲4 涓や釜鎸囬拡銆?
16銆佹櫐娑╃殑璇硶鍙?qiáng)浠g爜椋庢?
C璇█鍚屾剰涓浜涗護(hù)浜洪渿鎯婄殑緇撴瀯,涓嬮潰鐨勭粨鏋勬槸鍚堟硶鐨勫悧錛屽鏋滄槸瀹冨仛浜涗粈涔堬紵
int a = 5, b = 7, c;
c = a+++b;
榪欎釜闂灝嗗仛涓鴻繖涓祴楠岀殑涓涓剦蹇殑緇撳熬銆備笉綆′綘鐩鎬笉鐩鎬俊錛屼笂闈㈢殑渚嬪瓙鏄畬鍏ㄥ悎涔庤娉曠殑銆傞棶棰樻槸緙栬瘧鍣ㄥ浣曞鐞嗗畠錛熸按騫充笉楂樼殑緙栬瘧浣滆呭疄闄呬笂浼?xì)浜夎櫩欎釜闂锛尵~栬瘧鍣ㄥ簲灝藉彲鑳藉鐨勪粠宸﹁嚦鍙沖皢鑻ュ共涓瓧絎︾粍鎴愪竴涓繍綆楃銆傚洜姝わ紝涓婇潰鐨勪唬鐮佽澶勭悊鎴愶細(xì)c = a++ + b;
閫楀彿琛ㄨ揪寮忎緷嬈″姣忎釜琛ㄨ揪寮忚綆楋紝鏈鍚庣殑緇撴灉涓烘渶鍚庝竴涓〃杈懼紡鐨勫?br>
鍥犳, 榪欐浠g爜鎵ц鍚巃 = 6, b = 7, c = 12銆?
濡傛灉浣犵煡閬撶瓟妗堬紝鎴栫寽鍑烘紜瓟妗堬紝鍋氬緱濂姐傚鏋滀綘涓嶇煡閬撶瓟妗堬紝鎴戜篃涓嶆妸榪欎釜褰撲綔闂銆傛垜鍙戠幇榪欎釜闂鐨勬渶澶уソ澶勬槸榪欐槸涓涓叧浜庝唬鐮佺紪鍐欓鏍鹼紙瑕佹槑紜殑鍔犱笂鎷彿錛岄伩鍏嶆涔夋垨鑰呯紪璇戝櫒涓嶅悓甯︽潵鐨勫樊寮傦級錛屼唬鐮佺殑鍙鎬э紝浠g爜鐨勫彲淇敼鎬х殑濂界殑璇濋銆?
娉細(xì)寮曞嚭浠g爜椋庢牸鐨勯棶棰樻鏄綔鑰呴棶姝ら棶棰樼殑鐩殑錛岃繖鍛婅瘔鎴戜滑瑕佹彛鎽╅潰璇曠姣忎釜闂鑳屽悗闅愯棌鐨勮冩煡鐐癸紝鑳藉瓚佹満鍙戞尌涓嬪氨澶у姛鍛婃垚浜嗭紒
濂戒簡錛屼紮璁′滑錛屼綘鐜板湪宸茬粡鍋氬畬鎵鏈夌殑嫻嬭瘯浜嗐傝繖灝辨槸鎴戝嚭鐨凜璇█嫻嬭瘯棰橈紝鎴戞鐫鎰夊揩鐨勫績鎯呭啓瀹屽畠錛屽笇鏈涗綘浠ュ悓鏍風(fēng)殑蹇冩儏璇誨畬瀹冦傚鏋滄槸璁や負(fù)榪欐槸涓涓ソ鐨勬祴璇曪紝閭d箞灝介噺閮界敤鍒頒綘鐨勬壘宸ヤ綔鐨勮繃紼嬩腑鍘誨惂銆傚ぉ鐭ラ亾涔熻榪囦釜涓涓ゅ勾錛屾垜灝變笉鍋氱幇鍦ㄧ殑宸ヤ綔錛屼篃闇瑕佹壘涓涓?
浠ヤ笅涓轟笂榪?6涓棶棰樼殑鑻辨枃琛ㄨ堪錛岀啛鎮(zhèn)変笅鐩稿叧鐨勪笓涓氳瘝姹囧浜庤嫳鏂囬潰璇曠殑綆鍗曡〃榪板緢閲嶈銆?br>
http://www.yuanma.org/data/2007/0509/article_2585.htm
An
obligatory and significant part of the recruitment process for embedded
systems programmers seems to be the "C test." Over the years, I have
had to both take and prepare such tests and, in doing so, have realized
that these tests can be informative for both the interviewer and
interviewee. Furthermore, when given outside the pressure of an
interview situation, these tests can also be quite entertaining.
From
the interviewee's perspective, you can learn a lot about the person who
has written or administered the test. Is the test designed to show off
the writer's knowledge of the minutiae of the ANSI standard rather than
to test practical know-how? Does it test ludicrous knowledge, such as
the ASCII values of certain characters? Are the questions heavily
slanted towards your knowledge of system calls and memory allocation
strategies, indicating that the writer may spend his time programming
computers instead of embedded systems? If any of these are true, then I
know I would seriously doubt whether I want the job in question.
From
the interviewer's perspective, a test can reveal several things about
the candidate. Primarily, you can determine the level of the
candidate's knowledge of C. However, it's also interesting to see how
the person responds to questions to which they don't know the answers.
Do they make intelligent choices backed up with good intuition, or do
they just guess? Are they defensive when they are stumped, or do they
exhibit a real curiosity about the problem and see it as an opportunity
to learn something? I find this information as useful as their raw
performance on the test.
With these ideas in mind, I have
attempted to construct a test that is heavily slanted towards the
requirements of embedded systems. This is a lousy test to give to
someone seeking a job writing compilers! The questions are almost all
drawn from situations I have encountered over the years. Some of them
are tough; however, they should all be informative.
This test
may be given to a wide range of candidates. Most entry-level applicants
will do poorly on this test, while seasoned veterans should do very
well. Points are not assigned to each question, as this tends to
arbitrarily weight certain questions. However, if you choose to adapt
this test for your own uses, feel free to assign scores.
Preprocessor
1.
Using the #define statement, how would you declare a manifest constant
that returns the number of seconds in a year? Disregard leap years in
your answer.
#define SECONDS_PER_YEAR
(60 * 60 * 24 * 365)UL
I'm looking for several things here:
Basic knowledge of the #define syntax (for example, no semi-colon at the end, the need to parenthesize, and so on)
An
understanding that the pre-processor will evaluate constant expressions
for you. Thus, it is clearer, and penalty-free, to spell out how you
are calculating the number of seconds in a year, rather than actually
doing the calculation yourself
A realization that the
expression will overflow an integer argument on a 16-bit machine-hence
the need for the L, telling the compiler to treat the variable as a
Long
As a bonus, if you modified the expression with a UL
(indicating unsigned long), then you are off to a great start. And
remember, first impressions count!
2. Write the "standard" MIN macro-that is, a macro that takes two arguments and returns the smaller of the two arguments.
#define MIN(A,B)
((A)
<
= (B) ? (A) : (B))
The purpose of this question is to test the following:
Basic
knowledge of the #define directive as used in macros. This is important
because until the inline operator becomes part of standard C, macros
are the only portable way of generating inline code. Inline code is
often necessary in embedded systems in order to achieve the required
performance level
Knowledge of the ternary conditional
operator. This operator exists in C because it allows the compiler to
produce more optimal code than an if-then-else sequence. Given that
performance is normally an issue in embedded systems, knowledge and use
of this construct is important
Understanding of the need to very carefully parenthesize arguments to macros
I
also use this question to start a discussion on the side effects of
macros, for example, what happens when you write code such as:
least = MIN(*p++, b);
3. What is the purpose of the preprocessor directive #error?
Either
you know the answer to this, or you don't. If you don't, see Reference
1. This question is useful for differentiating between normal folks and
the nerds. Only the nerds actually read the appendices of C textbooks
to find out about such things. Of course, if you aren't looking for a
nerd, the candidate better hope she doesn't know the answer.
Infinite loops
4. Infinite loops often arise in embedded systems. How does you code an infinite loop in C?
There are several solutions to this question. My preferred solution is:
while(1)
{
?
}
Many programmers seem to prefer:
for(;;)
{
?
}
This
construct puzzles me because the syntax doesn't exactly spell out
what's going on. Thus, if a candidate gives this as a solution, I'll
use it as an opportunity to explore their rationale for doing so. If
their answer is basically, "I was taught to do it this way and I
haven't thought about it since," it tells me something (bad) about
them.
A third solution is to use a goto :
Loop:
...
goto Loop;
Candidates
who propose this are either assembly language programmers (which is
probably good), or else they are closet BASIC/FORTRAN programmers
looking to get into a new field.
Data declarations
5. Using the variable a, give definitions for the following:
a) An integer
b) A pointer to an integer
c) A pointer to a pointer to an integer
d) An array of 10 integers
e) An array of 10 pointers to integers
f) A pointer to an array of 10 integers
g) A pointer to a function that takes an integer as an argument and returns an integer
h) An array of ten pointers to functions that take an integer argument and return an integer
The answers are:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
People
often claim that a couple of these are the sorts of thing that one
looks up in textbooks-and I agree. While writing this article, I
consulted textbooks to ensure the syntax was correct. However, I expect
to be asked this question (or something close to it) when I'm being
interviewed. Consequently, I make sure I know the answers, at least for
the few hours of the interview. Candidates who don't know all the
answers (or at least most of them) are simply unprepared for the
interview. If they can't be prepared for the interview, what will they
be prepared for?
Static
6. What are the uses of the keyword static?
This simple question is rarely answered completely. Static has three distinct uses in C:
A variable declared static within the body of a function maintains its value between function invocations
A
variable declared static within a module, (but outside the body of a
function) is accessible by all functions within that module. It is not
accessible by functions within any other module. That is, it is a
localized global
Functions declared static within a module may
only be called by other functions within that module. That is, the
scope of the function is localized to the module within which it is
declared
Most candidates get the first part correct. A
reasonable number get the second part correct, while a pitiful number
understand the third answer. This is a serious weakness in a candidate,
since he obviously doesn't understand the importance and benefits of
localizing the scope of both data and code.
Const
7. What does the keyword const mean?
As
soon as the interviewee says "const means constant," I know I'm dealing
with an amateur. Dan Saks has exhaustively covered const in the last
year, such that every reader of ESP should be extremely familiar with
what const can and cannot do for you. If you haven't been reading that
column, suffice it to say that const means "read-only." Although this
answer doesn't really do the subject justice, I'd accept it as a
correct answer. (If you want the detailed answer, read Saks'
columns-carefully!)
If the candidate gets the answer correct, I'll ask him these supplemental questions:
What do the following declarations mean?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
The
first two mean the same thing, namely a is a const (read-only) integer.
The third means a is a pointer to a const integer (that is, the integer
isn't modifiable, but the pointer is). The fourth declares a to be a
const pointer to an integer (that is, the integer pointed to by a is
modifiable, but the pointer is not). The final declaration declares a
to be a const pointer to a const integer (that is, neither the integer
pointed to by a, nor the pointer itself may be modified). If the
candidate correctly answers these questions, I'll be impressed.
Incidentally, you might wonder why I put so much emphasis on const,
since it is easy to write a correctly functioning program without ever
using it. I have several reasons:
The use of const conveys
some very useful information to someone reading your code. In effect,
declaring a parameter const tells the user about its intended usage. If
you spend a lot of time cleaning up the mess left by other people,
you'll quickly learn to appreciate this extra piece of information. (Of
course, programmers who use const , rarely leave a mess for others to
clean up.)
const has the potential for generating tighter code by giving the optimizer some additional information
Code
that uses const liberally is inherently protected by the compiler
against inadvertent coding constructs that result in parameters being
changed that should not be. In short, they tend to have fewer bugs
Volatile
8. What does the keyword volatile mean? Give three different examples of its use.
A
volatile variable is one that can change unexpectedly. Consequently,
the compiler can make no assumptions about the value of the variable.
In particular, the optimizer must be careful to reload the variable
every time it is used instead of holding a copy in a register. Examples
of volatile variables are:
Hardware registers in peripherals (for example, status registers)
Non-automatic variables referenced within an interrupt service routine
Variables shared by multiple tasks in a multi-threaded application
Candidates
who don't know the answer to this question aren't hired. I consider
this the most fundamental question that distinguishes between a C
programmer and an embedded systems programmer. Embedded folks deal with
hardware, interrupts, RTOSes, and the like. All of these require
volatile variables. Failure to understand the concept of volatile will
lead to disaster.
On the (dubious) assumption that the
interviewee gets this question correct, I like to probe a little deeper
to see if they really understand the full significance of volatile . In
particular, I'll ask them the following additional questions:
Can a parameter be both const and volatile ? Explain.
Can a pointer be volatile ? Explain.
What's wrong with the following function?:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
The answers are as follows:
Yes.
An example is a read-only status register. It is volatile because it
can change unexpectedly. It is const because the program should not
attempt to modify it
Yes, although this is not very common. An example is when an interrupt service routine modifies a pointer to a buffer
This
one is wicked. The intent of the code is to return the square of the
value pointed to by *ptr . However, since *ptr points to a volatile
parameter, the compiler will generate code that looks something like
this:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
Because
it's possible for the value of *ptr to change unexpectedly, it is
possible for a and b to be different. Consequently, this code could
return a number that is not a square! The correct way to code this is:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
Bit manipulation
9.
Embedded systems always require the user to manipulate bits in
registers or variables. Given an integer variable a, write two code
fragments. The first should set bit 3 of a. The second should clear bit
3 of a. In both cases, the remaining bits should be unmodified.
These are the three basic responses to this question:
No idea. The interviewee cannot have done any embedded systems work
Use
bit fields. Bit fields are right up there with trigraphs as the most
brain-dead portion of C. Bit fields are inherently non-portable across
compilers, and as such guarantee that your code is not reusable. I
recently had the misfortune to look at a driver written by Infineon for
one of their more complex communications chips. It used bit fields and
was completely useless because my compiler implemented the bit fields
the other way around. The moral: never let a non-embedded person
anywhere near a real piece of hardware!
Use #defines and bit
masks. This is a highly portable method and is the one that should be
used. My optimal solution to this problem would be:
#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void) {
a |= BIT3;
}
void clear_bit3(void) {
a &= ~BIT3;
}
Some
people prefer to define a mask together with manifest constants for the
set and clear values. This is also acceptable. The element that I'm
looking for is the use of manifest constants, together with the |= and
&= ~ constructs
Accessing fixed memory locations
10.
Embedded systems are often characterized by requiring the programmer to
access a specific memory location. On a certain project it is required
to set an integer variable at the absolute address 0x67a9 to the value
0xaa55. The compiler is a pure ANSI compiler. Write code to accomplish
this task.
This problem tests whether you know that it is
legal to typecast an integer to a pointer in order to access an
absolute location. The exact syntax varies depending upon one's style.
However, I would typically be looking for something like this:
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55;
A more obscure approach is:
*(int * const)(0x67a9) = 0xaa55;
Even if your taste runs more to the second solution, I suggest the first solution when you are in an interview situation.
Interrupts
11.
Interrupts are an important part of embedded systems. Consequently,
many compiler vendors offer an extension to standard C to support
interrupts. Typically, this new keyword is __interrupt. The following
code uses __interrupt to define an interrupt service routine (ISR).
Comment on the code.
__interrupt double compute_area
(double
radius)
{
double area = PI * radius *
radius;
printf("\nArea = %f", area);
return area;
}
This function has so much wrong with it, it's hard to know where to start:
ISRs cannot return a value. If you don't understand this, you aren't hired
ISRs cannot be passed parameters. See the first item for your employment prospects if you missed this
On
many processors/compilers, floating-point operations are not
necessarily re-entrant. In some cases one needs to stack additional
registers. In other cases, one simply cannot do floating point in an
ISR. Furthermore, given that a general rule of thumb is that ISRs
should be short and sweet, one wonders about the wisdom of doing
floating-point math here
In a vein similar to the third point,
printf() often has problems with reentrancy and performance. If you
missed points three and four, I wouldn't be too hard on you. Needless
to say, if you got these last two points, your employment prospects are
looking better and better
Code examples
12. What does the following code output and why?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("> 6") :
puts("
<
= 6");
}
This
question tests whether you understand the integer promotion rules in
C-an area that I find is very poorly understood by many developers.
Anyway, the answer is that this outputs "> 6." The reason for this
is that expressions involving signed and unsigned types have all
operands promoted to unsigned types. Thus ?20 becomes a very large
positive integer and the expression evaluates to greater than 6. This
is a very important point in embedded systems where unsigned data types
should be used frequently (see Reference 2). If you get this one wrong,
you are perilously close to not getting the job.
13. Comment on the following code fragment.
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
/*1's complement of zero */
On machines where an int is not 16 bits, this will be incorrect. It should be coded:
unsigned int compzero = ~0;
This
question really gets to whether the candidate understands the
importance of word length on a computer. In my experience, good
embedded programmers are critically aware of the underlying hardware
and its limitations, whereas computer programmers tend to dismiss the
hardware as a necessary annoyance.
By this stage, candidates
are either completely demoralized-or they're on a roll and having a
good time. If it's obvious that the candidate isn't very good, then the
test is terminated at this point. However, if the candidate is doing
well, then I throw in these supplemental questions. These questions are
hard, and I expect that only the very best candidates will do well on
them. In posing these questions, I'm looking more at the way the
candidate tackles the problems, rather than the answers. Anyway, have
fun...
Dynamic memory allocation
14. Although not
as common as in non-embedded computers, embedded systems do still
dynamically allocate memory from the heap. What are the problems with
dynamic memory allocation in embedded systems?
Here, I expect
the user to mention memory fragmentation, problems with garbage
collection, variable execution time, and so on. This topic has been
covered extensively in ESP , mainly by P.J. Plauger. His explanations
are far more insightful than anything I could offer here, so go and
read those back issues! Having lulled the candidate into a sense of
false security, I then offer up this tidbit:
What does the following code fragment output and why?
char *ptr;
if ((ptr = (char *)malloc(0)) ==
NULL)
else
puts("Got a null pointer");
puts("Got a valid pointer");
This
is a fun question. I stumbled across this only recently when a
colleague of mine inadvertently passed a value of 0 to malloc and got
back a valid pointer! That is, the above code will output "Got a valid
pointer." I use this to start a discussion on whether the interviewee
thinks this is the correct thing for the library routine to do. Getting
the right answer here is not nearly as important as the way you
approach the problem and the rationale for your decision.
Typedef
15.
Typedef is frequently used in C to declare synonyms for pre-existing
data types. It is also possible to use the preprocessor to do something
similar. For instance, consider the following code fragment:
#define dPS struct s *
typedef struct s * tPS;
The intent in both cases is to define dPS and tPS to be pointers to structure s. Which method, if any, is preferred and why?
This
is a very subtle question, and anyone who gets it right (for the right
reason) is to be congratulated or condemned ("get a life" springs to
mind). The answer is the typedef is preferred. Consider the
declarations:
dPS p1,p2;
tPS p3,p4;
The first expands to:
struct s * p1, p2;
which
defines p1 to be a pointer to the structure and p2 to be an actual
structure, which is probably not what you wanted. The second example
correctly defines p3 and p4 to be pointers.
Obscure syntax
16. C allows some appalling constructs. Is this construct legal, and if so what does this code do?
int a = 5, b = 7, c;
c = a+++b;
This
question is intended to be a lighthearted end to the quiz, as, believe
it or not, this is perfectly legal syntax. The question is how does the
compiler treat it? Those poor compiler writers actually debated this
issue, and came up with the "maximum munch" rule, which stipulates that
the compiler should bite off as big (and legal) a chunk as it can.
Hence, this code is treated as:
c = a++ + b;
Thus, after this code is executed, a = 6, b = 7, and c = 12.
If
you knew the answer, or guessed correctly, well done. If you didn't
know the answer then I wouldn't consider this to be a problem. I find
the greatest benefit of this question is that it is good for
stimulating questions on coding styles, the value of code reviews, and
the benefits of using lint.
Well folks, there you have it.
That was my version of the C test. I hope you had as much fun taking it
as I had writing it. If you think the test is a good test, then by all
means use it in your recruitment. Who knows, I may get lucky in a year
or two and end up being on the receiving end of my own work.
Nigel
Jones is a consultant living in Maryland. When not underwater, he can
be found slaving away on a diverse range of embedded projects. He
enjoys hearing from readers and can be reached at
NAJones@compuserve.com .
References
Jones, Nigel, "In Praise of the #error directive," Embedded Systems Programming, September 1999, p. 114.
Jones, Nigel, " Efficient C Code for Eight-bit MCUs ," Embedded Systems Programming, November 1998, p. 66.
]]>
澶嶅埗浠ヤ笅浠g爜淇濆瓨鎴?reg鏂囦歡錛岀劧鍚庡鍏ユ敞鍐岃〃銆?/p>
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format]
[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Calls Window]
"FontFace"="Fixedsys"
"FontSize"=dword:0000000c
"Text"=hex:00,00,00,00,ff,ff,ff,00,13,01,b3,00
"Text Selection"=hex:ff,ff,ff,00,00,00,00,00,19,00,19,00
"Calls Highlight"=hex:00,00,00,00,00,ff,00,00,10,00,10,00
"Superceded code"=hex:80,80,80,00,ff,ff,ff,00,10,00,10,00
[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Disassembly Window]
"FontFace"="Fixedsys"
"FontSize"=dword:0000000c
"Text"=hex:00,00,00,00,ff,ff,ff,00,13,01,b3,00
"Text Selection"=hex:ff,ff,ff,00,00,00,00,00,19,00,19,00
"Assembly Code"=hex:80,80,80,00,ff,ff,ff,00,10,00,10,00
[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Memory Window]
"FontFace"="Fixedsys"
"FontSize"=dword:0000000c
"Text"=hex:00,00,00,00,ff,ff,ff,00,13,01,b3,00
"Text Selection"=hex:ff,ff,ff,00,00,00,00,00,19,00,19,00
"Memory Highlight"=hex:ff,00,00,00,ff,ff,ff,00,10,00,10,00
[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Output Window]
"FontFace"="FixedSys"
"FontSize"=dword:0000000c
"Text"=hex:c0,c0,c0,00,00,00,00,00,15,00,15,00
"Text Selection"=hex:00,00,00,00,c0,c0,c0,00,19,00,19,00
"Current Error/Tag"=hex:ff,ff,ff,00,00,00,80,00,55,00,55,00
"Bookmark"=hex:00,00,00,00,00,ff,ff,00,10,00,10,00
[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Registers Window]
"FontFace"="Fixedsys"
"FontSize"=dword:0000000c
"Text"=hex:00,00,00,00,ff,ff,ff,00,13,01,b3,00
"Text Selection"=hex:ff,ff,ff,00,00,00,00,00,19,00,19,00
"Value Highlight"=hex:ff,00,00,00,ff,ff,ff,00,10,00,10,00
[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Source Browser]
"FontFace"="DejaVu Sans"
"FontSize"=dword:0000000c
"Text"=hex:c0,c0,c0,00,00,00,00,00,15,00,15,00
"Text Selection"=hex:00,00,00,00,c0,c0,c0,00,19,00,19,00
[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Source Window]
"FontFace"="DejaVu Sans Mono"
"FontSize"=dword:0000000d
"Text"=hex:c0,c0,c0,00,00,00,00,00,12,01,b2,00
"Text Selection"=hex:00,00,00,00,c0,c0,c0,00,19,00,19,00
"Current Error/Tag"=hex:ff,ff,ff,00,00,00,80,00,d2,01,b2,01
"Bookmark"=hex:00,00,00,00,00,ff,ff,00,10,00,10,00
"Breakpoint"=hex:ff,ff,ff,00,80,00,00,00,10,00,10,00
"Current Statement"=hex:00,00,00,00,ff,ff,00,00,70,00,70,00
"Selection Margin"=hex:d4,d0,c8,00,d4,d0,c8,00,13,00,13,00
"Keyword"=hex:ff,00,ff,00,00,00,00,00,10,00,11,00
"Comment"=hex:00,e6,00,00,00,00,00,00,10,00,11,00
"Number"=hex:ff,ff,00,00,00,00,00,00,10,00,11,00
"String"=hex:ff,80,00,00,00,00,00,00,10,00,11,00
"Operator"=hex:c0,c0,c0,00,00,00,00,00,11,00,11,00
"Wizard IDL/ODL Code"=hex:80,80,80,00,00,00,00,00,14,00,15,00
"HTML Element Name"=hex:80,00,80,00,00,00,00,00,14,00,15,00
"HTML Attribute Name"=hex:ff,00,00,00,00,00,00,00,14,00,15,00
"HTML Attribute Value"=hex:00,00,ff,00,00,00,00,00,14,00,15,00
"HTML Comment"=hex:00,80,00,00,00,00,00,00,14,00,15,00
"HTML Entity"=hex:ff,00,00,00,00,00,00,00,14,00,15,00
"HTML Tag Delimiter"=hex:00,00,ff,00,00,00,00,00,14,00,15,00
"HTML String"=hex:00,00,ff,00,00,00,00,00,14,00,15,00
"HTML Tag Text"=hex:ff,00,ff,00,00,00,00,00,14,00,15,00
"HTML Operator"=hex:00,00,ff,00,00,00,00,00,14,00,15,00
"HTML Server-Side Script"=hex:00,00,00,00,ff,ff,00,00,14,00,14,00
"User Defined Keywords"=hex:00,00,ff,00,00,00,00,00,14,00,15,00
"Wizard Code"=hex:80,80,80,00,00,00,00,00,14,00,15,00
[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Variables Window]
"FontFace"="Fixedsys"
"FontSize"=dword:0000000c
"Text"=hex:00,00,00,00,ff,ff,ff,00,13,01,b3,00
"Text Selection"=hex:ff,ff,ff,00,00,00,00,00,19,00,19,00
"Variables Highlight"=hex:ff,00,00,00,ff,ff,ff,00,10,00,10,00
[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Watch Window]
"FontFace"="Fixedsys"
"FontSize"=dword:0000000c
"Text"=hex:00,00,00,00,ff,ff,ff,00,13,01,b3,00
"Text Selection"=hex:ff,ff,ff,00,00,00,00,00,19,00,19,00
"Watch Highlight"=hex:ff,00,00,00,ff,ff,ff,00,10,00,10,00
[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Workspace Window]
"FontFace"="Segoe UI"
"FontSize"=dword:0000000c
-----------------------------------------------------------------------------------------------------------------------
Visual Studio 2005
澶嶅埗浠ヤ笅浠g爜淇濆瓨鎴?reg鏂囦歡錛岀劧鍚庡鍏ユ敞鍐岃〃銆?br>------------------------------------------------------------------------------------------------------------------------
Windows Registry Editor Version 5.00
"Colorable item format version"=dword:00000008
"FontName"="Courier"
"FontPointSize"=dword:0000000a
"FontCharSet"=dword:00000000
"Plain Text Foreground"=dword:00e5e5e5
"Plain Text Background"=dword:00000000
"Plain Text FontFlags"=dword:00000000
"Selected Text Foreground"=dword:00000000
"Selected Text Background"=dword:00ebe8e7
"Selected Text FontFlags"=dword:80000000
"Line Numbers Foreground"=dword:00804000
"Line Numbers Background"=dword:02000000
"Line Numbers FontFlags"=dword:80000000
"Visible White Space Foreground"=dword:0080ffff
"Visible White Space Background"=dword:02000000
"Visible White Space FontFlags"=dword:80000000
"Collapsible Text Foreground"=dword:00c9c9c9
"Collapsible Text Background"=dword:00000000
"Collapsible Text FontFlags"=dword:00000000
"Comment Foreground"=dword:00c4c4c4
"Comment Background"=dword:001f1f1f
"Comment FontFlags"=dword:00000000
"CSS Property Name Foreground"=dword:0000ffff
"CSS Property Name Background"=dword:02000000
"CSS Property Name FontFlags"=dword:00000000
"CSS Property Value Foreground"=dword:0000ff00
"CSS Property Value Background"=dword:02000000
"CSS Property Value FontFlags"=dword:00000000
"CSS Selector Foreground"=dword:00ffff00
"CSS Selector Background"=dword:02000000
"CSS Selector FontFlags"=dword:00000000
"HTML Attribute Value Foreground"=dword:0000ff00
"HTML Attribute Value Background"=dword:02000000
"HTML Attribute Value FontFlags"=dword:00000000
"HTML Comment Foreground"=dword:0080ff80
"HTML Comment Background"=dword:02000000
"HTML Comment FontFlags"=dword:00000000
"HTML Element Name Foreground"=dword:0000ffff
"HTML Element Name Background"=dword:02000000
"HTML Element Name FontFlags"=dword:00000000
"HTML Entity Foreground"=dword:00ffb66c
"HTML Entity Background"=dword:02000000
"HTML Entity FontFlags"=dword:00000000
"HTML Operator Foreground"=dword:00ffffff
"HTML Operator Background"=dword:02000000
"HTML Operator FontFlags"=dword:00000000
"HTML Server-Side Script Foreground"=dword:00000000
"HTML Server-Side Script Background"=dword:00007777
"HTML Server-Side Script FontFlags"=dword:00000000
"HTML Tag Delimiter Foreground"=dword:00ffff00
"HTML Tag Delimiter Background"=dword:02000000
"HTML Tag Delimiter FontFlags"=dword:00000000
"Identifier Foreground"=dword:00eaeaea
"Identifier Background"=dword:02000000
"Identifier FontFlags"=dword:00000000
"Keyword Foreground"=dword:00ffff00
"Keyword Background"=dword:02000000
"Keyword FontFlags"=dword:00000000
"Number Foreground"=dword:0000a8a8
"Number Background"=dword:02000000
"Number FontFlags"=dword:00000000
"Operator Foreground"=dword:00bf80ff
"Operator Background"=dword:02000000
"Operator FontFlags"=dword:00000000
"Preprocessor Keyword Foreground"=dword:00ff6f6f
"Preprocessor Keyword Background"=dword:02000000
"Preprocessor Keyword FontFlags"=dword:00000000
"Read-Only Region Foreground"=dword:02000000
"Read-Only Region Background"=dword:00c0c0c0
"Read-Only Region FontFlags"=dword:00000000
"Register Data Foreground"=dword:02000000
"Register Data Background"=dword:02000000
"Register Data FontFlags"=dword:00000000
"Register NAT Foreground"=dword:00ffffff
"Register NAT Background"=dword:02000000
"Register NAT FontFlags"=dword:00000000
"String Foreground"=dword:0081c2fe
"String Background"=dword:02000000
"String FontFlags"=dword:00000000
"XML Doc Comment Foreground"=dword:00b7ffb7
"XML Doc Comment Background"=dword:001f1f1f
"XML Doc Comment FontFlags"=dword:00000000
------------------------------------------------------------------------------------------------------------------------
]]>
fun1(榪斿洖綾誨瀷(*fun2)(鍙傛暟))
{
...=(*fun2)(鍙傛暟);
fun2姝e父瀹氫箟
璋冪敤鐨勬椂鍊欍銆fun1(鍑芥暟鍚?;
int fun2(int n)
{
return n+1;
{
return (*f)(n);
int main(int argc, char* argv[])
{
int a(B),b;
b=fun1(a,fun2);
cout<<b;
return 0;
}
濡傛灉瀹氫箟浜嗘瀯閫犲嚱鏁板拰鏋愭瀯鍑芥暟,蹇呴』灝嗗畠浠緗負(fù)PUBLIC,鍚﹀垯鏃犳硶璁塊棶.
(浜嬪疄涓婁篃鍙互鏄痯rivate,浣嗗彧鑳借闂被鐨勯潤鎬佹垚鍛?榪欐椂涓嶈兘鐢熸垚瀵硅薄,濡傛灉瑕佺敓鎴愬璞?闇瑕佷竴瀹氱殑鎶宸?
{}
cout<<*p++<<*p++;
*p=3;
char *t;
t=p;
杈撳嚭緇撴灉涓?21,鍥犱負(fù)姹傚奸『搴忔槸浠庡彸鍒板乏,絎笁涓鍙ユ槸閿欑殑,*p鐨勫唴瀛樻槸涓嶅彲鍐欑殑,浼間箮p搴旇涓轟竴涓父閲忔寚閽?浣嗙‘瀹炲彲浠ュ皢p璧嬬粰涓涓潪甯告寚閽?璇彞5涓嶆姤閿?
涓婇潰鏄竴涓父閲忓紩鐢?浣跨敤甯擱噺寮曠敤鏄負(fù)浜嗕繚璇佸閮ㄥ彉閲忎笉琚慨鏀?鍙﹀,濡傛灉浼犲叆鐨勬槸甯擱噺鎴栬呬復(fù)鏃跺璞?涓嶄嬌鐢ㄥ父閲忓紩鐢ㄧ殑鍙傛暟灝嗗嚭閿?鍥犱負(fù)浜岃呴兘鏄父閲?
涓婇潰鐨勫嚱鏁版槸浠ユ寚閽堝紩鐢ㄥ仛鍙傛暟,鏀瑰彉鎸囬拡鐨勫?榪樺彲浠ヤ嬌鐢ㄦ寚鍚戞寚閽堢殑鎸囬拡,瑕侀夯鐑︿竴浜?涓嶈繃琛ㄨ揪鏇存槑紜?void inf(int **i){(*i)++}; 璋冪敤鏃?int *i=0; inf(&i);
void inf(int *&i){i++;}
int main(int argc, char* argv[])
{
int *i=0;
cout<<i<<endl;
void (*pf)(int *&);
pf=&inf;
(*pf)(i);
cout<<i<<endl;
}
榪愮畻絎﹂噸杞?br>閲嶈澆浠呮槸瀵圭敤鎴風(fēng)被鍨嬬殑鏁版嵁鏉ヨ鐨勶紝瀵瑰唴緗殑鏁版嵁綾誨瀷鏄笉鍙互閲嶈澆榪愮畻絎︾殑銆?br>.鍜?*閮戒笉鑳介噸杞?鍙互灝嗚繍綆楃閲嶈澆鐪嬩綔鍙﹀涓縐嶅艦寮忕殑鍑芥暟璋冪敤錛屽嚱鏁扮殑鍚嶅瓧鏄痮perator@,@浠h〃榪愮畻絎︼紝鍙傛暟鐨勪釜鏁板彇鍐充簬涓や釜鍥犵礌錛?br>1 榪愮畻絎︽槸涓鍏冭繕鏄簩鍏?br>2 榪愮畻絎︽槸鍏ㄥ眬鍑芥暟(涓鍏冩槸涓涓弬鏁?浜屽厓鏄袱涓弬鏁?,榪樻槸鎴愬憳鍑芥暟(涓鍏冩病鏈夊弬鏁?浜屽厓涓涓弬鏁?---瀵硅薄鍙樹負(fù)宸︿晶鍙傛暟)
operator one() const{ return one(x);}
涓嶈繃騫朵笉鎻愬¢殣寮忕被鍨嬭漿鎹?榪欐牱瀹規(guī)槗闅愯棌閿欒,涔熶細(xì)闄嶄綆璋冪敤鏃剁殑鏁堢巼.
浣跨敤鍏ㄥ眬閲嶈澆榪愮畻絎﹁屼笉鏄垚鍛樿繍綆楃鐨勫ソ澶勬槸鍙互瀵瑰乏鍙蟲搷浣滀功閮借嚜鍔ㄤ綔綾誨瀷杞崲,鑰屾垚鍛樿繍綆楃鐨勬搷浣滄暟宸︿晶鐨勫繀欏繪槸姝g‘鐨勫璞?/p>
1 鍒嗛厤鍚庤媯(gè)鏌ユ槸鍚﹀垎閰嶆垚鍔?鍗砳f(p==NULL)
2 閲婃斁鍐呭瓨鍚庤璁板緱浠=NULL,闃叉浜х敓閲庢寚閽?閲庢寚閽堜細(xì)璁╂垜浠湪浣跨敤鎸囬拡鍓嶇殑if(p==NULL)媯(gè)鏌ュ艦鍚岃櫄璁?
main()
{
char a[100];
cout<<sizeof(a);
fun(a);
}
void fun(char a[100])
{
cout<<sizeof(a);
}
杈撳嚭100 4.
1 if(p==NULL) 閫傜敤浜庡唴瀛樺垎閰嶈鍙ヨ緝?yōu)畱鐨勬儏鍐?br>2 _set_new_handler _set_new_mode 閫傜敤浜庡唴瀛樺垎閰嶈鍙ヨ緝澶氱殑鎯呭喌
String b("world");
String c(a); //璋冪敤鎷瘋礉鏋勯犲嚱鏁幫紝榪樺彲浠ュ啓鎴愶細(xì)String c=a;浣嗛鏍艱緝宸?br>c=a; //璋冪敤璧嬪煎嚱鏁?operator =) 璧嬪煎嚱鏁頒腑娉ㄦ剰鍏堟鏌ヨ嚜璧嬪箋?/p>
瀵瑰嚱鏁板弬鏁板拰榪斿洖鍊艱繘琛宑onst闄愬畾浠呭鎸囬拡鍜屽紩鐢ㄦ湁鎰忎箟錛屽鍊間紶閫掓病鏈夋剰涔夛紝瀵硅緭鍑哄弬鏁頒竴瀹氫笉瑕佺敤const,涓嶇劧鏃犳硶杈撳嚭鍙傛暟銆?/p>
char dest[sz];
memset(dest,0,sz);
strncpy(dest,source,sz-1);
榪欐牱淇濊瘉浜嗕笉浼?xì)瓒厴q囩紦鍐插尯涓旂粨灝句負(fù)'\0'.
{
throw(except("got it"));
}
catch(except &t)
{
t.what();
}
榪愯鏃剁被褰㈣瘑鍒void鎸囬拡鏃犳晥銆?/p>
derived* d=dynamic_cast<derived*>b; 濡傛灉dynamic_cast澶辮觸鐨勮瘽錛屽皢榪斿洖NULL,鍙互浠ユ鏉ヨ瘯鎺㈢潃鍒ゆ柇鎸囬拡b鐨勭被鍨嬨?/p>
class D:public B
B& r=*p;
typeid(r)!==typeid(D)
typeid(*p)==typeid(D)
typeid(&r)==typeid(B*)
鍐呮牳瀵硅薄錛氭瘡涓唴鏍稿璞¢兘鏄竴涓唴瀛樺潡錛岀敱鍐呮牳緇存姢錛岃繘紼嬪湪鍒涘緩浜嗕竴涓唴鏍稿璞″悗鑾峰緱涓涓彞鏌勶紝閫氬父涓涓繘紼嬬殑鍙ユ焺瀵瑰彟澶栦竴涓繘紼嬫槸娌℃湁鎰忎箟鐨勶紝浣嗗彲浠ラ氳繃涓瀹氭帾鏂藉湪榪涚▼闂村叡浜唴鏍稿璞°傚綋榪涚▼緇堟鍚庯紝瀹冨垱寤虹殑鍐呮牳瀵硅薄涓嶄竴瀹氭秷澶憋紝鍐呮牳緇存姢姣忎釜鍐呮牳瀵硅薄鐨勫紩鐢ㄨ鏁般?/p>
GDI瀵硅薄涓嶆槸鍐呮牳瀵硅薄錛屽尯鍒嗗唴鏍稿璞″拰GDI瀵硅薄鐨勬柟娉曟槸鍐呮牳瀵硅薄鐨勫垱寤哄嚱鏁扮殑鍙傛暟涓湁瀹夊叏灞炴э紝鑰孏DI瀵硅薄娌℃湁銆?/p>
VarName2=VarValue2\0
...............
\0
GetCurrentDirectory()
SetCurrentDirectory()
GetVersionEx()
VeryfyVersionInfo()
GetExitCodeProcess(),瀵逛簬榪樺湪榪愯鐨勮繘紼嬶紝鍙互寰楀埌0x103錛圫TILL_ACTIVE),瀵逛簬緇堟鐨勮繘紼嬶紝濡傛灉榪樻病鏈塁loseHandle(pi.hProcess),鍙互寰楀埌瀹冪殑閫鍑虹爜,鍚﹀垯寰楀埌鐨勬槸涔辯爜銆?/p>
HANDLE hjob=CreateJobObject(NULL,NULL);//鍒涘緩涓涓綔涓氬璞°?br>SetInformationJobObject();//璁懼畾浣滀笟瀵硅薄鐨勫弬鏁幫紝鍖呮嫭瀵硅繘紼嬬殑鍚勭闄愬埗銆?br>CreateProcess(NULL,"CMD",NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi);//鍒涘緩鏂拌繘紼嬨?br>AssignProcessToJobObject(hjob,pi.hProcess); //灝嗚繘紼嬪姞鍏ヤ綔涓氥傚彲鍔犲叆澶氫釜銆?br>ResumeThread(pi.hThread);
CloseHandle(pi.hThread);
HANDLE h[2];
h[0]=pi.hProcess;
h[1]=hjob;
DWORD dw=WaitForMultipleObject(2,h,false,INFINITE);
switch(dw-WAIT_OBJECT_0錛?br> case 0://the process has terminated..
case 1://all of the job's allotted cpu time was used.
}
CloseHandle(pi.hProcess);
CloseHandle(hjob);
TerminateJobObject(hjob,UINT uExitCode)
QueryInformationJobObject();
JOBOBJECT_ASSOCIATE_COMPLETION_PORT joacp;//鍒涘緩涓涓狪/O瀹屾垚绔彛瀵硅薄
SetInformationJobObject(hjob.JobObjectAssociateCompletionPortInformation,&joacp,sizeof(joacp)
//灝嗕綔涓氬悓瀹屾垚绔彛瀵圭浉鍏寵仈銆?br>GetQueuedCompletionStatus() //鐩戞帶I/O绔彛銆?/p>
鍒涘緩鏂扮嚎紼嬶細(xì)
DWORD銆WINAPI FUNC(PVOID pvParam)
int Param;
DWORD dwThreadID;
CreateThread(NULL,0,FUNC,(PVOID)&Param,0,&dwThreadID);
BOOL GetExitCodeThread(HANDLE hThread,PDWORD pdwExitCode);//濡傛灉榪樻湭緇堟錛屽緱鍒?x103.
鑾峰緱浼彞鏌勶細(xì)
GetCurrentProcess()
GetCurrentThread()
GetThreadTimes()
DuplicatgeHandle();//姝ゅ嚱鏁頒細(xì)澧炲姞鍐呮牳瀵硅薄鐨勫紩鐢ㄨ鏁般?/p>
SuspendThread(HANDLE) //浣跨敤姝ゅ嚱鏁拌灝忓績姝婚攣銆?/p>
鑷姩閫鍑哄綋鍓嶆椂闂寸墖錛?br>SwitchtoThread();
GetThreadContext()
SetThreadContext()
DWORD GetPriorityClass();
BOOL SetThreadPriority(Handle hThread,int nPriority);
涔熷氨鏄錛岀郴緇熶細(xì)鎻愰珮綰跨▼鐨勪紭鍏堢駭錛屽茍闅忕潃鎵ц鏃墮棿鐗囩殑嫻侀濋檷浣庝紭鍏堢駭錛屼絾闄嶅埌鍩烘湰浼樺厛綰у悗灝變笉鍐嶉檷浜嗐?br>浼樺厛綰?-15鎴愪負(fù)鍔ㄦ佷紭鍏堢駭鑼冨洿錛岄珮浜?5鏄疄鏃惰寖鍥達(dá)紝緋葷粺涓嶄細(xì)璋冨害瀹炴椂鑼冨洿綰跨▼鐨勪紭鍏堢駭錛屼篃涓嶄細(xì)鎶婂姩鎬佷紭鍏堢駭鑼冨洿鐨?br>綰跨▼鎻愰珮鍒?5浠ヤ笂銆?/p>
鐩稿叧鐨勫嚱鏁版湁錛?br>BOOL SetProcessAffinityMask(HANDLE hProcess,DWORD_PTR dwProcessAffinityMask);
BOOL GetProcessAffinityMask(Handle hProcess,PDWORD_PTR pdwProcessAffinityMask,PDWORD_PTR pdwSystemAffinityMask);
DWORD_PTR SetThreadAffinityMask(HANDLE hThread,DWORD_PTR dwThreadAffinityMask);
DWORD_PTR SetThreadIdealProcessor(HANDLE hThread,DWORD dwIdealProcessor);
DWORD WaitForMultipleObject(DWORD dwCount,CONST HANDLE* phObjects,BOOL fWaitALL,DWORD dwMilliseconds);鍏朵腑錛?br>0<dwCount<WAIT_OBJECTS(windows澶存枃浠朵腑瀹氫箟涓?4錛夛紝濡傛灉璁懼畾fWaitALl涓篢RUE,閭d箞鍑芥暟浼?xì)鐭ラ亾宸﹀彌_璞″彉涓哄凡閫氱煡鐘舵佹墠浼?xì)杩斿洖锛屽鏋滀紶閫扚ALSE錛岄偅涔堝彧瑕佹湁涓涓璞″彉涓哄凡閫氱煡鐘舵侊紝鍑芥暟灝變細(xì)榪斿洖銆?br>榪斿洖鍊肩殑鍚箟錛?br>HANDLE h[3];
h[0]=hProcess1;
h[1]=hProcess2;
h[2]=hProcess3;
DWORD dw=WaitForMultipleObject(3,h,FALSE,5000);
switch(dw)
{
case WAIT_FAILED://Bad call to function(invalid handle?)
break;
case WAIT_TIMEOUT錛?/None of the object became signaled within 5000 milliseconds.
break;
case WAIT_OBJECT_0+0:The process identified by h[0] terminated.
break;
case WAIT_OBJECT_0+1:
break;
case WAIT_OBJECT_0+2:
break;
}
//WaitForSingleObject()鐨勮繑鍥炲煎彧鏈夊墠涓夌鎯呭喌銆傚鏋滅粰WaitForMutipleObject()鐨刦WaitAll鍙傛暟浼犻扵RUE,閭d箞鍏惰繑鍥炲間篃鍙湁鍓嶄笁縐嶃?/p>
HANDLE CreateEvent(PSECURITY_ATTRIBUTES psa,BOOL fManualReset,BOOL fInitialState,PCTSTR pszName);
灝嗕簨浠舵敼涓洪氱煡鐘舵侊細(xì)
BOOL SetEvent(HANDLE hEvent);
灝嗕簨浠舵敼涓烘湭閫氱煡鐘舵侊細(xì)
BOOL ResetEvent(HANDLE hEvent);
濡傛灉浜嬩歡鏄嚜鍔ㄩ噸緗簨浠訛紝閭d箞鎴愬姛絳夊緟浼?xì)漶旂敓鍓綔鐢ㄥQ屽嵆灝嗕簨浠惰嚜鍔ㄧ疆涓烘湭閫氱煡鐘舵併傚鏋滄槸浜哄伐浜嬩歡瀵硅薄錛屽垯娌℃湁鍓綔鐢ㄣ?/p>
鍒濆鎬繪槸鏈氱煡鐘舵併?br>BOOL SetWaitableTimer(
HANDLE hTimer,
const LARGE_INTEGER *pDueTime,
LONG lPeriod,
PTIMERAPCROUTINE pfnCompletionRoutine,
PVOID pvArgToCompletionRoutine,
BOOL fResume);
鍙栨秷瀹氭椂鍣細(xì)
BOOL CancelWaitableTimer(HANDLE hTimer);
濡傛灉浠呮兂鏀瑰彉鎶ユ椂鏉′歡錛屼笉鐢ㄨ皟鐢ㄨ繖涓嚱鏁版殏鍋滄姤鏃跺櫒錛岀洿鎺ヨ皟鐢⊿etWaitableTimer()灝卞彲浠ヤ簡銆?/p>
鍐充笉鍏佽璧勬簮鏁伴噺涓鴻礋鍊箋?br>鍒涘緩淇″彿閲忥細(xì)
HANDLE CreateSemaphore(PSECURITY_ATTRIBUTE psa,
LONG lInitialCount,
LONG lMaximumCount,
PCSTR pszName);
閫掑璧勬簮錛?br>BOOL ReleaseSemaphore(HANDLE hsem,
LONG lReleaseCount,
PLONG plPreviousCount);
BOOL fInitialOwner,
PCTSTR銆pszName);
DWORD SingalObjectAndWait(
HANDLE hObjectToSignal,
HANDLE hObjectToWaitOn,
DWORD dwMilliseconds,
BOOL fAlertable);
鍙戝嚭涓涓氱煡淇″彿騫剁瓑寰呭彟涓涓氱煡錛屾晥鐜囨瘮鍒嗗埆鎿嶄綔鎻愰珮寰堝銆?/p>
BOOL QueueUserWorkItem(
PTHREAD_START_ROUTINE pfnCallback,
PVOID pvContext錛?br>ULONG dwFlags);
璇ュ嚱鏁板皢“宸ヤ綔欏圭洰”鏀懼叆綰跨▼姹犲茍涓旂珛鍗寵繑鍥炪傚伐浣滈」鐩槸鎸囦竴涓敤pfnCallback鍙傛暟鏍囪瘑鐨勫嚱鏁般傚畠琚皟鐢ㄥ茍涓斾紶閫掑崟涓弬鏁皃vContext.宸ヤ綔欏圭洰鍑芥暟鍘熷瀷濡備笅錛?br>DWORD WINAPI WorkItemFunc(PVOID pvContext);
dwFlags鍙傛暟錛歐T_EXECUTEDEFAULT 宸ヤ綔欏圭洰鏀懼叆闈濱/O緇勪歡寰楃嚎紼嬩腑
WT_EXECUTEINIOTHREAD 宸ヤ綔欏圭洰鏀懼叆I/O緇勪歡鐨勭嚎紼嬩腑錛岃繖鏍風(fēng)殑綰跨▼鍦↖/O璇鋒眰娌℃湁瀹屾垚涔嬪墠涓嶄細(xì)琚粓姝㈣繍琛?nbsp; 錛岄槻姝㈠洜涓虹嚎紼嬭緇堟瀵艱嚧I/O璇鋒眰涓㈠け銆?br> WT_EXECUTEINPERSISTENTTHREAD 鏀懼叆姘鎬箙綰跨▼姹狅紝
WT_EXECUTELONGFUNCTION 宸ヤ綔欏圭洰闇瑕侀暱鏃墮棿鐨勫伐浣滐紝緋葷粺浼?xì)鎹瀹夋帓鏇村鐨劸U跨▼銆?/p>
浜屻佹寜瑙勫畾鐨勬椂闂撮棿闅旇皟鐢ㄥ嚱鏁?br>鍒涘緩瀹氭椂鍣ㄩ槦鍒楋細(xì)
HANDLE CreateTimerQueue();
鍦ㄩ槦鍒椾腑鍒涘緩瀹氭椂鍣細(xì)
BOOL CreateTimerQueueTimer(
PHANDLE phNewTimer,
HANDLE hTimerQueue,
WAITORTIMERCALLBACK pfnCallback,
PVOID pvContext,
DWORD dwDueTime,
DWORD dwPeriod,
ULONG dwFlags);
宸ヤ綔鍥炶皟鍑芥暟鍘熷瀷濡備笅錛?br>VOID WINAPI WaitOrTimerCallback(
PVOID pvContext,
BOOL fTimerOrWaitFired);
dwFlags姣斿墠闈㈢殑澶氫簡涓涓爣蹇楋細(xì)WT_EXECUTEINTIMERTHREAD,琛ㄧず鐢辯粍浠剁殑瀹氭椂鍣ㄧ嚎紼嬶紙瀹氭椂鍣ㄧ粍浠跺彧鏈変竴涓嚎紼嬶級榪愯榪欎釜
宸ヤ綔鍑芥暟錛屾鏃剁殑宸ヤ綔鍑芥暟蹇呴』鏄緢蹇繑鍥炵殑錛屽惁鍒欏畾鏃跺櫒緇勪歡灝嗘棤娉曞鐞嗗叾浠栫殑璇鋒眰銆?/p>
BOOL DeleteTimerQueueTimer(
HANDLE hTimerQueue,
HANDLE hTimer,
HANDLE hCompletionEvent);
鍦ㄥ畾鏃跺櫒綰跨▼涓垹闄ゅ畾鏃跺櫒浼?xì)閫犳垚姝婚攣銆傝瀹歨CompletionEvent涓篒NVALID_HANDLE_VALUE錛岄偅涔堝湪瀹氭椂鍣ㄧ殑鎵鏈夋帓闃熷伐浣滈」鐩病鏈夊畬鎴愪箣鍓嶏紝DeleteTimerQueueTimer涓嶄細(xì)榪斿洖錛屼篃灝辨槸璇村湪宸ヤ綔欏圭洰涓瀹氭椂鍣ㄨ繘琛屼腑鏂垹闄や細(xì)姝婚攣銆傚彲浠ョ粰hCompletionEvent浼犻掍簨浠跺彞鏌勶紝鍑芥暟浼?xì)绔嬪崒櫩斿洖锛屽湪鎺掗槦宸ヤ綔瀹屾垚涔嬪悗锛屼細(xì)璁揪|浜嬩歡銆?/p>
HANDLE hTimerQueue,
HANDLE hTimer,
ULONG dwDueTime,
ULONG dwPeriod;
BOOL DeleteTimerQueueEx(
HANDLE hTimerQueue,
HANDLE hCompletionEvent);
BOOL RegisterWaitForSIngleObject(
PHANDLE phNewWaitObject,
HANDLE hObject,
WAITORTIMERCALLBACK pfnCallback,
PVOID pvContext,
ULONG dwMilliseconds,
ULONG dwFlags);
pfnCallBack鍘熷瀷錛?br>VOID WINAPI WaitOrTimerCallbadkFunc(
PVOID pvContext,
BOOLEAN fTimerorWaitFired);
濡傛灉絳夊緟瓚呮椂錛宖TimerorWaitFired==TRUE,濡傛灉鏄凡閫氱煡鐘舵侊紝鍒欎負(fù)FALSE.
BOOL UnregisterWaitEx(
HANDLE hWaitHandle,
HANDLE hCompletionEvent);
BOOL BindIoCompletionCallback(
HANDLE hDevice,
POVERLAPPED_COMPLETION_ROUTINE pfnCallback,
ULONG dwFlags//濮嬬粓涓?);
DWORD dwErrorCode,
DWORD dwNumberOfBytesTransferred,
,
POVERLAPPED pOverlapped);
鐗╃悊瀛樺偍鍣ㄧ殑欏甸潰鍏鋒湁涓嶅悓鐨勪繚鎶ゅ睘鎬э細(xì)
PAGE_NOACESS
PAGE_READONLY
PAGE_READWRITE
PAGE_EXECUTE
PAGE_EXECUTE_READ
PAGE_EXECUTE_READWRITE
PAGE_WRITECOPY
PAGE_EXECUTE_WRITECOPY
鍚庝袱涓睘鎬ф槸閰嶅悎鍏變韓欏甸潰鏈哄埗浣跨敤鐨勩俉INDOWS鏀寔澶氫釜榪涚▼鍏變韓鍗曚釜鍐呭瓨鍧楋紝姣斿榪愯notepad鐨?0涓疄渚嬶紝鍙互璁╀粬浠叡浜簲鐢ㄧ▼搴忕殑浠g爜鍜屾暟鎹紝榪欐牱鍙互澶уぇ鎻愰珮鎬ц兘錛屼絾瑕佹眰璇ュ唴瀛樺潡鏄笉鍙啓鐨勩備簬鏄郴緇熷湪璋冨叆.exe鎴栬卍ll鐨勬椂鍊欙紝浼?xì)璁〗帡閭d簺椤甸潰鏄彲浠ュ啓鍏ョ殑锛屼给櫩欎簺椤甸潰鍒嗛厤铏氭嫙鍐呭瓨銆傜劧鍚庡悓鍏朵粬鐨勯〉闈竴璧鋒槧灝勫埌涓鍧楄櫄鎷熷唴瀛橈紝浣嗚祴PAGE_WRITECOPY鎴栬匬AGE_EXECUTE_WRITECOPY灞炴?閫氬父鍖呭惈浠g爜鐨勫潡鏄疨AGE_EXECUTE_READ錛屽寘鍚暟鎹殑鍧楁槸PAGE_READWRITE)銆傚綋涓涓繘紼嬭瘯鍥懼皢鏁版嵁鍐欏叆鍏變韓鍐呭瓨鍧楁椂錛岀郴緇熶細(xì)榪涜濡備笅鎿嶄綔錛氬鎵鵑鍏堝垎閰嶇殑涓涓┖闂查〉闈紝灝嗚瘯鍥句慨鏀圭殑欏甸潰鎷瘋礉鍒拌繖涓┖闂查〉闈紝璧嬩簣PAGE_READWRITE鎴栬匬AGE_EXECUTE_READWRITE灞炴э紝鐒跺悗鏇存柊榪涚▼鐨勯〉闈㈣〃錛屼嬌寰楃敤鎴峰彲浠ュ鏂扮殑欏甸潰榪涜鍐欏叆銆?/p>
VOID GlobalMemoryStatus(LPMEMORYSTATUS pmst);
DWORD VirtualQuery(
LPVOID pvAddress,
PMEMORY_BASIC_INFORMATION pmbi,
DWORD dwLength);
HANDLE hProcess,
LPVOID pvAddress,
PMEMORY_BASIC_INFORMATION pmbi,
DWORD dwLength);
1 鑺傜渷欏甸潰鏂囦歡;
2 鍔犲揩紼嬪簭鍚姩錛?br>3 鍦ㄥ涓繘紼嬮棿鍏變韓鏁版嵁銆?/p>
緋葷粺棣栧厛灝?exe鏂囦歡鏄犲皠鍒板湴鍧絀洪棿錛岀己鐪佸熀鍦板潃鏄?x400000,鐒跺悗鏌ヨ.exe鐨勮緭鍏ヨ〃錛屽皢鍏朵嬌鐢ㄧ殑鎵鏈?dll涔熸槧灝勫埌鍦板潃絀洪棿錛堝熀鍦板潃鍦ㄦ瘡涓?dll鏂囦歡涓紝濡傛灉涓嶈兘婊¤凍錛岄渶瑕侀噸瀹氫綅錛夛紝鐒跺悗灝嗘墽琛?exe鐨勫惎鍔ㄤ唬鐮併傛鏃?exe鏂囦歡榪樺湪紜洏涓娿傛瘡嬈′唬鐮佽煩鍒頒竴涓皻鏈姞杞藉埌鍐呭瓨鐨勬寚浠ゅ湴鍧錛屽氨浼?xì)鍑虹庮C竴涓敊璇紝緋葷粺浼?xì)鍙戠幇杩欎釜閿欒锛岒q跺皢浠g爜鍔犲啀鍒板唴瀛樹腑銆?br>濡傛灉鍐嶅垱寤鴻繖涓?exe鏂囦歡鐨勪竴涓疄渚嬨傞偅涔堢洿鎺ュ皢鍘熸潵鐨勫湴鍧絀洪棿涓殑鍐呭鏄犲皠鍒版柊鐨勫湴鍧絀洪棿灝卞彲浠ヤ簡銆傝繖鏍峰涓疄渚嬪氨鍙互鍏變韓鐩稿悓鐨勪唬鐮佸拰鏁版嵁銆傚鏋滄煇涓疄渚嬭鏀瑰彉鍏變韓鍐呭錛岀郴緇熷氨涓鴻鏇存敼鐨勯〉闈㈢敵璇蜂竴涓柊鐨勯〉闈紝灝嗗唴瀹規(guī)嫹璐濅竴浠斤紝鐒跺悗鐢ㄦ柊鐨勯〉闈唬鏇垮湴鍧絀洪棿涓師鏉ラ〉闈㈢殑鏄犲皠灝卞彲浠ヤ簡銆?8鍚?000涓嶅悓錛屽畠涓嶅緟淇敼渚跨珛鍗充負(fù)鎵鏈夌殑瀹炰緥鍒嗛厤鏂扮殑欏甸潰銆?/p>
HANDLE CreateFile(
PCSTR pszFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
PSECURITY_ATTRIBUTES psa,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
澶辮觸鐨勮繑鍥炲兼槸INVALID_HANDLE_VALUE
2 鍒涘緩涓涓枃浠舵槧灝勫唴鏍稿璞★細(xì)
HANDLE CreateFileMapping(
HANDLE hFile,
PSECURITY_ATTRIBUTES psa,
DWORD fdwProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
PCTSTR pszName);
濡傛灉緇欏嚱鏁扮殑fdwProtect浼犻扨AGE_READWRITE鏍囧織錛岄偅涔堢鐩樹笂鏂囦歡鐨勫ぇ灝忎細(xì)鍙樹負(fù)鍚屾槧鍍忔枃浠剁浉鍚屽ぇ灝忋?br>澶辮觸鐨勮繑鍥炲兼槸NULL銆?/p>
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
SIZE_T dwNumberOfBytesToMap);
windows2000浼?xì)鏍规嵁瑕佹眰灏嗛儴鍒嗘枃錃g鏄犲皠鍒板湴鍧絀洪棿錛岃寃in98鎬繪槸鎶婂叏閮ㄥ唴瀹規(guī)槧灝勫埌鍦板潃絀洪棿錛屽茍涓斾粎鑳芥槧灝勫埌2G-3G絀洪棿錛屾絀洪棿涓哄叡浜┖闂達(dá)紝鎵鏈夌殑榪涚▼濡傛灉鏄犲皠鐩稿悓鐨勬枃浠訛紝閭d箞閮戒細(xì)鏄犲皠鍒扮浉鍚岀殑鍦板潃錛屼竴涓繘紼嬬敋鑷充笉蹇呮槧灝勫氨鍙互璁塊棶榪欎釜絀洪棿閲屽叾浠栬繘紼嬬殑鏄犲皠鏂囦歡錛寃in2000澶氫釜榪涚▼鏄犲皠鍚屼竴涓枃浠惰繑鍥炵殑鍦板潃閫氬父鏄笉鍚岀殑銆?br>4 浠庤繘紼嬬殑鍦板潃絀洪棿涓挙閿鏂囦歡鏁板彞鐨勬槧鍍?br>BOOL UnmapViewOfFile(PVOID pvBaseAddress);
BOOL FlushViewOfFile(
PVOID pvAddress,
SIZE_T dwNumberOfBytesToFlush);
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
SIZE_T dwNumberOfBytesToMap,
PVOID pvBaseAddress);
鍏變韓鏈哄埗錛歊PC ,COM,OLE,DDE,紿楀彛娑堟伅錛圵M_COPYDATA),鍓創(chuàng)鏉匡紝閭錛岀閬擄紝濂楁帴瀛椼?br>鍦ㄥ崟鏈轟笂錛屽畠浠殑搴曞眰瀹炵幇鏂規(guī)硶閮芥槸鍐呭瓨鏄犲皠鏂囦歡銆?/p>
閫氳繃鍦ㄥ爢鏍堜腑鍒嗛厤鍚屾牱澶у皬鐨勫璞★紝鍙互鏇村姞鏈夋晥鐨勭鐞嗗唴瀛橈紝鍑忓皯鍐呭瓨紕庣墖銆?br>3 榪涜鏈湴璁塊棶錛?br>灝嗗悓縐嶆暟鎹泦涓埌涓瀹氱殑鍐呭瓨鍧楋紝鍙互鍦ㄦ搷浣滅殑鏃跺欒闂緝?yōu)畱鐨剻宓闈㈠Q岃繖灝卞噺灝戜簡RAM鍜岀‖鐩樺鎹㈢殑鍙兘.
4 鍑忓皯綰跨▼鍚屾鐨勫紑閿錛?br>閫氳繃鍛婅瘔緋葷粺鍙湁涓涓嚎紼嬩嬌鐢ㄥ爢鏍?鍒涘緩鍫嗘爤鏃朵嬌鐢℉EAP_NO_SERIALIZE鏍囧織緇檉dwOptions)錛屽彲浠ラ伩鍏嶅爢鏍堝嚱鏁版墽琛岄澶栫殑鐢ㄤ簬淇濊瘉鍫嗘爤瀹夊叏鎬х殑浠g爜錛屾彁楂樻晥鐜囷紝浣嗘鏃剁敤鎴峰繀欏昏嚜宸辯淮鎶ょ嚎紼嬬殑瀹夊叏鎬э紝緋葷粺涓嶅啀瀵規(guī)璐熻矗銆?br>5 榪呴熼噴鏀懼爢鏍堛?br>鍥犱負(fù)鏁版嵁鍗曚竴錛屽洜姝ら噴鏀劇殑鏃跺欏彧瑕侀噴鏀懼爢鏍堝嵆鍙紝涓嶅繀鏄劇ず鐨勯噴鏀炬瘡涓唴瀛樺潡銆?/p>
DWORD fdwOptions,
SIZE_T dwInitialSize,
SIZE_T dwMaximumSize);
HANDLE hHeap,
DWORD fdwFlags,
SIZE_T dwBytes);娉ㄦ剰錛氬綋鍒嗛厤瓚呰繃錛?MB)鍐呭瓨鍧楃殑鏃跺欙紝鏈濂戒嬌鐢╒irtualAlloc錛堬級錛?/p>
HANDLE hHeap,
DWORD fdwFlags,
PVOID pvMem,
SIZE_T銆dwBytes);
SIZE_T HeapSize(
HANDLE hHeap,
DWORD fdwFlags,
LPVOID pvMem);
BOOL HeapFree(
HANDLE hHeap,
DWORD fdwFlags,
PVOID pvMem);
楠岃瘉鍫嗘爤瀹屾暣鎬э細(xì)
BOOL HeapValidate(
HANDLE hHeap,
DWORD fdwFlags,
LPCVOID pvMem);
鍚堝茍鍦板潃涓殑絀洪棽鍧?br>UINT HeapCompact(
HANDLE hHeap錛?br>DWORD fdwFlags);
BOOL HeapUnlock(HANDLE
HANDLE hHeap,
PProcess_HEAP_ENTRY pHeapEntry);
鍦―LL鐨勫ご鏂囦歡涓紝鏈夊涓嬩唬鐮侊細(xì)
#ifdef MYLIB
#else
#define MYLIB extern "C" __declspec(dllimport)
#endif
鍦ㄦ瘡涓緭鍑哄彉閲忓拰杈撳嚭鍑芥暟鐨勫0鏄庡墠錛岀敤MYLIB淇グ銆?br>鍦―LL鐨勫疄鐜版枃浠朵腑錛屾湁濡備笅浠g爜錛?br>錛僫 nclude "windows.h"
#define MYLIB extern "C" __declspec(dllexport)
錛僫 nclude "Mylib.h"
緙栬瘧紼嬪簭宸茬粡鎶婂嚱鏁板悕瀛楁敼鍙樹簡錛屾棤娉曠敤鍘熸潵鐨勫悕瀛楀緱鍒板嚱鏁板湴鍧銆傦紙鏍稿績緙栫▼璇寸殑涓嶆槑鐧斤紝娌℃兂鍒拌繖鏈功閿欒榪欎箞澶氾級
鍙戣鐨勬椂鍊欙紝灝嗗ご鏂囦歡銆?lib鏂囦歡鍜孌LL鏂囦歡緇欑敤鎴峰氨鍙互浜嗐俵ib鏂囦歡鐨勪綔鐢ㄦ槸璇存槑浜嗗ご鏂囦歡涓嚱鏁版墍鍦ㄧ殑DLL鏂囦歡錛屽鏋滄病鏈塴ib鏂囦歡錛岀紪璇戝櫒灝嗗湪閾炬帴榪囩▼涓彁紺洪敊璇細(xì)unresolved external symbol 鍑芥暟鍚嶃?br>浜嬪疄涓婏紝璋冪敤DLL鏈変袱縐嶆柟寮忥紝絎竴縐嶆槸姣旇緝甯哥敤錛屽嵆鍖呭惈DLL鐨勫ご鏂囦歡錛屽茍鍦ㄩ摼鎺ョ殑鏃跺欏皢鍔ㄦ侀摼鎺ュ簱鍚宔xe鏂囦歡鍍忚繛鎺ワ紝寤虹珛杈撳叆琛ㄣ傝繖涓椂鍊欓渶瑕?lib鏂囦歡銆傜浜岀鏂規(guī)硶exe鏂囦歡涓病鏈夎緭鍏ヨ〃錛岀▼搴忎嬌鐢↙oadLibrary(Ex)鍜孏etProcAddress()鏄懼紡鐨勫姞杞紻LL鏂囦歡錛堝嵏杞界敤FreeLibrary())錛岃繖涓椂鍊欎笉闇瑕?lib鏂囦歡銆?br>HINSTANCE LoadLibrary(PCTSTR pszDLLpathName);
HINSTANCE LoadLibraryEx(PCTSTR pszDLLpathName,NULL,0);
HINSTANCE GetModuleHandle(PCTSTR pszModuleName);//紜畾dll鏄惁宸茬粡琚槧灝勮繘鍦板潃絀洪棿銆?br>HINSTANCE hinstDll=GetModuleHandle("MyLib");
if(hinstDll==NULL)
{
hinstDll=LoadLibrary("MyLib");
}
HINSTANCE hinstModule,
PTSTR pszPathName,
DWORD cchPath
}
鍙互鑾峰緱鏌愪釜妯″潡錛?exe鎴栬卍ll)鐨勫叏璺緞鍚嶃?/p>
typedef int (*MYPROC)(int,int);
{
HINSTANCE t;
t=LoadLibraryEx(TEXT("tt.dll"),NULL,0);
if(t)
{
cout<<TEXT("load success")<<endl;
HINSTANCE hinstDll=GetModuleHandle("tt.dll");
if(hinstDll==NULL)
{
cout<<TEXT("first load failed")<<endl;
hinstDll=LoadLibrary("MyLib");
}
size_t sz=100;
PTCHAR str=new TCHAR[sz];
GetModuleFileName(t,str,sz);
cout<<str<<endl;
delete str;
MYPROC add=NULL;
add=(MYPROC)GetProcAddress(t,"add");
if(NULL!=add)
{
cout<<(*add)(1,2)<<endl;
}
FreeLibrary(t);
}
UNICODE
ANSI/UNICODE閫氱敤鐨勫畾涔夋柟娉曪紙杞崲鍙渶瑕佸湪緙栬瘧鐨勬椂鍊欎嬌鐢╛UNICODE鍜孶NICODE錛夛細(xì)
TCHAR _TEXT("success") PTSTR PCTSTR _tcscpy(),_tcscat();
浣跨敤BYTE PBYTE瀹氫箟瀛楄妭錛屽瓧鑺傛寚閽堝拰鏁版嵁緙撳啿銆?br>浼犻掔粰鍑芥暟鐨勭紦瀛樺ぇ灝忥細(xì)sizeof(szBuffer)/sizeof(TCHAR)
緇欏瓧絎︿覆鍒嗛厤鍐呭瓨錛歮alloc(nCharacters*sizeof(TCHAR));
鍏跺畠鐨勫瓧絎︿覆鍑芥暟錛?br>PTSTR CharLower(PTSTR pszString);
PTSTR CharUpper(PTSTR pszString);
杞崲鍗曚釜瀛楃錛?br>TCHAR c=CharLower((PTSTR)szString[0]);
杞崲緙撳瓨涓殑瀛楃涓詫紙涓嶅繀浠?緇撳熬錛夛細(xì)
DWORD CharLowerBuff(
PTSTR pszString,
DWORD cchString);
DWORD CharUpperBuff(
PTSTR pszString,
DWORD cchString);
BOOL IsCharAlpahNumeric(TCHAR ch);
BOOL IsCharLower(TCHAR ch);
BOOL IsCharUpper(TCHAR ch);
PVOID pvTlsValue);
DWORD dwTlsIndex); //媯(gè)绱VOID鏁扮粍銆?/p>
DWORD dwTlsIndex); //閲婃斁PVOID鏁扮粍鍗曞厓
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs
灝嗕綘鐨凞LL璺緞鏀懼叆榪欎釜鍏抽敭瀛椾笅闈€傚綋User32.dll琚槧灝勫埌榪涚▼涓殑鏃跺欙紝瀹冧細(xì)鍔犲湪榪欎釜鍏抽敭瀛椾笅鐨勬瘡涓簱銆?br>娉ㄦ剰錛氾紙1錛夊win98鏃犳晥
錛?錛夌敱浜庡姞杞戒簨闂存瘮杈冩棭錛屼綘鐨凞LL鍙兘鏃犳硶璋冪敤kernel32浠ュ鐨刣ll.
(3) 濡傛灉榪涚▼娌℃湁浣跨敤user32.dll錛岃繖涓柟娉曟棤鏁堛?br> (4) 闇瑕侀噸鏂板惎鍔ㄣ?br> 錛?錛塽ser32涓嶄細(xì)媯(gè)鏌ユ瘡涓簱鏄惁鍔犺澆鎴愬姛銆?br>2 浣跨敤windows閽╁瓙
HOOK hHook=SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hinstDll,0);
BOOL UnhookWindowsHookEx(HHOOK hhook);
鍏蜂綋榪囩▼濡備笅錛?br> 錛?錛夎繘紼婤鐨勪竴涓嚎紼嬪噯澶囧彂閫佹秷鎭粰涓涓獥鍙c?br> 錛?錛夌郴緇熷療鐪嬬嚎紼嬩笂鏄惁宸茬粡瀹夎浜哤H_GETMESSAGE閽╁瓙銆?br> 錛?錛夌郴緇熷療鐪婫etMsgProc鐨凞LL鏄惁宸茬粡鏄犲皠鍒頒簡榪涚▼B鐨勫湴鍧絀洪棿錛屽鏋滄病鏈夛紝緋葷粺灝嗘妸DLL鏄犲皠鍒癇鐨勫湴鍧絀洪棿錛屽茍鑷姩澧炲姞寮曠敤璁℃暟銆?br> 錛?錛夎皟鐢℅etMsgProc鍑芥暟錛岃繑鍥炴椂錛岀郴緇熶細(xì)鑷姩涓篋LL鐨勫紩鐢ㄨ鏁板噺涓銆?/p>
(1)浣跨敤VirtualAllocEx,鍒嗛厤榪滅▼榪涚▼鐨勫湴鍧絀洪棿鐨勫唴瀛樸?br> (2)浣跨敤WriteProcessMemory,灝咲ll鐨勮礬寰勫悕鎷瘋礉鍒扮涓涓楠や腑宸茬粡鍒嗛厤鐨勫唴瀛樹腑銆?br> (3)浣跨敤GetProcAddress,鑾峰緱LoadLibrary鐨勫疄闄呭湴鍧銆?br> (4)浣跨敤CreateRemoteThread,鍦ㄨ繙紼嬭繘紼嬩腑鍒涘緩涓涓嚎紼嬨?br> 閫鍑猴細(xì)
(5)浣跨敤VirtualFreeEx錛岄噴鏀懼唴瀛?br> (6)浣跨敤GetProcAddress,鑾峰緱FreeLiabary鐨勫湴鍧銆?br> (7)浣跨敤CreateRemoteThread,鍦ㄨ繙紼嬭繘紼嬩腑鍒涘緩涓涓嚎紼嬶紝璋冪敤FreeLiabary鍑芥暟銆?br>4 浣跨敤鐗規(guī)礇浼奃LL鎻掑叆
鏇挎崲dll.
5 灝咲LL浣滀負(fù)璋冭瘯紼嬪簭鎻掑叆
6 win98鍐呭瓨鏄犲皠鏂囦歡錛宑reatprocess
緇撴潫澶勭悊紼嬪簭錛歘_try{} __finally{}
闄ら潪__try鎵ц涓繘紼嬫垨鑰呯嚎紼嬬粨鏉燂紝鍚﹀垯鎬諱細(xì)鎵ц__finally錛屽茍涓擾_finally涓殑return浼?xì)鏇夸唬__try涓殑return;濂界殑涔?fàn)鎯槸灏唕eturn ,continue,break,goto璇彞鎷垮埌緇撴瀯鍖栧紓甯稿鐞嗚鍙ュ闈紝鍙互鑺傜渷寮閿銆傚皢__try涓殑return 鎹㈡垚__leave錛屽彲浠ヨ妭鐪佸紑閿銆傚湪__finally鎬葷‘瀹氭椂姝e父榪涘叆榪樻槸灞曞紑榪涘叆錛?br>BOOL AbnormalTermination();//姝e父榪涘叆榪斿洖FALSE,灞閮ㄥ睍寮鎴栬呭叏灞灞曞紑榪斿洖TRUE;
琛ㄧず澶勭悊寮傚父錛屽鐞嗗悗杞埌exception鍧楀悗闈㈢殑浠g爜緇х畫鎵ц銆?br>EXCEPTION_CONTINUE_EXECUTION
EXCEPTION_CONTINUE_SEARCH
DWORD dwExceptionCode,
DWORD dwExceptionFlags,
DWORD nNumberOfArguments,
CONST ULONG_PTR *pArguments);
win98鏄瓨鏀懼湪win.ini閲?/p>
while(*str++!='\0');
搴旇娉ㄦ剰鐨勬槸鍦ㄤ笉婊¤凍鏉′歡鍚庯紝str浠嶇劧浼?xì)鑷?銆?/p>
== != = empty() size() clear(),begin(),end(),浠ュ強(qiáng)insert鍜宔rase,涓嶈繃鍚庤呴殢瀹瑰櫒鐨勭殑涓嶅悓鑰屼笉鍚?/p>
vector(鏁扮粍):鎻掑叆鍜屽垹闄ょ殑鏁堢巼杈冧綆錛屼絾瀛樺彇鏁堢巼楂樸?br>list錛堝弻鍚戦摼琛級:涓庡墠鑰呯浉鍙嶏紝鎻掑叆鍜屽垹闄ょ殑鏁堢巼杈冮珮錛屼絾瀛樺彇鏁堢巼浣庛傛瘡涓厓绱犲寘鍚笁涓瓧孌碉細(xì)value back front.
deque(闃熷垪):鍦ㄥ墠绔拰鏈熬鎿嶄綔鏁堢巼楂樸?/p>
vector<int> vtor;
2 浜х敓鐗瑰畾澶у皬鐨勫鍣紝瀹瑰櫒涓殑姣忎釜鍏冪礌閮戒互鍏墮粯璁ゅ間負(fù)鍒濆鹼紙鍙戠幇VC涓殑int double絳夋病鏈夐粯璁ゅ鹼級銆?br>list<int> ilist(1024);
vector<string> svec(24);
3 浜х敓鐗瑰畾澶у皬鐨勫鍣紝騫朵負(fù)姣忎釜鍏冪礌鎸囧畾鍒濆鹼細(xì)
list<int ilist(1024,0);
vector<string> svec(24,"default");
4 閫氳繃涓瀵硅凱浠e櫒浜х敓瀹瑰櫒錛岃繖瀵硅凱浠e櫒鐢ㄦ潵琛ㄧず鏁扮粍浣滀負(fù)鍒濆肩殑鍖洪棿錛?br>int ia[10]={1,2,3,4,5,6,7,8,9,0};
vector<int> iv(ia+2,ia+8);
5 澶嶅埗鏌愪釜鐜版湁鐨勫鍣ㄧ殑鍊鹼細(xì)
vector<int> ivec1;
//濉厖ivec1;
vector<int> ivec2(ivec1);
iterator insert(iterator position,elemType value):灝唙alue鎻掑埌position鍓嶃傝繑鍥炲兼寚鍚戣鎻掑叆鐨勫厓绱犮?br>void insert(iterator position,int count,elemType value):鍦╬osition鍓嶆彃鍏ount涓厓绱狅紝姣忎釜鍏冪礌閮芥槸value.
void insert(iterator1 position,iterator2 first,iterator2 last):灝唂irst,last涔嬮棿鐨勫厓绱犳彃鍒皃osition鍓?
iterator insert( iterator position):鍦╬osition鍓嶆彃鍏ュ厓绱狅紝鍒濆間負(fù)鎵灞炵被鍨嬬殑榛樿鍊箋?/p>
1 iterator erase(iterator posit):鍒犻櫎posit鎸囧悜鐨勫厓绱犮?br>list<string>::iterator it=find(slist.begin(),slist,end(),str);
slist.erase(it);
2 iterator erase(iterator first,iterator last):鍒犻櫎first,last闂寸殑鍏冪礌銆?/p>
vector<string::const_iterator iter_cs_vec.begin();
錛僫 nclude <algorithm>
綆楁湳榪愮畻錛?br>plus<type> minus<type> negate<type> multiplies<type> divides<type> modules<type>
鍏崇郴榪愮畻錛?br>less<type> less equal<type> greater<type greater equal<type> equal_to<type> not_equal_to<type>
閫昏緫榪愮畻錛?br>logical_and<type> logical_or<type> logical_not<type>
錛僫 nclude <map>
錛僫 nclude <string>
map<string,int> words;
for(;it!=words.end();++it)
cout<<"key:"<<it->first<<"value:"<<it->second<<endl;
words.find("vermeer");//榪斿洖iterator,鎸囧悜鎵懼埌鐨勫厓绱狅紝鎵句笉鍒拌繑鍥瀍nd();
榪樺彲浠ワ細(xì)
if(words.count(search_word))
count=words[search_word];
錛僫 nclude <set>
錛僫 nclude <string>
set<string> word_exclusion;
//鍒ゆ柇鏄惁瀛樺湪鏌愪釜鍏冪礌
if(word_exclusion.count(tword))
//榛樿鎯呭喌涓嬶紝鎵鏈夊厓绱犳寜less-than榪愮畻鎺掑垪
iset.insert(ival);
iset.insert(vec.begin(),vec.end());
錛僫 nclude <iterator>
back_inserter()
inserter()
front_inserter()
windows鍐呭瓨鏄敱楂樺湴鍧鍚戝簳鍦板潃鍒嗛厤鐨勶紝浣嗗彉閲忕殑瀛樺偍鏄粠搴曞湴鍧鍒伴珮鍦板潃鐨勶紝濡侷NT綾誨瀷鐨勫洓涓瓧鑺傦紝鏁扮粍鐨勬瘡涓厓绱犮?br>
鍐呭瓨澶嶅埗鐨勬椂鍊欎笉鑳界敤瀛楃涓叉嫹璐濆嚱鏁幫紝鍥犱負(fù)鍗充嬌浣跨敤strncpy鎸囧畾浜嗗鍒剁殑闀垮害錛屾嫹璐濆嚱鏁頒篃浼?xì)閬囧?\0'鑷姩緇堟錛岃浣跨敤MEMSET銆?/p>
{
unsigned short name;
unsigned short type;
unsigned short cla;
unsigned short length;
unsigned int ttl;
};
struct DNSAnswer
{
unsigned short name;
unsigned short type;
unsigned short cla;
unsigned int ttl;
unsigned short length;
};
}
RTP 鏄洰鍓嶈В鍐蟲祦濯掍綋瀹炴椂浼犺緭闂鐨勬渶濂藉姙娉曪紝瑕佸湪 Linux 騫沖彴涓婅繘琛屽疄鏃朵紶閫佺紪紼嬶紝鍙互鑰冭檻浣跨敤涓浜涘紑鏀炬簮浠g爜鐨?nbsp;RTP 搴擄紝濡?nbsp;LIBRTP銆丣RTPLIB 絳夈侸RTPLIB 鏄竴涓潰鍚戝璞$殑 RTP 搴擄紝瀹冨畬鍏ㄩ伒寰?nbsp;RFC 1889 璁捐錛屽湪寰堝鍦哄悎涓嬫槸涓涓潪甯鎬笉閿欑殑閫夋嫨銆侸RTPLIB 鏄竴涓敤 C++ 璇█瀹炵幇鐨?nbsp;RTP 搴擄紝榪欎釜搴撲嬌鐢╯ocket 鏈哄埗瀹炵幇緗戠粶閫氳 鍥犳鍙互榪愯鍦?nbsp;Windows銆丩inux銆丗reeBSD銆丼olaris銆乁nix鍜孷xWorks 絳夊縐嶆搷浣滅郴緇熶笂銆?br>浜屻丣RTPLIB 搴撶殑浣跨敤鏂規(guī)硶鍙?qiáng)绋嬪簭瀹炵?br> (1)JRTPLIB 鍑芥暟 鐨勪嬌鐢?br> a銆佸湪浣跨敤 JRTPLIB 榪涜瀹炴椂嫻佸獟浣撴暟鎹紶杈撲箣鍓嶏紝棣栧厛搴旇鐢熸垚 RTPSession 綾葷殑涓涓疄渚嬫潵琛ㄧず姝ゆ RTP 浼?xì)璇濆Q岀劧鍚庤皟鐢?nbsp;Create() 鏂規(guī)硶鏉ュ鍏惰繘琛屽垵濮嬪寲鎿嶄綔銆俁TPSession 綾葷殑 Create() 鏂規(guī)硶鍙湁涓涓弬鏁幫紝鐢ㄦ潵鎸囨槑姝ゆ RTP 浼?xì)璇濇墍閲囩敤鐨勭鍙e彿銆?br> RTPSession sess; sess.Create(5000);
b銆佽緗伆褰撶殑鏃舵埑鍗曞厓錛屾槸 RTP 浼?xì)璇濆垵濮嬪寲杩嚱E嬫墍瑕佽繘琛岀殑鍙﹀涓欏歸噸瑕佸伐浣滐紝榪欐槸閫氳繃璋冪敤 RTPSession 綾葷殑 SetTimestampUnit() 鏂規(guī)硶鏉ュ疄鐜扮殑錛岃鏂規(guī)硶鍚屾牱涔熷彧鏈変竴涓弬鏁幫紝琛ㄧず鐨勬槸浠ョ涓哄崟鍏冪殑鏃舵埑鍗曞厓銆?br> sess.SetTimestampUnit(1.0/8000.0);
c銆佸綋 RTP 浼?xì)璇濇垚鍔熷缓绔嬭典h潵涔嬪悗錛屾帴涓嬪幓灝卞彲浠ュ紑濮嬭繘琛屾祦濯掍綋鏁版嵁鐨勫疄鏃朵紶杈撲簡銆傞鍏堥渶瑕佽緗ソ鏁版嵁鍙戦佺殑鐩爣鍦板潃錛孯TP 鍗忚鍏佽鍚屼竴浼?xì)璇濆瓨鍦ㄥ涓洰鏍囧湴鍧錛岃繖鍙互閫氳繃璋冪敤 RTPSession 綾葷殑 AddDestination()銆丏eleteDestination() 鍜?nbsp;ClearDestinations() 鏂規(guī)硶鏉ュ畬鎴愩備緥濡傦紝涓嬮潰鐨勮鍙ヨ〃紺虹殑鏄 RTP 浼?xì)璇潪畣鏁版嵁鍙戦佸埌鏈湴涓繪満鐨?nbsp;6000 绔彛錛?nbsp;
unsigned long addr = ntohl(inet_addr("127.0.0.1"));
sess.AddDestination(addr, 6000);
d銆佺洰鏍囧湴鍧鍏ㄩ儴鎸囧畾涔嬪悗錛屾帴鐫灝卞彲浠ヨ皟鐢?nbsp;RTPSession 綾葷殑 SendPacket() 鏂規(guī)硶錛屽悜鎵鏈夌殑鐩爣鍦板潃鍙戦佹祦濯掍綋鏁版嵁銆係endPacket() 鏄?nbsp;RTPSession 綾繪彁渚涚殑涓涓噸杞藉嚱鏁?br>瀵逛簬鍚屼竴涓?nbsp;RTP 浼?xì)璇濇潵璁插Q岃礋杞界被鍨嬨佹爣璇嗗拰鏃舵埑澧為噺閫氬父鏉ヨ閮芥槸鐩稿悓鐨勶紝JRTPLIB 鍏佽灝嗗畠浠緗負(fù)浼?xì)璇濈殑榛樿鍙傛晭图寴q欐槸閫氳繃璋冪敤 RTPSession 綾葷殑 SetDefaultPayloadType()銆丼etDefaultMark() 鍜?nbsp;SetDefaultTimeStampIncrement() 鏂規(guī)硶鏉ュ畬鎴愮殑銆備負(fù) RTP 浼?xì)璇濊畡〗畼q欎簺榛樿鍙傛暟鐨勫ソ澶勬槸鍙互綆鍖栨暟鎹殑鍙戦侊紝渚嬪錛屽鏋滀負(fù) RTP 浼?xì)璇濊畡〗簡榛樿鍙傛晭图?xì)
sess.SetDefaultPayloadType(0);
sess.SetDefaultMark(false);
sess.SetDefaultTimeStampIncrement(10);
涔嬪悗鍦ㄨ繘琛屾暟鎹彂閫佹椂鍙渶鎸囨槑瑕佸彂閫佺殑鏁版嵁鍙?qiáng)鍏堕暱搴鍙互浜嗗Q?nbsp;
sess.SendPacket(buffer, 5);
e銆佸浜庢祦濯掍綋鏁版嵁鐨勬帴鏀剁錛岄鍏堥渶瑕佽皟鐢?nbsp;RTPSession 綾葷殑 PollData() 鏂規(guī)硶鏉ユ帴鏀跺彂閫佽繃鏉ョ殑 RTP 鎴栬?nbsp;RTCP 鏁版嵁鎶ャ傜敱浜庡悓涓涓?nbsp;RTP 浼?xì)璇濅腑鍏佽鏈夊涓弬涓庤咃紙婧愶級錛屼綘鏃㈠彲浠ラ氳繃璋冪敤 RTPSession 綾葷殑 GotoFirstSource() 鍜?nbsp;GotoNextSource() 鏂規(guī)硶鏉ラ亶鍘嗘墍鏈夌殑婧愶紝涔熷彲浠ラ氳繃璋冪敤 RTPSession 綾葷殑 GotoFirstSourceWithData() 鍜?nbsp;GotoNextSourceWithData() 鏂規(guī)硶鏉ラ亶鍘嗛偅浜涙惡甯︽湁鏁版嵁鐨勬簮銆傚湪浠?nbsp;RTP 浼?xì)璇濅腑妫嫻嬪嚭鏈夋晥鐨勬暟鎹簮涔嬪悗錛屾帴涓嬪幓灝卞彲浠ヨ皟鐢?nbsp;RTPSession 綾葷殑 GetNextPacket() 鏂規(guī)硶浠庝腑鎶藉彇 RTP 鏁版嵁鎶ワ紝褰撴帴鏀跺埌鐨?nbsp;RTP 鏁版嵁鎶ュ鐞嗗畬涔嬪悗錛屼竴瀹氳璁板緱鍙?qiáng)鏃堕噴鏀俱?br>
JRTPLIB 涓?nbsp;RTP 鏁版嵁鎶ュ畾涔変簡涓夌鎺ユ敹妯″紡錛屽叾涓瘡縐嶆帴鏀舵ā寮忛兘鍏蜂綋瑙勫畾浜嗗摢浜涘埌杈劇殑 RTP 鏁版嵁鎶ュ皢浼?xì)琚帴鍙楀Q岃屽摢浜涘埌杈劇殑 RTP 鏁版嵁鎶ュ皢浼?xì)琚嫆缁濄傞氳繃璋冪敤 RTPSession 綾葷殑 SetReceiveMode() 鏂規(guī)硶鍙互璁劇疆涓嬪垪榪欎簺鎺ユ敹妯″紡錛?nbsp;
? RECEIVEMODE_ALL銆銆緙虹渷鐨勬帴鏀舵ā寮忥紝鎵鏈夊埌杈劇殑 RTP 鏁版嵁鎶ラ兘灝嗚鎺ュ彈錛?nbsp;
? RECEIVEMODE_IGNORESOME銆銆闄や簡鏌愪簺鐗瑰畾鐨勫彂閫佽呬箣澶栵紝鎵鏈夊埌杈劇殑 RTP 鏁版嵁鎶ラ兘灝嗚鎺ュ彈錛岃岃鎷掔粷鐨勫彂閫佽呭垪琛ㄥ彲浠ラ氳繃璋冪敤 AddToIgnoreList()銆丏eleteFromIgnoreList() 鍜?nbsp;ClearIgnoreList() 鏂規(guī)硶鏉ヨ繘琛岃緗紱
? RECEIVEMODE_ACCEPTSOME銆銆闄や簡鏌愪簺鐗瑰畾鐨勫彂閫佽呬箣澶栵紝鎵鏈夊埌杈劇殑 RTP 鏁版嵁鎶ラ兘灝嗚鎷掔粷錛岃岃鎺ュ彈鐨勫彂閫佽呭垪琛ㄥ彲浠ラ氳繃璋冪敤 AddToAcceptList ()銆丏eleteFromAcceptList 鍜?nbsp;ClearAcceptList () 鏂規(guī)硶鏉ヨ繘琛岃緗?nbsp;涓嬮潰鏄噰鐢ㄧ涓夌鎺ユ敹妯″紡鐨勭▼搴忕ず渚嬨?br> if (sess.GotoFirstSourceWithData()) {
do {
sess.AddToAcceptList(remoteIP, allports,portbase);
sess.SetReceiveMode(RECEIVEMODE_ACCEPTSOME);
RTPPacket *pack;
pack = sess.GetNextPacket(); // 澶勭悊鎺ユ敹鍒扮殑鏁版嵁
delete pack; }
while (sess.GotoNextSourceWithData());
}
錛?錛夌▼搴忔祦紼嬪浘
鍙戦侊細(xì)鑾峰緱鎺ユ敹绔殑 IP 鍦板潃鍜岀鍙e彿 鍒涘緩 RTP 浼?xì)璇?nbsp; 鎸囧畾 RTP 鏁版嵁鎺ユ敹绔?nbsp;璁劇疆 RTP 浼?xì)璇濋粯璁ゅ弬鏁?nbsp; 鍙戦佹祦濯掍綋鏁版嵁
鎺ユ敹錛氳幏寰楃敤鎴鋒寚瀹氱殑绔彛鍙?nbsp; 鍒涘緩RTP浼?xì)璇?nbsp; 璁劇疆鎺ユ敹妯″紡 鎺ュ彈RTP鏁版嵁 媯(gè)绱TP鏁版嵁婧?nbsp; 鑾峰彇RTP鏁版嵁鎶?nbsp; 鍒犻櫎RTP鏁版嵁鎶?br>
涓夈佺幆澧冩惌寤哄強(qiáng)緙栬瘧鏂規(guī)硶
錛?錛塗oolchain鐨勫畨瑁?br> 棣栧厛鎵懼埌xscale-arm-toolchain.tgz鏂囦歡錛屽亣璁捐鏂囦歡鍖呮斁鍦?tmp/涓?br> #cd /
#tar -zxvf /tmp/xscale-arm-toolchain.tgz
鍐嶈緗幆澧冨彉閲?br> #export PATH=/usr/local/arm-linux/bin:$PATH
鏈鍚庢鏌ヤ竴涓嬩氦鍙夌紪璇戝伐鍏鋒槸鍚﹀畨瑁呮垚鍔?br> #arm-linux-g++ --version
鐪嬫槸鍚︽樉紺篴rm-linux-g++鐨勭増鏈紝濡傛湁鍒欏畨瑁呮垚鍔熴?br>錛?錛塉RTPLIB 搴撶殑浜ゅ弶緙栬瘧鍙?qiáng)瀹夎?br> 棣栧厛浠?nbsp;JRTPLIB 鐨勭綉绔欙紙
http://lumumba.luc.ac.be/jori/jrtplib/jrtplib.htmll錛?nbsp;涓嬭澆鏈鏂扮殑婧愮爜鍖咃紝姝ゅ浣跨敤鐨勬槸jrtplib-2.8.tar錛屽亣璁句笅杞藉悗鐨勬簮鐮佸寘鏀懼湪/tmp涓嬶紝鎵?nbsp;琛屼笅闈㈢殑鍛戒護(hù)瀵瑰叾瑙e帇緙╋細(xì)
#cd /tmp
#tar -zxvf jrtplib-2.8.tar
鐒跺悗瑕佸jrtplib榪涜閰嶇疆鍜岀紪璇?br> #cd jrtplib-2.8
#./configure CC=arm-linux-g++ cross-compile=yes
淇敼Makefile鏂囦歡
灝嗛摼鎺ュ懡浠d 鍜宎r鏀逛負(fù)arm-linux-ld鍜?nbsp;arm-linux-ar
#make
鏈鍚庡啀鎵ц濡備笅鍛戒護(hù)灝卞彲浠ュ畬鎴?nbsp;JRTPLIB 鐨勫畨瑁咃細(xì)
#make install
(3)紼嬪簭緙栬瘧
a銆侀厤緗紪璇戠幆澧?br> 鍙互鐢╡xport鏉ラ厤緗紝涔熷彲浠ョ敤緙栧啓Makefile鐨勬柟娉曘傝繖閲岄噰鐢∕akefile銆?br> 緙栧啓Makefile&:
INCL = -I/usr/local/include
CFLAGS = -pipe -O2 -fno-strength-reduce
LFLAGS = /usr/local/lib/libjrtp.a -L/usr/X11R6/lib
LIBS = -LX11 -LXext /usr/local/lib/libjrtp.a
CC = arm-linux-g++
main:main.o
$(CC) $(LFLAGS) $(INCL) -o main main.o $(LIBS)
main.o:main.cpp
clean:
rm -f main
rm -f *.o
.SUFFIXES:.cpp
.cpp.o:
$(CC) -c $(CFLAGS) $(INCL) -o $@ $< /* $@琛ㄧず鐩爣鐨勫畬鏁村悕瀛?nbsp; */
/* $<琛ㄧず絎竴涓緷璧栨枃浠剁殑鍚嶅瓧 */
b銆佺紪璇?br> 鍋囪鍙戦佸拰鎺ユ敹紼嬪簭鍒嗗埆鏀懼湪/tmp/send鍜?tmp/receive鐩綍涓?br> #cd /tmp/send
#make
#cd /tmp/receive
#make
鍥涖佹槗鍑洪敊璇強(qiáng)娉ㄦ剰闂
1銆佹壘涓嶅埌涓浜涙爣鍑嗙殑鏈 鍩烘湰鐨勪竴浜涘ご鏂囦歡銆?br> 涓昏鏄洜涓篢oolchain璺緞娌″畨瑁呭錛岃 涓ユ牸鎸夌収姝ラ瀹夎銆?br> 2銆佹壘涓嶅埌浣跨敤鐨刯rtplib搴撲腑鐨勪竴浜涘ご鏂囦歡銆?br> 鍦?nbsp;jrtplib鐨勫畨瑁呯洰褰曚笅錛宨nclude璺緞涓嬩笉鑳藉啀鏈夊埆鐨勭洰褰曘?br> 3銆乺ecieve鍑芥暟鎺ユ敹鏁版嵁鍖呬笉鑳芥紜彁鍑烘墍瑕佹暟鎹?br> 鐢變簬姣忎竴涓猂TP鏁版嵁鎶ラ兘鐢卞ご閮紙Header錛夊拰璐熻澆錛圥ayload錛変袱涓儴鍒嗙粍鎴愶紝鑻ヤ嬌鐢╣etrawdata()鏄繑鍥炴暣涓暟鎹寘鐨勬暟鎹紝鍖呭惈浼犺緭濯掍綋鐨勭被鍨嬨佹牸寮忋佸簭鍒楀彿銆佹椂闂存埑浠ュ強(qiáng)鏄惁鏈夐檮鍔犳暟鎹瓑淇℃伅銆俫etpayload()鍑芥暟鏄繑鍥炴墍鍙戦佺殑鏁版嵁銆備袱鑰呬竴瀹氳鍒嗘竻銆?br> 4銆佽緗甊ECEIVEMODE_ACCEPTSOME銆銆鎺ユ敹妯″紡鍚庯紝榪愯紼嬪簭鎺ユ敹绔笉鑳芥帴鍖呫?br> IP鍦板潃鏍煎紡鍑轟簡闂銆俰ner_addr()涓巒tohl()鍑芥暟瑕佺敤瀵癸紝鍚﹀垯鍙傛暟浼犱笉榪涘幓錛屾帴鍙楀垪琛ㄤ腑鏃犲鹼紝褰撶劧鎺ユ敹涓嶄簡鏁版嵁鍖呫?br> 5銆佺紪璇戦氳繃錛屼絾嫻嬭瘯鏃舵帴鏀剁涓嶈兘鎺ユ敹鍒版暟鎹?br> 鍙兘鏄帴鏀舵満闃茬伀澧欐湭鍏抽棴銆傝繍琛岋細(xì)
#iptables -F
涔熷彲鑳芥槸IP鍦板潃娌℃湁璁劇疆濂姐傝繍琛岋細(xì)
#ifocnfig eth0 *.*.*.* netmask *.*.*.*
6銆佷嬌鐢╦rtolib搴撴椂錛屽湪紼嬪簭涓璱nclude 鍚庢渶濂藉姞涓婂簱鎵鍦ㄧ殑璺緞銆?br>浜斻佺▼搴?br>
send:
#include <stdio.h>
#include <string.h>
#include "rtpsession.h"
// 閿欒澶勭悊鍑芥暟
void checkerror(int err)
{
if (err < 0) {
char* errstr = RTPGetErrorString(err);
printf("Error:%s\\n", errstr);
exit(-1);
}
}
int main(int argc, char** argv)
{
RTPSession sess;
unsigned long destip;
int destport;
int portbase = 6000;
int status, index;
char buffer[128];
if (argc != 3) {
printf("Usage: ./sender destip destport\\n");
return -1;
}
// 鑾峰緱鎺ユ敹绔殑IP鍦板潃鍜岀鍙e彿
destip = inet_addr(argv[1]);
if (destip == INADDR_NONE) {
printf("Bad IP address specified.\\n");
return -1;
}
destip = ntohl(destip);
destport = atoi(argv[2]);
// 鍒涘緩RTP浼?xì)璇?br> status = sess.Create(portbase);
checkerror(status);
// 鎸囧畾RTP鏁版嵁鎺ユ敹绔?br> status = sess.AddDestination(destip, destport);
checkerror(status);
// 璁劇疆RTP浼?xì)璇濋粯璁ゅ弬鏁?br> sess.SetDefaultPayloadType(0);
sess.SetDefaultMark(false);
sess.SetDefaultTimeStampIncrement(10);
// 鍙戦佹祦濯掍綋鏁版嵁
index = 1;
do {
sprintf(buffer, "%d: RTP packet", index ++);
sess.SendPacket(buffer, strlen(buffer));
printf("Send packet !\\n");
} while(1);
return 0;
}
receive:
#include <stdio.h>
#include "rtpsession.h"
#include "rtppacket.h"
// 閿欒澶勭悊鍑芥暟
void checkerror(int err)
{
if (err < 0) {
char* errstr = RTPGetErrorString(err);
printf("Error:%s\\n", errstr);
exit(-1);
}
}
int main(int argc, char** argv)
{
RTPSession sess;
int localport,portbase;
int status;
unsigned long remoteIP;
if (argc != 4) {
printf("Usage: ./sender localport\\n");
return -1;
}
// 鑾峰緱鐢ㄦ埛鎸囧畾鐨勭鍙e彿
remoteIP = inet_addr(argv[1]);
localport = atoi(argv[2]);
portbase = atoi(argv[3]);
// 鍒涘緩RTP浼?xì)璇?br> status = sess.Create(localport);
checkerror(status);
//RTPHeader *rtphdr;
unsigned long timestamp1;
unsigned char * RawData;
unsigned char temp[30];
int lengh ,i;
bool allports = 1;
sess.AddToAcceptList(remoteIP, allports,portbase);
do {
//璁劇疆鎺ユ敹妯″紡
sess.SetReceiveMode(RECEIVEMODE_ACCEPTSOME);
sess.AddToAcceptList(remoteIP, allports,portbase);
// 鎺ュ彈RTP鏁版嵁
status = sess.PollData();
// 媯(gè)绱TP鏁版嵁婧?br> if (sess.GotoFirstSourceWithData()) {
do {
RTPPacket* packet;
// 鑾峰彇RTP鏁版嵁鎶?br> while ((packet = sess.GetNextPacket()) != NULL) {
printf("Got packet !\n");
timestamp1 = packet->GetTimeStamp();
lengh=packet->GetPayloadLength();
RawData=packet->GetPayload();
for(i=0;i<lengh;i++){
temp[i]=RawData[i];
printf("%c",temp[i]);
}
temp[i]='\0';
printf(" timestamp: %d lengh=%d data:%s\n",timestamp1,lengh,&temp);
// 鍒犻櫎RTP鏁版嵁鎶?br>
delete packet;
}
} while (sess.GotoNextSourceWithData());
}
} while(1);
return 0;
}
]]>
涓銆佹祦濯掍綋綆浠?/span>
闅忕潃Internet鐨勬棩鐩婃櫘鍙?qiáng)锛屽湪缃懢l滀笂浼犺緭鐨勬暟鎹凡緇忎笉鍐嶅眬闄愪簬鏂囧瓧鍜屽浘褰紝鑰屾槸閫愭笎鍚戝0闊沖拰瑙嗛絳夊濯掍綋鏍煎紡榪囨浮銆傜洰鍓嶅湪緗戠粶涓婁紶杈撻煶棰?span>/瑙嗛錛?span>Audio/Video錛岀畝縐?span>A/V錛夌瓑澶氬獟浣撴枃浠舵椂錛屽熀鏈笂鍙湁涓嬭澆鍜屾祦寮忎紶杈撲袱縐嶉夋嫨銆傞氬父璇存潵錛?span>A/V鏂囦歡鍗犳嵁鐨勫瓨鍌ㄧ┖闂撮兘姣旇緝澶э紝鍦ㄥ甫瀹藉彈闄愮殑緗戠粶鐜涓笅杞藉彲鑳借鑰楄垂鏁板垎閽熺敋鑷蟲暟灝忔椂錛屾墍浠ヨ繖縐嶅鐞嗘柟娉曠殑寤惰繜寰堝ぇ銆傚鏋滄崲鐢ㄦ祦寮忎紶杈撶殑璇濓紝澹伴煶銆佸獎(jiǎng)鍍忋佸姩鐢葷瓑澶氬獟浣撴枃浠跺皢鐢變笓闂ㄧ殑嫻佸獟浣撴湇鍔″櫒璐熻矗鍚戠敤鎴瘋繛緇佸疄鏃跺湴鍙戦侊紝榪欐牱鐢ㄦ埛鍙互涓嶅繀絳夊埌鏁翠釜鏂囦歡鍏ㄩ儴涓嬭澆瀹屾瘯錛岃屽彧闇瑕佺粡榪囧嚑縐掗挓鐨勫惎鍔ㄥ歡鏃跺氨鍙互浜嗭紝褰撹繖浜涘濯掍綋鏁版嵁鍦ㄥ鎴鋒満涓婃挱鏀炬椂錛屾枃浠剁殑鍓╀綑閮ㄥ垎灝嗙戶緇粠嫻佸獟浣撴湇鍔″櫒涓嬭澆銆?/span>
嫻侊紙Streaming錛夋槸榪戝勾鍦?span>Internet涓婂嚭鐜扮殑鏂版蹇碉紝鍏跺畾涔夐潪甯稿箍娉涳紝涓昏鏄寚閫氳繃緗戠粶浼犺緭澶氬獟浣撴暟鎹殑鎶鏈葷О銆傛祦濯掍綋鍖呭惈騫夸箟鍜岀嫮涔変袱縐嶅唴娑碉細(xì)騫夸箟涓婄殑嫻佸獟浣撴寚鐨勬槸浣塊煶棰戝拰瑙嗛褰㈡垚紼沖畾鍜岃繛緇殑浼犺緭嫻佸拰鍥炴斁嫻佺殑涓緋誨垪鎶鏈佹柟娉曞拰鍗忚鐨勬葷О錛屽嵆嫻佸獟浣撴妧鏈紱鐙箟涓婄殑嫻佸獟浣撴槸鐩稿浜庝紶緇熺殑涓嬭澆-鍥炴斁鏂瑰紡鑰岃█鐨勶紝鎸囩殑鏄竴縐嶄粠Internet涓婅幏鍙栭煶棰戝拰瑙嗛絳夊濯掍綋鏁版嵁鐨勬柊鏂規(guī)硶錛屽畠鑳藉鏀寔澶氬獟浣撴暟鎹祦鐨勫疄鏃朵紶杈撳拰瀹炴椂鎾斁銆傞氳繃榪愮敤嫻佸獟浣撴妧鏈紝鏈嶅姟鍣ㄨ兘澶熷悜瀹㈡埛鏈哄彂閫佺ǔ瀹氬拰榪炵畫鐨勫濯掍綋鏁版嵁嫻侊紝瀹㈡埛鏈哄湪鎺ユ敹鏁版嵁鐨勫悓鏃朵互涓涓ǔ瀹氱殑閫熺巼鍥炴斁錛岃屼笉鐢ㄧ瓑鏁版嵁鍏ㄩ儴涓嬭澆瀹屼箣鍚庡啀榪涜鍥炴斁銆?/span>
鐢變簬鍙楃綉緇滃甫瀹姐佽綆楁満澶勭悊鑳藉姏鍜屽崗璁鑼冪瓑鏂歸潰鐨勯檺鍒訛紝瑕佹兂浠?span>Internet涓婁笅杞藉ぇ閲忕殑闊抽鍜岃棰戞暟鎹紝鏃犺浠庝笅杞芥椂闂村拰瀛樺偍絀洪棿涓婃潵璁查兘鏄笉澶幇瀹炵殑錛岃屾祦濯掍綋鎶鏈殑鍑虹幇鍒欏緢濂藉湴瑙e喅浜嗚繖涓闅鵑銆傜洰鍓嶅疄鐜版祦濯掍綋浼犺緭涓昏鏈変袱縐嶆柟娉曪細(xì)欏哄簭嫻侊紙progressive streaming錛変紶杈撳拰瀹炴椂嫻侊紙realtime streaming錛変紶杈擄紝瀹冧滑鍒嗗埆閫傚悎浜庝笉鍚岀殑搴旂敤鍦哄悎銆?/span>
欏哄簭嫻佷紶杈?/span>
欏哄簭嫻佷紶杈撻噰鐢ㄩ『搴忎笅杞界殑鏂瑰紡榪涜浼犺緭錛屽湪涓嬭澆鐨勫悓鏃剁敤鎴峰彲浠ュ湪綰垮洖鏀懼濯掍綋鏁版嵁錛屼絾緇欏畾鏃跺埢鍙兘瑙傜湅宸茬粡涓嬭澆鐨勯儴鍒嗭紝涓嶈兘璺沖埌灝氭湭涓嬭澆鐨勯儴鍒嗭紝涔熶笉鑳藉湪浼犺緭鏈熼棿鏍規(guī)嵁緗戠粶鐘跺喌瀵逛笅杞介熷害榪涜璋冩暣銆傜敱浜庢爣鍑嗙殑HTTP鏈嶅姟鍣ㄥ氨鍙互鍙戦佽繖縐嶅艦寮忕殑嫻佸獟浣擄紝鑰屼笉闇瑕佸叾浠栫壒孌婂崗璁殑鏀寔錛屽洜姝や篃甯稿父琚О浣?span>HTTP 嫻佸紡浼犺緭銆傞『搴忔祦寮忎紶杈撴瘮杈冮傚悎浜庨珮璐ㄩ噺鐨勫濯掍綋鐗囨錛屽鐗囧ご銆佺墖灝炬垨鑰呭箍鍛婄瓑銆?/span>
瀹炴椂嫻佷紶杈?/span>
瀹炴椂嫻佸紡浼犺緭淇濊瘉濯掍綋淇″彿甯﹀鑳藉涓庡綋鍓嶇綉緇滅姸鍐電浉鍖歸厤錛屼粠鑰屼嬌寰楁祦濯掍綋鏁版嵁鎬繪槸琚疄鏃跺湴浼犻侊紝鍥犳鐗瑰埆閫傚悎浜庣幇鍦轟簨浠躲傚疄鏃舵祦浼犺緭鏀寔闅忔満璁塊棶錛屽嵆鐢ㄦ埛鍙互閫氳繃蹇繘鎴栬呭悗閫鎿嶄綔鏉ヨ鐪嬪墠闈㈡垨鑰呭悗闈㈢殑鍐呭銆備粠鐞嗚涓婅錛屽疄鏃舵祦濯掍綋涓緇忔挱鏀懼氨涓嶄細(xì)鍋滈】錛屼絾浜嬪疄涓婁粛鏈夊彲鑳藉彂鐢熷懆鏈熸х殑鏆傚仠鐜拌薄錛屽挨鍏舵槸鍦ㄧ綉緇滅姸鍐墊伓鍖栨椂鏇存槸濡傛銆備笌欏哄簭嫻佷紶杈撲笉鍚岀殑鏄紝瀹炴椂嫻佷紶杈撻渶瑕佺敤鍒扮壒瀹氱殑嫻佸獟浣撴湇鍔″櫒錛岃屼笖榪橀渶瑕佺壒瀹氱綉緇滃崗璁殑鏀寔銆?/span>
浜屻佹祦濯掍綋鍗忚
瀹炴椂浼犺緭鍗忚錛?span>Real-time Transport Protocol錛?span>PRT錛夋槸鍦?span>Internet涓婂鐞嗗濯掍綋鏁版嵁嫻佺殑涓縐嶇綉緇滃崗璁紝鍒╃敤瀹冭兘澶熷湪涓瀵逛竴錛?span>unicast錛屽崟鎾級鎴栬呬竴瀵瑰錛?span>multicast錛屽鎾級鐨勭綉緇滅幆澧冧腑瀹炵幇浼犳祦濯掍綋鏁版嵁鐨勫疄鏃朵紶杈撱?span>RTP閫氬父浣跨敤UDP鏉ヨ繘琛屽濯掍綋鏁版嵁鐨勪紶杈擄紝浣嗗鏋滈渶瑕佺殑璇濆彲浠ヤ嬌鐢?span>TCP鎴栬?span> ATM絳夊叾瀹冨崗璁紝鏁翠釜RTP鍗忚鐢變袱涓瘑鍒囩浉鍏崇殑閮ㄥ垎緇勬垚錛?span>RTP鏁版嵁鍗忚鍜?span>RTP鎺у埗鍗忚銆傚疄鏃舵祦鍗忚錛?span>Real Time Streaming Protocol錛?span>RTSP錛夋渶鏃╃敱Real Networks鍜?span>Netscape鍏徃鍏卞悓鎻愬嚭錛屽畠浣嶄簬RTP鍜?span>RTCP涔嬩笂錛屽叾鐩殑鏄笇鏈涢氳繃IP緗戠粶鏈夋晥鍦頒紶杈撳濯掍綋鏁版嵁銆?/span>
2.1 RTP鏁版嵁鍗忚
RTP鏁版嵁鍗忚璐熻矗瀵規(guī)祦濯掍綋鏁版嵁榪涜灝佸寘騫跺疄鐜板獟浣撴祦鐨勫疄鏃朵紶杈擄紝姣忎竴涓?span>RTP鏁版嵁鎶ラ兘鐢卞ご閮紙Header錛夊拰璐熻澆錛?span>Payload錛変袱涓儴鍒嗙粍鎴愶紝鍏朵腑澶撮儴鍓?span>12涓瓧鑺傜殑鍚箟鏄浐瀹氱殑錛岃岃礋杞藉垯鍙互鏄煶棰戞垨鑰呰棰戞暟鎹?span>RTP鏁版嵁鎶ョ殑澶撮儴鏍煎紡濡傚浘1鎵紺猴細(xì)

鍏朵腑姣旇緝閲嶈鐨勫嚑涓煙鍙?qiáng)鍏舵剰涔夊涓嬪Q?nbsp;
浠?span>RTP 鏁版嵁鎶ョ殑鏍煎紡涓嶉毦鐪嬪嚭錛屽畠鍖呭惈浜嗕紶杈撳獟浣撶殑綾誨瀷銆佹牸寮忋佸簭鍒楀彿銆佹椂闂存埑浠ュ強(qiáng)鏄惁鏈夐檮鍔犳暟鎹瓑淇℃伅錛岃繖浜涢兘涓哄疄鏃剁殑嫻佸獟浣撲紶杈撴彁渚涗簡鐩稿簲鐨勫熀紜銆?span>RTP鍗忚鐨勭洰鐨勬槸鎻愪緵瀹炴椂鏁版嵁錛堝浜や簰寮忕殑闊抽鍜岃棰戯級鐨勭鍒扮浼犺緭鏈嶅姟錛屽洜姝ゅ湪RTP涓病鏈夎繛鎺ョ殑姒傚康錛屽畠鍙互寤虹珛鍦ㄥ簳灞傜殑闈㈠悜榪炴帴鎴栭潰鍚戦潪榪炴帴鐨勪紶杈撳崗璁箣涓婏紱RTP涔熶笉渚濊禆浜庣壒鍒殑緗戠粶鍦板潃鏍煎紡錛岃屼粎浠呭彧闇瑕佸簳灞備紶杈撳崗璁敮鎸佺粍甯э紙Framing錛夊拰鍒嗘錛?span>Segmentation錛夊氨瓚沖浜嗭紱鍙﹀RTP 鏈韓榪樹笉鎻愪緵浠諱綍鍙潬鎬ф満鍒訛紝榪欎簺閮借鐢變紶杈撳崗璁垨鑰呭簲鐢ㄧ▼搴忚嚜宸辨潵淇濊瘉銆傚湪鍏稿瀷鐨勫簲鐢ㄥ満鍚堜笅錛?span>RTP 涓鑸槸鍦ㄤ紶杈撳崗璁箣涓婁綔涓哄簲鐢ㄧ▼搴忕殑涓閮ㄥ垎鍔犱互瀹炵幇鐨勶紝濡傚浘2鎵紺猴細(xì)
2.2 RTCP鎺у埗鍗忚
RTCP 鎺у埗鍗忚闇瑕佷笌RTP鏁版嵁鍗忚涓璧烽厤鍚堜嬌鐢紝褰撳簲鐢ㄧ▼搴忓惎鍔ㄤ竴涓?span>RTP浼?xì)璇濇椂灏嗗悓鏃跺崰鐢ㄤ袱涓鍙eQ屽垎鍒緵RTP 鍜?span>RTCP浣跨敤銆?span>RTP鏈韓騫朵笉鑳戒負(fù)鎸夊簭浼犺緭鏁版嵁鍖呮彁渚涘彲闈犵殑淇濊瘉錛屼篃涓嶆彁渚涙祦閲忔帶鍒跺拰鎷ュ鎺у埗錛岃繖浜涢兘鐢?span>RTCP鏉ヨ礋璐e畬鎴愩傞氬父RTCP浼?xì)閲囩敤涓?span> RTP鐩稿悓鐨勫垎鍙戞満鍒訛紝鍚戜細(xì)璇濅腑鐨勬墍鏈夋垚鍛樺懆鏈熸у湴鍙戦佹帶鍒朵俊鎭紝搴旂敤紼嬪簭閫氳繃鎺ユ敹榪欎簺鏁版嵁錛屼粠涓幏鍙栦細(xì)璇濆弬涓庤呯殑鐩稿叧璧勬枡錛屼互鍙?qiáng)缃懢l滅姸鍐點(diǎn)佸垎緇勪涪澶辨鐜囩瓑鍙嶉淇℃伅錛屼粠鑰岃兘澶熷鏈嶅姟璐ㄩ噺榪涜鎺у埗鎴栬呭緗戠粶鐘跺喌榪涜璇婃柇銆?/span>
RTCP鍗忚鐨勫姛鑳芥槸閫氳繃涓嶅悓鐨?span>RTCP鏁版嵁鎶ユ潵瀹炵幇鐨勶紝涓昏鏈夊涓嬪嚑縐嶇被鍨嬶細(xì)
RTCP鏁版嵁鎶ユ惡甯︽湁鏈嶅姟璐ㄩ噺鐩戞帶鐨勫繀瑕佷俊鎭紝鑳藉瀵規(guī)湇鍔¤川閲忚繘琛屽姩鎬佺殑璋冩暣錛屽茍鑳藉瀵圭綉緇滄嫢濉炶繘琛屾湁鏁堢殑鎺у埗銆傜敱浜?span>RTCP鏁版嵁鎶ラ噰鐢ㄧ殑鏄鎾柟寮忥紝鍥犳浼?xì)璇濅腑鐨勬墍鏈夋垚鍛橀兘鍙互閫氳繃RTCP鏁版嵁鎶ヨ繑鍥炵殑鎺у埗淇℃伅錛屾潵浜嗚В鍏朵粬鍙備笌鑰呯殑褰撳墠鎯呭喌銆?/span>
鍦ㄤ竴涓吀鍨嬬殑搴旂敤鍦哄悎涓嬶紝鍙戦佸獟浣撴祦鐨勫簲鐢ㄧ▼搴忓皢鍛ㄦ湡鎬у湴浜х敓鍙戦佺鎶ュ憡SR錛岃RTCP鏁版嵁鎶ュ惈鏈変笉鍚屽獟浣撴祦闂寸殑鍚屾淇℃伅錛屼互鍙?qiáng)宸簿l忓彂閫佺殑鏁版嵁鎶ュ拰瀛楄妭鐨勮鏁幫紝鎺ユ敹绔牴鎹繖浜涗俊鎭彲浠ヤ及璁″嚭瀹為檯鐨勬暟鎹紶杈撻熺巼銆傚彟涓鏂歸潰錛屾帴鏀剁浼?xì)鍚戞墍鏈夊凡鐭ョ殑鍙戦佺鍙戦佹帴鏀剁鎶ュ憡RR錛岃RTCP鏁版嵁鎶ュ惈鏈夊凡鎺ユ敹鏁版嵁鎶ョ殑鏈澶у簭鍒楀彿銆佷涪澶辯殑鏁版嵁鎶ユ暟鐩佸歡鏃舵姈鍔ㄥ拰鏃墮棿鎴崇瓑閲嶈淇℃伅錛屽彂閫佺搴旂敤鏍規(guī)嵁榪欎簺淇℃伅鍙互浼拌鍑哄線榪旀椂寤訛紝騫朵笖鍙互鏍規(guī)嵁鏁版嵁鎶ヤ涪澶辨鐜囧拰鏃跺歡鎶栧姩鎯呭喌鍔ㄦ佽皟鏁村彂閫侀熺巼錛屼互鏀瑰杽緗戠粶鎷ュ鐘跺喌錛屾垨鑰呮牴鎹綉緇滅姸鍐靛鉤婊戝湴璋冩暣搴旂敤紼嬪簭鐨勬湇鍔¤川閲忋?/span>
2.3 RTSP瀹炴椂嫻佸崗璁?/span>
浣滀負(fù)涓涓簲鐢ㄥ眰鍗忚錛?span>RTSP鎻愪緵浜嗕竴涓彲渚涙墿灞曠殑妗嗘灦錛屽畠鐨勬剰涔夊湪浜庝嬌寰楀疄鏃舵祦濯掍綋鏁版嵁鐨勫彈鎺у拰鐐規(guī)挱鍙樺緱鍙兘銆傛葷殑璇存潵錛?span>RTSP鏄竴涓祦濯掍綋琛ㄧず鍗忚錛屼富瑕佺敤鏉ユ帶鍒跺叿鏈夊疄鏃剁壒鎬х殑鏁版嵁鍙戦侊紝浣嗗畠鏈韓騫朵笉浼犺緭鏁版嵁錛岃屾槸蹇呴』渚濊禆浜庝笅灞備紶杈撳崗璁墍鎻愪緵鐨勬煇浜涙湇鍔°?span>RTSP 鍙互瀵規(guī)祦濯掍綋鎻愪緵璇稿鎾斁銆佹殏鍋溿佸揩榪涚瓑鎿嶄綔錛屽畠璐熻矗瀹氫箟鍏蜂綋鐨勬帶鍒舵秷鎭佹搷浣滄柟娉曘佺姸鎬佺爜絳夛紝姝ゅ榪樻弿榪頒簡涓?span>RTP闂寸殑浜や簰鎿嶄綔銆?/span>
RTSP 鍦ㄥ埗瀹氭椂杈冨鍦板弬鑰冧簡HTTP/1.1鍗忚錛岀敋鑷寵澶氭弿榪頒笌HTTP/1.1瀹屽叏鐩稿悓銆?span>RTSP涔嬫墍浠ョ壒鎰忎嬌鐢ㄤ笌HTTP/1.1綾諱技鐨勮娉曞拰鎿嶄綔錛屽湪寰堝ぇ紼嬪害涓婃槸涓轟簡鍏煎鐜版湁鐨?span>Web鍩虹緇撴瀯錛屾鍥犲姝わ紝HTTP/1.1鐨勬墿灞曟満鍒跺ぇ閮藉彲浠ョ洿鎺ュ紩鍏ュ埌RTSP 涓?/span>
鐢?span>RTSP 鎺у埗鐨勫獟浣撴祦闆嗗悎鍙互鐢ㄨ〃紺烘弿榪幫紙Presentation Description錛夋潵瀹氫箟錛屾墍璋撹〃紺烘槸鎸囨祦濯掍綋鏈嶅姟鍣ㄦ彁渚涚粰瀹㈡埛鏈虹殑涓涓垨鑰呭涓獟浣撴祦鐨勯泦鍚堬紝鑰岃〃紺烘弿榪板垯鍖呭惈浜嗕竴涓〃紺轟腑鍚勪釜濯掍綋嫻佺殑鐩稿叧淇℃伅錛屽鏁版嵁緙栫爜/瑙g爜綆楁硶銆佺綉緇滃湴鍧銆佸獟浣撴祦鐨勫唴瀹圭瓑銆?/span>
铏界劧RTSP鏈嶅姟鍣ㄥ悓鏍蜂篃浣跨敤鏍囪瘑絎︽潵鍖哄埆姣忎竴嫻佽繛鎺ヤ細(xì)璇濓紙Session錛夛紝浣?span>RTSP榪炴帴騫舵病鏈夎緇戝畾鍒頒紶杈撳眰榪炴帴錛堝TCP絳夛級錛屼篃灝辨槸璇村湪鏁翠釜 RTSP榪炴帴鏈熼棿錛?span>RTSP鐢ㄦ埛鍙墦寮鎴栬呭叧闂涓RTSP鏈嶅姟鍣ㄧ殑鍙潬浼犺緭榪炴帴浠ュ彂鍑?span>RTSP 璇鋒眰銆傛澶栵紝RTSP榪炴帴涔熷彲浠ュ熀浜庨潰鍚戞棤榪炴帴鐨勪紶杈撳崗璁紙濡?span>UDP絳夛級銆?/span>
RTSP鍗忚鐩墠鏀寔浠ヤ笅鎿嶄綔錛?nbsp;
涓夈佹祦濯掍綋緙栫▼
RTP 鏄洰鍓嶈В鍐蟲祦濯掍綋瀹炴椂浼犺緭闂鐨勬渶濂藉姙娉曪紝濡傛灉闇瑕佸湪Linux騫沖彴涓婅繘琛屽疄鏃舵祦濯掍綋緙栫▼錛屽彲浠ヨ冭檻浣跨敤涓浜涘紑鏀炬簮浠g爜鐨?span>RTP搴擄紝濡?span>LIBRTP銆?span> JRTPLIB絳夈?span>JRTPLIB鏄竴涓潰鍚戝璞$殑RTP搴擄紝瀹冨畬鍏ㄩ伒寰?span>RFC 1889璁捐錛屽湪寰堝鍦哄悎涓嬫槸涓涓潪甯鎬笉閿欑殑閫夋嫨錛屼笅闈㈠氨浠?span>JRTPLIB涓轟緥錛岃榪板浣曞湪Linux騫沖彴涓婅繍鐢?span>RTP鍗忚榪涜瀹炴椂嫻佸獟浣撶紪紼嬨?/span>
3.1 鐜鎼緩
JRTPLIB 鏄竴涓敤C++璇█瀹炵幇鐨?span>RTP搴擄紝鐩墠宸茬粡鍙互榪愯鍦?span>Windows銆?span>Linux銆?span>FreeBSD銆?span> Solaris銆?span>Unix鍜?span>VxWorks絳夊縐嶆搷浣滅郴緇熶笂銆傝涓?span>Linux 緋葷粺瀹夎JRTPLIB錛岄鍏堜粠JRTPLIB鐨勭綉绔欙紙http: //lumumba.luc.ac.be/jori/jrtplib/jrtplib.html錛変笅杞芥渶鏂扮殑婧愮爜鍖咃紝姝ゅ浣跨敤鐨勬槸jrtplib- 2.7b.tar.bz2銆傚亣璁句笅杞藉悗鐨勬簮鐮佸寘淇濆瓨鍦?span>/usr/local/src鐩綍涓嬶紝鎵ц涓嬮潰鐨勫懡浠ゅ彲浠ュ鍏惰繘琛岃В鍘嬬緝錛?/span>
|
|
鏃犺閭g鎿嶄綔鏂瑰紡錛屼竴鑸兘閫氳繃鍥涗釜姝ラ鏉ュ畬鎴愶細(xì)
錛?span>1錛?鎵撳紑涓插彛
Win32緋葷粺鎶婃枃浠剁殑姒傚康榪涜浜嗘墿灞曘傛棤璁烘槸鏂囦歡銆侀氫俊璁懼銆佸懡鍚嶇閬撱侀偖浠舵Ы銆佺鐩樸佽繕鏄帶鍒跺彴錛岄兘鏄敤API鍑芥暟CreateFile鏉ユ墦寮鎴栧垱寤虹殑銆傝鍑芥暟鐨勫師鍨嬩負(fù)錛?/span>
HANDLE CreateFile( LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
· lpFileName錛氬皢瑕佹墦寮鐨勪覆鍙i昏緫鍚嶏紝濡?span>“COM
· dwDesiredAccess錛氭寚瀹氫覆鍙h闂殑綾誨瀷錛屽彲浠ユ槸璇誨彇銆佸啓鍏ユ垨浜岃呭茍鍒楋紱
· dwShareMode錛氭寚瀹氬叡浜睘鎬э紝鐢變簬涓插彛涓嶈兘鍏變韓錛岃鍙傛暟蹇呴』緗負(fù)0錛?/span>
· lpSecurityAttributes錛氬紩鐢ㄥ畨鍏ㄦу睘鎬х粨鏋勶紝緙虹渷鍊間負(fù)NULL錛?/span>
· dwCreationDistribution錛氬垱寤烘爣蹇楋紝瀵逛覆鍙f搷浣滆鍙傛暟蹇呴』緗負(fù)OPEN_EXISTING錛?/span>
· dwFlagsAndAttributes錛氬睘鎬ф弿榪幫紝鐢ㄤ簬鎸囧畾璇ヤ覆鍙f槸鍚﹁繘琛屽紓姝ユ搷浣滐紝璇ュ間負(fù)FILE_FLAG_OVERLAPPED錛岃〃紺轟嬌鐢ㄥ紓姝ョ殑I/O錛涜鍊間負(fù)0錛岃〃紺哄悓姝?span>I/O鎿嶄綔錛?/span>
· hTemplateFile錛氬涓插彛鑰岃█璇ュ弬鏁板繀欏葷疆涓?span>NULL錛?/span>
鍚屾I/O鏂瑰紡鎵撳紑涓插彛鐨勭ず渚嬩唬鐮侊細(xì)
HANDLE hCom; //鍏ㄥ眬鍙橀噺錛屼覆鍙e彞鏌?br>hCom=CreateFile("COM1",//COM1鍙?span>
GENERIC_READ|GENERIC_WRITE, //鍏佽璇誨拰鍐?span>
0, //鐙崰鏂瑰紡
NULL,
OPEN_EXISTING, //鎵撳紑鑰屼笉鏄垱寤?span>
0, //鍚屾鏂瑰紡
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox("鎵撳紑COM澶辮觸!");
return FALSE;
}
return TRUE;
閲嶅彔I/O鎵撳紑涓插彛鐨勭ず渚嬩唬鐮侊細(xì)
HANDLE hCom; //鍏ㄥ眬鍙橀噺錛屼覆鍙e彞鏌?span>
hCom =CreateFile("COM1", //COM1鍙?span>
GENERIC_READ|GENERIC_WRITE, //鍏佽璇誨拰鍐?span>
0, //鐙崰鏂瑰紡
NULL,
OPEN_EXISTING, //鎵撳紑鑰屼笉鏄垱寤?span>
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //閲嶅彔鏂瑰紡
NULL);
if(hCom ==INVALID_HANDLE_VALUE)
{
AfxMessageBox("鎵撳紑COM澶辮觸!");
return FALSE;
}
return TRUE;
錛?span>2錛夈?a name=閰嶇疆涓插彛>閰嶇疆涓插彛
鍦ㄦ墦寮閫氳璁懼鍙ユ焺鍚庯紝甯稿父闇瑕佸涓插彛榪涜涓浜涘垵濮嬪寲閰嶇疆宸ヤ綔銆傝繖闇瑕侀氳繃涓涓?span>DCB緇撴瀯鏉ヨ繘琛屻?span>DCB緇撴瀯鍖呭惈浜嗚濡傛嘗鐗圭巼銆佹暟鎹綅鏁般佸鍋舵牎楠屽拰鍋滄浣嶆暟絳変俊鎭傚湪鏌ヨ鎴栭厤緗覆鍙g殑灞炴ф椂錛岄兘瑕佺敤DCB緇撴瀯鏉ヤ綔涓虹紦鍐插尯銆?span>
銆銆涓鑸敤CreateFile鎵撳紑涓插彛鍚庯紝鍙互璋冪敤GetCommState鍑芥暟鏉ヨ幏鍙栦覆鍙g殑鍒濆閰嶇疆銆傝淇敼涓插彛鐨勯厤緗紝搴旇鍏堜慨鏀?span>DCB緇撴瀯錛岀劧鍚庡啀璋冪敤SetCommState鍑芥暟璁劇疆涓插彛銆?span>
銆銆DCB緇撴瀯鍖呭惈浜嗕覆鍙g殑鍚勯」鍙傛暟璁劇疆錛屼笅闈粎浠嬬粛鍑犱釜璇ョ粨鏋勫父鐢ㄧ殑鍙橀噺錛?/span>
typedef struct _DCB{
……… //娉㈢壒鐜囷紝鎸囧畾閫氫俊璁懼鐨勪紶杈撻熺巼銆傝繖涓垚鍛樺彲浠ユ槸瀹為檯娉㈢壒鐜囧兼垨鑰呬笅闈㈢殑甯擱噺鍊間箣涓錛?br> DWORD BaudRate;
CBR_110錛?br>CBR_300錛?br>CBR_600錛?br>CBR_1200錛?br>CBR_2400錛?span>
CBR_4800錛?br>CBR_9600錛?br>CBR_19200錛?br>CBR_38400錛?br>CBR_56000錛?br>CBR_57600錛?span>
CBR_115200錛?span>
CBR_128000錛?span>
CBR_256000錛?span>
CBR_14400DWORD fParity; // 鎸囧畾濂囧伓鏍¢獙浣胯兘銆傝嫢姝ゆ垚鍛樹負(fù)1錛屽厑璁稿鍋舵牎楠屾鏌?span>
…BYTE ByteSize; // 閫氫俊瀛楄妭浣嶆暟錛?span>4鈥?BYTE
Parity; //鎸囧畾濂囧伓鏍¢獙鏂規(guī)硶銆傛鎴愬憳鍙互鏈変笅鍒楀鹼細(xì)EVENPARITY 鍋舵牎楠?span> NOPARITY 鏃犳牎楠?span>MARKPARITY 鏍囪鏍¢獙 ODDPARITY 濂囨牎楠?span>BYTE
StopBits; //鎸囧畾鍋滄浣嶇殑浣嶆暟銆?br>姝ゆ垚鍛樺彲浠ユ湁涓嬪垪鍊鹼細(xì)
ONESTOPBIT 1浣嶅仠姝綅
TWOSTOPBITS 2浣嶅仠姝綅
ONE5STOPBITS 1.5浣嶅仠姝綅 ……… } DCB;
winbase.h鏂囦歡涓畾涔変簡浠ヤ笂鐢ㄥ埌鐨勫父閲忋?br>濡備笅錛?br>#define NOPARITY 0
#define ODDPARITY 1
#define EVENPARITY 2
#define ONESTOPBIT 0
#define ONE5STOPBITS 1
#define TWOSTOPBITS 2
#define CBR_110 110
#define CBR_300 300
#define CBR_600 600
#define CBR_1200 1200
#define CBR_2400 2400
#define CBR_4800 4800
#define CBR_9600 9600
#define CBR_14400 14400
#define CBR_19200 19200
#define CBR_38400 38400
#define CBR_56000 56000
#define CBR_57600 57600
#define CBR_115200 115200
#define CBR_128000 128000
#define CBR_256000 256000
GetCommState鍑芥暟鍙互鑾峰緱COM鍙g殑璁懼鎺у埗鍧楋紝浠庤岃幏寰楃浉鍏沖弬鏁幫細(xì)
BOOL GetCommState( HANDLE hFile, //鏍囪瘑閫氳绔彛鐨勫彞鏌?span>
LPDCB lpDCB //鎸囧悜涓涓澶囨帶鍒跺潡錛?span>DCB緇撴瀯錛夌殑鎸囬拡 );
SetCommState鍑芥暟璁劇疆COM鍙g殑璁懼鎺у埗鍧楋細(xì)
BOOL SetCommState( HANDLE hFile, LPDCB lpDCB );
闄や簡鍦?span>BCD涓殑璁劇疆澶栵紝紼嬪簭涓鑸繕闇瑕佽緗?span>I/O緙撳啿鍖虹殑澶у皬鍜岃秴鏃躲?span>Windows鐢?span>I/O緙撳啿鍖烘潵鏆傚瓨涓插彛杈撳叆鍜岃緭鍑虹殑鏁版嵁銆傚鏋滈氫俊鐨勯熺巼杈冮珮錛屽垯搴旇璁劇疆杈冨ぇ鐨勭紦鍐插尯銆傝皟鐢?span>SetupComm鍑芥暟鍙互璁劇疆涓茶鍙g殑杈撳叆鍜岃緭鍑虹紦鍐插尯鐨勫ぇ灝忋?/span>
BOOL SetupComm( HANDLE hFile, // 閫氫俊璁懼鐨勫彞鏌?span>
DWORD dwInQueue, // 杈撳叆緙撳啿鍖虹殑澶у皬錛堝瓧鑺傛暟錛?span>
DWORD dwOutQueue // 杈撳嚭緙撳啿鍖虹殑澶у皬錛堝瓧鑺傛暟錛?span> );
鍦ㄧ敤ReadFile鍜?span>WriteFile璇誨啓涓茶鍙f椂錛岄渶瑕佽冭檻瓚呮椂闂銆傝秴鏃剁殑浣滅敤鏄湪鎸囧畾鐨勬椂闂村唴娌℃湁璇誨叆鎴栧彂閫佹寚瀹氭暟閲忕殑瀛楃錛?span>ReadFile鎴?span>WriteFile鐨勬搷浣滀粛鐒朵細(xì)緇撴潫銆?span>
銆銆瑕佹煡璇㈠綋鍓嶇殑瓚呮椂璁劇疆搴旇皟鐢?span>GetCommTimeouts鍑芥暟錛岃鍑芥暟浼?xì)濉厖涓涓?span>COMMTIMEOUTS緇撴瀯銆傝皟鐢?span>SetCommTimeouts鍙互鐢ㄦ煇涓涓?span>COMMTIMEOUTS緇撴瀯鐨勫唴瀹規(guī)潵璁劇疆瓚呮椂銆?span>
銆銆璇誨啓涓插彛鐨勮秴鏃舵湁涓ょ錛氶棿闅旇秴鏃跺拰鎬昏秴鏃躲傞棿闅旇秴鏃舵槸鎸囧湪鎺ユ敹鏃朵袱涓瓧絎︿箣闂寸殑鏈澶ф椂寤躲傛昏秴鏃舵槸鎸囪鍐欐搷浣滄誨叡鑺辮垂鐨勬渶澶ф椂闂淬傚啓鎿嶄綔鍙敮鎸佹昏秴鏃訛紝鑰岃鎿嶄綔涓ょ瓚呮椂鍧囨敮鎸併傜敤COMMTIMEOUTS緇撴瀯鍙互瑙勫畾璇誨啓鎿嶄綔鐨勮秴鏃躲?span>
COMMTIMEOUTS緇撴瀯鐨勫畾涔変負(fù)錛?/span>
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout; //璇婚棿闅旇秴鏃?span>
DWORD ReadTotalTimeoutMultiplier; //璇繪椂闂寸郴鏁?span>
DWORD ReadTotalTimeoutConstant; //璇繪椂闂村父閲?span>
DWORD WriteTotalTimeoutMultiplier; // 鍐欐椂闂寸郴鏁?span>
DWORD WriteTotalTimeoutConstant; //鍐欐椂闂村父閲?span>
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
COMMTIMEOUTS緇撴瀯鐨勬垚鍛橀兘浠ユ縐掍負(fù)鍗曚綅銆傛昏秴鏃剁殑璁$畻鍏紡鏄細(xì)
鎬昏秴鏃訛紳鏃墮棿緋繪暟×瑕佹眰璇?span>/鍐欑殑瀛楃鏁幫紜鏃墮棿甯擱噺
渚嬪錛岃璇誨叆10涓瓧絎︼紝閭d箞璇繪搷浣滅殑鎬昏秴鏃剁殑璁$畻鍏紡涓猴細(xì)
璇繪昏秴鏃訛紳ReadTotalTimeoutMultiplier×10錛?span>ReadTotalTimeoutConstant
鍙互鐪嬪嚭錛氶棿闅旇秴鏃跺拰鎬昏秴鏃剁殑璁劇疆鏄笉鐩稿叧鐨勶紝榪欏彲浠ユ柟渚塊氫俊紼嬪簭鐏墊椿鍦拌緗悇縐嶈秴鏃躲?span>
濡傛灉鎵鏈夊啓瓚呮椂鍙傛暟鍧囦負(fù)0錛岄偅涔堝氨涓嶄嬌鐢ㄥ啓瓚呮椂銆傚鏋?span>ReadIntervalTimeout涓?span>0錛岄偅涔堝氨涓嶄嬌鐢ㄨ闂撮殧瓚呮椂銆傚鏋?span>ReadTotalTimeoutMultiplier 鍜?span> ReadTotalTimeoutConstant 閮戒負(fù)0錛屽垯涓嶄嬌鐢ㄨ鎬昏秴鏃躲傚鏋滆闂撮殧瓚呮椂琚緗垚MAXDWORD騫朵笖璇繪椂闂寸郴鏁板拰璇繪椂闂村父閲忛兘涓?span>0錛岄偅涔堝湪璇諱竴嬈¤緭鍏ョ紦鍐插尯鐨勫唴瀹瑰悗璇繪搷浣滃氨绔嬪嵆榪斿洖錛岃屼笉綆℃槸鍚﹁鍏ヤ簡瑕佹眰鐨勫瓧絎︺?span>
銆銆鍦ㄧ敤閲嶅彔鏂瑰紡璇誨啓涓插彛鏃訛紝铏界劧ReadFile鍜?span>WriteFile鍦ㄥ畬鎴愭搷浣滀互鍓嶅氨鍙兘榪斿洖錛屼絾瓚呮椂浠嶇劧鏄搗浣滅敤鐨勩傚湪榪欑鎯呭喌涓嬶紝瓚呮椂瑙勫畾鐨勬槸鎿嶄綔鐨勫畬鎴愭椂闂達(dá)紝鑰屼笉鏄?span>ReadFile鍜?span>WriteFile鐨勮繑鍥炴椂闂淬?span>
閰嶇疆涓插彛鐨勭ず渚嬩唬鐮侊細(xì)
SetupComm(hCom,1024,1024); //杈撳叆緙撳啿鍖哄拰杈撳嚭緙撳啿鍖虹殑澶у皬閮芥槸1024
COMMTIMEOUTS TimeOuts; //璁懼畾璇昏秴鏃?span>
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000; //璁懼畾鍐欒秴鏃?span> T
imeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(hCom,&TimeOuts); //璁劇疆瓚呮椂
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //娉㈢壒鐜囦負(fù)9600
dcb.ByteSize=8; //姣忎釜瀛楄妭鏈?span>8浣?span>
dcb.Parity=NOPARITY; //鏃犲鍋舵牎楠屼綅
dcb.StopBits=TWOSTOPBITS; //涓や釜鍋滄浣?span>
SetCommState(hCom,&dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
鍦ㄨ鍐欎覆鍙d箣鍓嶏紝榪樿鐢?span>PurgeComm()鍑芥暟娓呯┖緙撳啿鍖猴紝璇ュ嚱鏁板師鍨嬶細(xì)
BOOL PurgeComm( HANDLE hFile, //涓插彛鍙ユ焺
DWORD dwFlags // 闇瑕佸畬鎴愮殑鎿嶄綔
);
鍙傛暟dwFlags鎸囧畾瑕佸畬鎴愮殑鎿嶄綔錛屽彲浠ユ槸涓嬪垪鍊肩殑緇勫悎錛?/span>
PURGE_TXABORT 涓柇鎵鏈夊啓鎿嶄綔騫剁珛鍗寵繑鍥烇紝鍗充嬌鍐欐搷浣滆繕娌℃湁瀹屾垚銆?span>PURGE_RXABORT 涓柇鎵鏈夎鎿嶄綔騫剁珛鍗寵繑鍥烇紝鍗充嬌璇繪搷浣滆繕娌℃湁瀹屾垚銆?span>PURGE_TXCLEAR 娓呴櫎杈撳嚭緙撳啿鍖?span>PURGE_RXCLEAR 娓呴櫎杈撳叆緙撳啿鍖?/span>
錛?span>3錛夈?a name=璇誨啓涓插彛>璇誨啓涓插彛
鎴戜滑浣跨敤ReadFile鍜?span>WriteFile璇誨啓涓插彛錛屼笅闈㈡槸涓や釜鍑芥暟鐨勫0鏄庯細(xì)
BOOL ReadFile( HANDLE hFile, //涓插彛鐨勫彞鏌?span> // 璇誨叆鐨勬暟鎹瓨鍌ㄧ殑鍦板潃錛?span> // 鍗寵鍏ョ殑鏁版嵁灝嗗瓨鍌ㄥ湪浠ヨ鎸囬拡鐨勫間負(fù)棣栧湴鍧鐨勪竴鐗囧唴瀛樺尯
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead, // 瑕佽鍏ョ殑鏁版嵁鐨勫瓧鑺傛暟 // 鎸囧悜涓涓?span>DWORD鏁板鹼紝璇ユ暟鍊艱繑鍥炶鎿嶄綔瀹為檯璇誨叆鐨勫瓧鑺傛暟
LPDWORD lpNumberOfBytesRead, // 閲嶅彔鎿嶄綔鏃訛紝璇ュ弬鏁版寚鍚戜竴涓?span>OVERLAPPED緇撴瀯錛屽悓姝ユ搷浣滄椂錛岃鍙傛暟涓?span>NULL銆?span>
LPOVERLAPPED lpOverlapped );
BOOL WriteFile( HANDLE hFile, //涓插彛鐨勫彞鏌?span> // 鍗充互璇ユ寚閽堢殑鍊間負(fù)棣栧湴鍧鐨?span>nNumberOfBytesToWrite // 涓瓧鑺傜殑鏁版嵁灝嗚鍐欏叆涓插彛鐨勫彂閫佹暟鎹紦鍐插尯銆?span>
LPCVOID lpBuffer, // 鍐欏叆鐨勬暟鎹瓨鍌ㄧ殑鍦板潃錛?/span>
DWORD nNumberOfBytesToWrite, //瑕佸啓鍏ョ殑鏁版嵁鐨勫瓧鑺傛暟 // 鎸囧悜鎸囧悜涓涓?span>DWORD鏁板鹼紝璇ユ暟鍊艱繑鍥炲疄闄呭啓鍏ョ殑瀛楄妭鏁?span>
LPDWORD lpNumberOfBytesWritten, // 閲嶅彔鎿嶄綔鏃訛紝璇ュ弬鏁版寚鍚戜竴涓?span>OVERLAPPED緇撴瀯錛?span> // 鍚屾鎿嶄綔鏃訛紝璇ュ弬鏁頒負(fù)NULL銆?span>
LPOVERLAPPED lpOverlapped );
鍦ㄧ敤ReadFile鍜?span>WriteFile璇誨啓涓插彛鏃訛紝鏃㈠彲浠ュ悓姝ユ墽琛岋紝涔熷彲浠ラ噸鍙犳墽琛屻傚湪鍚屾鎵ц鏃訛紝鍑芥暟鐩村埌鎿嶄綔瀹屾垚鍚庢墠榪斿洖銆傝繖鎰忓懗鐫鍚屾鎵ц鏃剁嚎紼嬩細(xì)琚樆濉烇紝浠庤屽鑷存晥鐜囦笅闄嶃傚湪閲嶅彔鎵ц鏃訛紝鍗充嬌鎿嶄綔榪樻湭瀹屾垚錛岃繖涓や釜鍑芥暟涔熶細(xì)绔嬪嵆榪斿洖錛岃垂鏃剁殑I/O鎿嶄綔鍦ㄥ悗鍙拌繘琛屻?span>
銆銆ReadFile鍜?span>WriteFile鍑芥暟鏄悓姝ヨ繕鏄紓姝ョ敱CreateFile鍑芥暟鍐沖畾錛屽鏋滃湪璋冪敤CreateFile鍒涘緩鍙ユ焺鏃舵寚瀹氫簡FILE_FLAG_OVERLAPPED鏍囧織錛岄偅涔堣皟鐢?span>ReadFile鍜?span>WriteFile瀵硅鍙ユ焺榪涜鐨勬搷浣滃氨搴旇鏄噸鍙犵殑錛涘鏋滄湭鎸囧畾閲嶅彔鏍囧織錛屽垯璇誨啓鎿嶄綔搴旇鏄悓姝ョ殑銆?span>ReadFile鍜?span>WriteFile鍑芥暟鐨勫悓姝ユ垨鑰呭紓姝ュ簲璇ュ拰CreateFile鍑芥暟鐩鎬竴鑷淬?span>
銆銆ReadFile鍑芥暟鍙鍦ㄤ覆鍙h緭鍏ョ紦鍐插尯涓鍏ユ寚瀹氭暟閲忕殑瀛楃錛屽氨綆楀畬鎴愭搷浣溿傝?span>WriteFile鍑芥暟涓嶄絾瑕佹妸鎸囧畾鏁伴噺鐨勫瓧絎︽嫹鍏ュ埌杈撳嚭緙撳啿鍖猴紝鑰屼笖瑕佺瓑榪欎簺瀛楃浠庝覆琛屽彛閫佸嚭鍘誨悗鎵嶇畻瀹屾垚鎿嶄綔銆?span>
銆銆濡傛灉鎿嶄綔鎴愬姛錛岃繖涓や釜鍑芥暟閮借繑鍥?span>TRUE銆傞渶瑕佹敞鎰忕殑鏄紝褰?span>ReadFile鍜?span>WriteFile榪斿洖FALSE鏃訛紝涓嶄竴瀹氬氨鏄搷浣滃け璐ワ紝綰跨▼搴旇璋冪敤GetLastError鍑芥暟鍒嗘瀽榪斿洖鐨勭粨鏋溿備緥濡傦紝鍦ㄩ噸鍙犳搷浣滄椂濡傛灉鎿嶄綔榪樻湭瀹屾垚鍑芥暟灝辮繑鍥烇紝閭d箞鍑芥暟灝辮繑鍥?span>FALSE錛岃屼笖GetLastError鍑芥暟榪斿洖ERROR_IO_PENDING銆傝繖璇存槑閲嶅彔鎿嶄綔榪樻湭瀹屾垚銆?span>
鍚屾鏂瑰紡璇誨啓涓插彛姣旇緝綆鍗曪紝涓嬮潰鍏堜緥涓懼悓姝ユ柟寮忚鍐欎覆鍙g殑浠g爜錛?/span>
//鍚屾璇諱覆鍙?span>char str[100];
DWORD wCount;//璇誨彇鐨勫瓧鑺傛暟
BOOL bReadStat;
bReadStat=ReadFile(hCom,str,100,&wCount,NULL);
if(!bReadStat){
AfxMessageBox("璇諱覆鍙eけ璐?span>!");
return FALSE;
}
return TRUE;
//鍚屾鍐欎覆鍙?span>
char lpOutBuffer[100];
DWORD dwBytesWrite=100;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);
if(!bWriteStat) {
AfxMessageBox("鍐欎覆鍙eけ璐?span>!");
}
PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
鍦ㄩ噸鍙犳搷浣滄椂,鎿嶄綔榪樻湭瀹屾垚鍑芥暟灝辮繑鍥炪?span>
銆銆閲嶅彔I/O闈炲父鐏墊椿錛屽畠涔熷彲浠ュ疄鐜伴樆濉烇紙渚嬪鎴戜滑鍙互璁劇疆涓瀹氳璇誨彇鍒頒竴涓暟鎹墠鑳借繘琛屽埌涓嬩竴姝ユ搷浣滐級銆傛湁涓ょ鏂規(guī)硶鍙互絳夊緟鎿嶄綔瀹屾垚錛氫竴縐嶆柟娉曟槸鐢ㄨ薄WaitForSingleObject榪欐牱鐨勭瓑寰呭嚱鏁版潵絳夊緟OVERLAPPED緇撴瀯鐨?span>hEvent鎴愬憳錛涘彟涓縐嶆柟娉曟槸璋冪敤GetOverlappedResult鍑芥暟絳夊緟錛屽悗闈㈠皢婕旂ず璇存槑銆?span>
涓嬮潰鎴戜滑鍏堢畝鍗曡涓涓?span>OVERLAPPED緇撴瀯鍜?span>GetOverlappedResult鍑芥暟錛?span>
OVERLAPPED緇撴瀯
OVERLAPPED緇撴瀯鍖呭惈浜嗛噸鍙?span>I/O鐨勪竴浜涗俊鎭紝瀹氫箟濡備笅錛?/span>
typedef struct _OVERLAPPED { // o DWORD Internal; DWORD InternalHigh; DWORD Offset; DWORD OffsetHigh; HANDLE hEvent; } OVERLAPPED;
鍦ㄤ嬌鐢?span>ReadFile鍜?span>WriteFile閲嶅彔鎿嶄綔鏃訛紝綰跨▼闇瑕佸垱寤?span>OVERLAPPED緇撴瀯浠ヤ緵榪欎袱涓嚱鏁頒嬌鐢ㄣ傜嚎紼嬮氳繃OVERLAPPED緇撴瀯鑾峰緱褰撳墠鐨勬搷浣滅姸鎬侊紝璇ョ粨鏋勬渶閲嶈鐨勬垚鍛樻槸hEvent銆?span>hEvent鏄鍐欎簨浠躲傚綋涓插彛浣跨敤寮傛閫氳鏃訛紝鍑芥暟榪斿洖鏃舵搷浣滃彲鑳借繕娌℃湁瀹屾垚錛岀▼搴忓彲浠ラ氳繃媯(gè)鏌ヨ浜嬩歡寰楃煡鏄惁璇誨啓瀹屾瘯銆?span>
銆銆褰撹皟鐢?span>ReadFile, WriteFile 鍑芥暟鐨勬椂鍊欙紝璇ユ垚鍛樹細(xì)鑷姩琚疆涓烘棤淇″彿鐘舵侊紱褰撻噸鍙犳搷浣滃畬鎴愬悗錛岃鎴愬憳鍙橀噺浼?xì)鑷姩琚|負(fù)鏈変俊鍙風(fēng)姸鎬併?/span>
GetOverlappedResult鍑芥暟BOOL GetOverlappedResult( HANDLE hFile, // 涓插彛鐨勫彞鏌?span> // 鎸囧悜閲嶅彔鎿嶄綔寮濮嬫椂鎸囧畾鐨?span>OVERLAPPED緇撴瀯 LPOVERLAPPED lpOverlapped, // 鎸囧悜涓涓?span>32浣嶅彉閲忥紝璇ュ彉閲忕殑鍊艱繑鍥炲疄闄呰鍐欐搷浣滀紶杈撶殑瀛楄妭鏁般?span> LPDWORD lpNumberOfBytesTransferred, // 璇ュ弬鏁扮敤浜庢寚瀹氬嚱鏁版槸鍚︿竴鐩寸瓑鍒伴噸鍙犳搷浣滅粨鏉熴?span> // 濡傛灉璇ュ弬鏁頒負(fù)TRUE錛屽嚱鏁扮洿鍒版搷浣滅粨鏉熸墠榪斿洖銆?span> // 濡傛灉璇ュ弬鏁頒負(fù)FALSE錛屽嚱鏁扮洿鎺ヨ繑鍥烇紝榪欐椂濡傛灉鎿嶄綔娌℃湁瀹屾垚錛?span> // 閫氳繃璋冪敤GetLastError()鍑芥暟浼?xì)杩斿?span>ERROR_IO_INCOMPLETE銆?span> BOOL bWait );
璇ュ嚱鏁拌繑鍥為噸鍙犳搷浣滅殑緇撴灉錛岀敤鏉ュ垽鏂紓姝ユ搷浣滄槸鍚﹀畬鎴愶紝瀹冩槸閫氳繃鍒ゆ柇OVERLAPPED緇撴瀯涓殑hEvent鏄惁琚疆浣嶆潵瀹炵幇鐨勩?span>
寮傛璇諱覆鍙g殑紺轟緥浠g爜錛?/span>
char lpInBuffer[1024];
DWORD dwBytesRead=1024;
COMSTAT ComStat;
DWORD dwErrorFlags;
OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ClearCommError(hCom,&dwErrorFlags,&ComStat);
dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue);
if(!dwBytesRead)
return FALSE;
BOOL bReadStatus;
bReadStatus=ReadFile(hCom,
lpInBuffer,
dwBytesRead,
&dwBytesRead,
&m_osRead);
if(!bReadStatus) //濡傛灉ReadFile鍑芥暟榪斿洖FALSE
{
if(GetLastError()==ERROR_IO_PENDING) //GetLastError()鍑芥暟榪斿洖ERROR_IO_PENDING,琛ㄦ槑涓插彛姝e湪榪涜璇繪搷浣?span>
{
WaitForSingleObject(m_osRead.hEvent,2000); //浣跨敤WaitForSingleObject鍑芥暟絳夊緟錛岀洿鍒拌鎿嶄綔瀹屾垚鎴栧歡鏃跺凡杈懼埌2縐掗挓 //褰撲覆鍙h鎿嶄綔榪涜瀹屾瘯鍚庯紝m_osRead鐨?span>hEvent浜嬩歡浼?xì)鍙樹负鏈変俊鍙?span>
PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return dwBytesRead;
}
return 0;
}
PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return dwBytesRead;
瀵逛互涓婁唬鐮佸啀浣滅畝瑕佽鏄庯細(xì)鍦ㄤ嬌鐢?span>ReadFile 鍑芥暟榪涜璇繪搷浣滃墠錛屽簲鍏堜嬌鐢?span>ClearCommError鍑芥暟娓呴櫎閿欒銆?span>ClearCommError鍑芥暟鐨勫師鍨嬪涓嬶細(xì)
BOOL ClearCommError( HANDLE hFile, // 涓插彛鍙ユ焺
LPDWORD lpErrors, // 鎸囧悜鎺ユ敹閿欒鐮佺殑鍙橀噺
LPCOMSTAT lpStat // 鎸囧悜閫氳鐘舵佺紦鍐插尯
);
璇ュ嚱鏁拌幏寰楅氫俊閿欒騫舵姤鍛婁覆鍙g殑褰撳墠鐘舵侊紝鍚屾椂錛岃鍑芥暟娓呴櫎涓插彛鐨勯敊璇爣蹇椾互渚跨戶緇緭鍏ャ佽緭鍑烘搷浣溿?span>
鍙傛暟lpStat鎸囧悜涓涓?span>COMSTAT緇撴瀯錛岃緇撴瀯榪斿洖涓插彛鐘舵佷俊鎭?span> COMSTAT緇撴瀯 COMSTAT緇撴瀯鍖呭惈涓插彛鐨勪俊鎭紝緇撴瀯瀹氫箟濡備笅錛?/span>
typedef struct _COMSTAT { // cst
DWORD fCtsHold : 1; // Tx waiting for CTS signal
DWORD fDsrHold : 1; // Tx waiting for DSR signal
DWORD fRlsdHold : 1; // Tx waiting for RLSD signal
DWORD fXoffHold : 1; // Tx waiting, XOFF char rec''d
DWORD fXoffSent : 1; // Tx waiting, XOFF char sent
DWORD fEof : 1; // EOF character sent
DWORD fTxim : 1; // character waiting for Tx
DWORD fReserved : 25; // reserved
DWORD cbInQue; // bytes in input buffer
DWORD cbOutQue; // bytes in output buffer
} COMSTAT, *LPCOMSTAT;
鏈枃鍙敤鍒頒簡cbInQue鎴愬憳鍙橀噺錛岃鎴愬憳鍙橀噺鐨勫間唬琛ㄨ緭鍏ョ紦鍐插尯鐨勫瓧鑺傛暟銆?span>
銆銆鏈鍚庣敤PurgeComm鍑芥暟娓呯┖涓插彛鐨勮緭鍏ヨ緭鍑虹紦鍐插尯銆?/span>
榪欐浠g爜鐢?span>WaitForSingleObject鍑芥暟鏉ョ瓑寰?span>OVERLAPPED緇撴瀯鐨?span>hEvent鎴愬憳錛屼笅闈㈡垜浠啀婕旂ず涓孌佃皟鐢?span>GetOverlappedResult鍑芥暟絳夊緟鐨勫紓姝ヨ涓插彛紺轟緥浠g爜錛?/span>
char lpInBuffer[1024];
DWORD dwBytesRead=1024;
BOOL bReadStatus;
DWORD dwErrorFlags;
COMSTAT ComStat;
OVERLAPPED m_osRead;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
if(!ComStat.cbInQue) return 0;
dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue);
bReadStatus=ReadFile(hCom,
lpInBuffer,
dwBytesRead,
&dwBytesRead,
&m_osRead);
if(!bReadStatus) //濡傛灉ReadFile鍑芥暟榪斿洖FALSE
{
if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(hCom,
&m_osRead,&dwBytesRead,TRUE); // GetOverlappedResult鍑芥暟鐨勬渶鍚庝竴涓弬鏁拌涓?span>TRUE錛?span> //鍑芥暟浼?xì)涓鐩寸瓑寰咃紝鐩村埌璇繪搷浣滃畬鎴愭垨鐢變簬閿欒鑰岃繑鍥炪?span> return dwBytesRead;
}
return 0;
}
return dwBytesRead;
寮傛鍐欎覆鍙g殑紺轟緥浠g爜錛?/span>
char buffer[1024];
DWORD dwBytesWritten=1024;
DWORD dwErrorFlags;
COMSTAT ComStat;
OVERLAPPED m_osWrite;
BOOL bWriteStat;
bWriteStat=WriteFile(hCom,buffer,dwBytesWritten, &dwBytesWritten,&m_OsWrite);
if(!bWriteStat) {
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_osWrite.hEvent,1000);
return dwBytesWritten;
}
return 0;
}
return dwBytesWritten;
錛?span>4錛夈?a name=鍏抽棴涓插彛>鍏抽棴涓插彛
鍒╃敤API鍑芥暟鍏抽棴涓插彛闈炲父綆鍗曪紝鍙渶浣跨敤CreateFile鍑芥暟榪斿洖鐨勫彞鏌勪綔涓哄弬鏁拌皟鐢?span>CloseHandle鍗沖彲錛?/span>
BOOL CloseHandle( HANDLE hObject; //handle to object to close );
涓插彛緙栫▼鐨勪竴涓疄渚?/span>
涓轟簡璁╂?zhèn)ㄦ洿濂藉湴鐞嗚В涓插彛缂柦E?span>,涓嬮潰鎴戜滑鍒嗗埆緙栧啓涓や釜渚嬬▼錛堣闄勫甫鐨勬簮鐮侀儴鍒嗭級,榪欎袱涓緥紼嬮兘瀹炵幇浜嗗伐鎺ф満涓庣櫨鐗規(guī)樉紺轟華琛ㄩ氳繃RS485鎺ュ彛榪涜鐨勪覆鍙i氫俊銆傚叾涓涓涓緥紼嬮噰鐢ㄥ悓姝ヤ覆鍙f搷浣?span>,絎簩涓緥紼嬮噰鐢ㄥ紓姝ヤ覆鍙f搷浣溿?span>
銆銆鎴戜滑鍙粙緇嶈蔣浠墮儴鍒嗭紝RS485鎺ュ彛鎺ョ嚎鏂規(guī)硶涓嶄綔浠嬬粛錛屾劅鍏磋叮鐨勮鑰呭彲浠ユ煡闃呯浉鍏寵祫鏂欍?/span>
渚嬬▼1
鎵撳紑VC++6.0錛屾柊寤哄熀浜庡璇濇鐨勫伐紼?span>RS485Comm錛屽湪涓誨璇濇紿楀彛IDD_RS485COMM_DIALOG涓婃坊鍔犱袱涓寜閽紝ID鍒嗗埆涓?span>IDC_SEND鍜?span>IDC_RECEIVE錛屾爣棰樺垎鍒負(fù)“鍙戦?span>”鍜?span>“鎺ユ敹”錛涙坊鍔犱竴涓潤鎬佹枃鏈IDC_DISP錛岀敤浜庢樉紺轟覆鍙f帴鏀跺埌鐨勫唴瀹廣?span>
鍦?span>RS485CommDlg.cpp鏂囦歡涓坊鍔犲叏灞鍙橀噺錛?/span>
HANDLE hCom; //鍏ㄥ眬鍙橀噺錛屼覆鍙e彞鏌?/span>
鍦?span>RS485CommDlg.cpp鏂囦歡涓殑OnInitDialog()鍑芥暟娣誨姞濡備笅浠g爜錛?/span>
// TODO: Add extra initialization here
hCom=CreateFile("COM1",//COM1鍙?span>
GENERIC_READ|GENERIC_WRITE, //鍏佽璇誨拰鍐?span>
0, //鐙崰鏂瑰紡
NULL,
OPEN_EXISTING, //鎵撳紑鑰屼笉鏄垱寤?span>
0, //鍚屾鏂瑰紡
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox("鎵撳紑COM澶辮觸!");
return FALSE;
}
SetupComm(hCom,100,100); //杈撳叆緙撳啿鍖哄拰杈撳嚭緙撳啿鍖虹殑澶у皬閮芥槸1024
COMMTIMEOUTS TimeOuts; //璁懼畾璇昏秴鏃?span>
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0; //鍦ㄨ涓嬈¤緭鍏ョ紦鍐插尯鐨勫唴瀹瑰悗璇繪搷浣滃氨绔嬪嵆榪斿洖錛?span> //鑰屼笉綆℃槸鍚﹁鍏ヤ簡瑕佹眰鐨勫瓧絎︺?span> //璁懼畾鍐欒秴鏃?span> TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //璁劇疆瓚呮椂
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //娉㈢壒鐜囦負(fù)9600
dcb.ByteSize=8; //姣忎釜瀛楄妭鏈?span>8浣?span>
dcb.Parity=NOPARITY; //鏃犲鍋舵牎楠屼綅
dcb.StopBits=TWOSTOPBITS; //涓や釜鍋滄浣?span>
SetCommState(hCom,&dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
鍒嗗埆鍙屽嚮IDC_SEND鎸夐挳鍜?span>IDC_RECEIVE鎸夐挳錛屾坊鍔犱袱涓寜閽殑鍝嶅簲鍑芥暟錛?/span>
void CRS485CommDlg::OnSend() {
// TODO: Add your control notification handler code here
// 鍦ㄦ闇瑕佺畝鍗曚粙緇嶇櫨鐗瑰叕鍙?span>XMA5000鐨勯氳鍗忚錛?span>
//璇ヤ華琛?span>RS485閫氳閲囩敤涓繪満騫挎挱鏂瑰紡閫氳銆?span>
//涓茶鍗婂弻宸ワ紝甯?span>11浣嶏紝1涓搗濮嬩綅(0)錛?span>8涓暟鎹綅錛?span>2涓仠姝綅(1)
//濡傦細(xì)璇諱華琛ㄦ樉紺虹殑鐬椂鍊鹼紝涓繪満鍙戦侊細(xì)DC1 AAA BB ETX
//鍏朵腑錛?span>DC1鏄爣鍑?span>ASCII鐮佺殑涓涓帶鍒剁鍙鳳紝鐮佸間負(fù)11H(鍗佽繘鍒剁殑17)
//鍦?span>XMA5000鐨勯氳鍗忚涓紝DC1琛ㄧず璇葷灛鏃跺?span>
//AAA鏄粠鏈哄湴鍧鐮侊紝涔熷氨鏄?span>XMA5000鏄劇ず浠〃鐨勯氳鍦板潃
//BB涓洪氶亾鍙鳳紝璇葷灛鏃跺兼椂璇ュ間負(fù)01
//ETX涔熸槸鏍囧噯ASCII鐮佺殑涓涓帶鍒剁鍙鳳紝鐮佸間負(fù)03H
//鍦?span>XMA5000鐨勯氳鍗忚涓紝ETX琛ㄧず涓繪満緇撴潫絎?span>
char lpOutBuffer[7];
memset(lpOutBuffer,''\0'',7); //鍓?span>7涓瓧鑺傚厛娓呴浂 l
pOutBuffer[0]=''\x11''; //鍙戦佺紦鍐插尯鐨勭1涓瓧鑺備負(fù)DC1
lpOutBuffer[1]=''0''; //絎?span>2涓瓧鑺備負(fù)瀛楃0(30H)
lpOutBuffer[2]=''0''; //絎?span>3涓瓧鑺備負(fù)瀛楃0(30H)
lpOutBuffer[3]=''1''; // 絎?span>4涓瓧鑺備負(fù)瀛楃1(31H)
lpOutBuffer[4]=''0''; //絎?span>5涓瓧鑺備負(fù)瀛楃0(30H)
lpOutBuffer[5]=''1''; //絎?span>6涓瓧鑺備負(fù)瀛楃1(31H)
lpOutBuffer[6]=''\x03''; //絎?span>7涓瓧鑺備負(fù)瀛楃ETX //浠庤孌典唬鐮佸彲浠ョ湅鍑猴紝浠〃鐨勯氳鍦板潃涓?span>001
DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);
if(!bWriteStat) {
AfxMessageBox("鍐欎覆鍙eけ璐?span>!");
}
}
void CRS485CommDlg::OnReceive() {
// TODO: Add your control notification handler code here
char str[100];
memset(str,''\0'',100);
DWORD wCount=100;//璇誨彇鐨勫瓧鑺傛暟
BOOL bReadStat;
bReadStat=ReadFile(hCom,str,wCount,&wCount,NULL);
if(!bReadStat)
AfxMessageBox("璇諱覆鍙eけ璐?span>!");
PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
m_disp=str;
UpdateData(FALSE);
}
鎮(zhèn)ㄥ彲浠ヨ瀵熻繑鍥炵殑瀛楃涓詫紝鍏朵腑鏈夊拰浠〃鏄劇ず鍊肩浉鍚岀殑閮ㄥ垎錛屾?zhèn)ㄥ彲浠q涜鐩稿簲鐨勫瓧絎︿覆鎿嶄綔鍙栧嚭浠〃鐨勬樉紺哄箋?span>
鎵撳紑ClassWizard,涓洪潤鎬佹枃鏈IDC_DISP娣誨姞CString綾誨瀷鍙橀噺m_disp錛屽悓鏃舵坊鍔?span>WM_CLOSE鐨勭浉搴斿嚱鏁幫細(xì)
void CRS485CommDlg::OnClose() {
// TODO: Add your message handler code here and/or call default
CloseHandle(hCom); //紼嬪簭閫鍑烘椂鍏抽棴涓插彛
CDialog::OnClose();
}
紼嬪簭鐨勭浉搴旈儴鍒嗗凡緇忓湪浠g爜鍐呴儴浣滀簡璇︾粏浠嬬粛銆傝繛鎺ュソ紜歡閮ㄥ垎錛岀紪璇戣繍琛岀▼搴忥紝緇嗗績浣撲細(xì)涓插彛鍚屾鎿嶄綔閮ㄥ垎銆?/span>
渚嬬▼2
鎵撳紑VC++6.0錛屾柊寤哄熀浜庡璇濇鐨勫伐紼?span>RS485Comm錛屽湪涓誨璇濇紿楀彛IDD_RS485COMM_DIALOG涓婃坊鍔犱袱涓寜閽紝ID鍒嗗埆涓?span>IDC_SEND鍜?span>IDC_RECEIVE錛屾爣棰樺垎鍒負(fù)“鍙戦?span>”鍜?span>“鎺ユ敹”錛涙坊鍔犱竴涓潤鎬佹枃鏈IDC_DISP錛岀敤浜庢樉紺轟覆鍙f帴鏀跺埌鐨勫唴瀹廣傚湪RS485CommDlg.cpp鏂囦歡涓坊鍔犲叏灞鍙橀噺錛?/span>
HANDLE hCom; //鍏ㄥ眬鍙橀噺錛?/span>
涓插彛鍙ユ焺鍦?span>RS485CommDlg.cpp鏂囦歡涓殑OnInitDialog()鍑芥暟娣誨姞濡備笅浠g爜錛?/span>
hCom=CreateFile("COM1",//COM1鍙?span>
GENERIC_READ|GENERIC_WRITE, //鍏佽璇誨拰鍐?span>
0, //鐙崰鏂瑰紡
NULL,
OPEN_EXISTING, //鎵撳紑鑰屼笉鏄垱寤?span>
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //閲嶅彔鏂瑰紡
NULL);
if(hCom==(HANDLE)-1) {
AfxMessageBox("鎵撳紑COM澶辮觸!");
return FALSE;
}
SetupComm(hCom,100,100); //杈撳叆緙撳啿鍖哄拰杈撳嚭緙撳啿鍖虹殑澶у皬閮芥槸100
COMMTIMEOUTS TimeOuts; //璁懼畾璇昏秴鏃?span>
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0; //鍦ㄨ涓嬈¤緭鍏ョ紦鍐插尯鐨勫唴瀹瑰悗璇繪搷浣滃氨绔嬪嵆榪斿洖錛?span> //鑰屼笉綆℃槸鍚﹁鍏ヤ簡瑕佹眰鐨勫瓧絎︺?span> //璁懼畾鍐欒秴鏃?span> TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //璁劇疆瓚呮椂
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //娉㈢壒鐜囦負(fù)9600
dcb.ByteSize=8; //姣忎釜瀛楄妭鏈?span>8浣?span>
dcb.Parity=NOPARITY; //鏃犲鍋舵牎楠屼綅
dcb.StopBits=TWOSTOPBITS; //涓や釜鍋滄浣?span>
SetCommState(hCom,&dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
鍒嗗埆鍙屽嚮IDC_SEND鎸夐挳鍜?span>IDC_RECEIVE鎸夐挳錛屾坊鍔犱袱涓寜閽殑鍝嶅簲鍑芥暟錛?/span>
void CRS485CommDlg::OnSend() {
// TODO: Add your control notification handler code here
OVERLAPPED m_osWrite;
memset(&m_osWrite,0,sizeof(OVERLAPPED));
m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
char lpOutBuffer[7];
memset(lpOutBuffer,''\0'',7);
lpOutBuffer[0]=''\x11'';
lpOutBuffer[1]=''0'';
lpOutBuffer[2]=''0'';
lpOutBuffer[3]=''1'';
lpOutBuffer[4]=''0'';
lpOutBuffer[5]=''1'';
lpOutBuffer[6]=''\x03'';
DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer, dwBytesWrite,& dwBytesWrite,&m_osWrite);
if(!bWriteStat) {
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_osWrite.hEvent,1000);
}
}
}
void CRS485CommDlg::OnReceive()
{
// TODO: Add your control notification handler code here
OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
COMSTAT ComStat;
DWORD dwErrorFlags;
char str[100]; memset(str,''\0'',100);
DWORD dwBytesRead=100;//璇誨彇鐨勫瓧鑺傛暟
BOOL bReadStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
dwBytesRead=min(dwBytesRead, (DWORD)ComStat.cbInQue);
bReadStat=ReadFile(hCom,str, dwBytesRead,&dwBytesRead,&m_osRead);
if(!bReadStat) {
if(GetLastError()==ERROR_IO_PENDING) //GetLastError()鍑芥暟榪斿洖ERROR_IO_PENDING,琛ㄦ槑涓插彛姝e湪榪涜璇繪搷浣?span>
{
WaitForSingleObject(m_osRead.hEvent,2000); //浣跨敤WaitForSingleObject鍑芥暟絳夊緟錛岀洿鍒拌鎿嶄綔瀹屾垚鎴栧歡鏃跺凡杈懼埌2縐掗挓 //褰撲覆鍙h鎿嶄綔榪涜瀹屾瘯鍚庯紝m_osRead鐨?span>hEvent浜嬩歡浼?xì)鍙樹负鏈変俊鍙?span>
}
}
PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
m_disp=str;
UpdateData(FALSE);
}
鎵撳紑ClassWizard,涓洪潤鎬佹枃鏈IDC_DISP娣誨姞CString綾誨瀷鍙橀噺m_disp錛屽悓鏃舵坊鍔?span>WM_CLOSE鐨勭浉搴斿嚱鏁幫細(xì)
void CRS485CommDlg::OnClose() {
// TODO: Add your message handler code here and/or call default
CloseHandle(hCom); //紼嬪簭閫鍑烘椂鍏抽棴涓插彛
CDialog::OnClose();
}