锘??xml version="1.0" encoding="utf-8" standalone="yes"?> Visual Studio 2008鎺у埗鍙扮▼搴忔棤娉曡緭鍑轟腑鏂囷紒錛熻В鍐蟲柟娉曞彧闇瑕佽緗竴涓嬪尯鍩熷嵆鍙傛病鏈夎緗尯鍩熷墠濡備笅鍥撅細 鍖呭惈澶存枃浠訛細#include <locale.h> 鍑芥暟錛歘tsetlocale(LC_ALL, _T("chs")); 璁劇疆鍖哄煙鍚庡涓嬪浘錛?/span> 鍙傝冿紝鎽樿嚜寰蔣MSDN 鎺у埗鍙頒腑鐨勭紪鐮佺▼搴忓憳鍦ㄥ鎺у埗鍙版垨“鏂囨湰妯″紡”搴旂敤紼嬪簭緙栫▼鏃跺彲鍚屾椂浣跨敤 Unicode 鍜?SBCS 鎴?DBCS 緙栫爜銆傚嚭浜庢壙琚柟闈㈢殑鑰冭檻錛岄潪 Unicode 鎺у埗鍙?I/O 鍑芥暟浣跨敤鎺у埗鍙頒唬鐮侀〉錛堥粯璁や負 OEM 浠g爜欏碉級銆俉indows 涓殑鎵鏈夊叾浠栭潪 Unicode 鍑芥暟閮戒嬌鐢?Windows 浠g爜欏點傝繖鎰忓懗鐫鍏朵粬鍑芥暟鍙兘鏃犳硶姝g‘鍦板鐞嗙敱鎺у埗鍙板嚱鏁拌繑鍥炵殑瀛楃涓詫紝鍙嶄箣浜︾劧銆備緥濡傦紝濡傛灉 FindFirstFileA 榪斿洖浜嗕竴涓寘鍚煇涓潪 ASCII 瀛楃鐨勫瓧絎︿覆錛學riteConsoleA 灝嗘棤娉曟甯稿湴鏄劇ず璇ュ瓧絎︿覆銆?/p>
瑕佷竴鐩磋窡韙摢浜涘嚱鏁伴渶瑕佸摢浜涚紪鐮佸茍姝g‘杞崲鏂囨湰鍙傛暟鐨勭紪鐮侀潪甯稿洶闅俱傚嚱鏁?SetFileApisToOEM銆丼etFileApisToANSI 鍜屽府鍔╃▼搴忓嚱鏁?AreFileApisANSI 鐨勫紩鍏ユ瀬澶у湴綆鍖栦簡姝ら」宸ヤ綔銆傚墠涓や釜鍑芥暟鍙帴鍙楁垨榪斿洖鏂囦歡鍚嶇О錛屽 KERNEL32.dll 瀵煎嚭鐨勯潪 Unicode 鍑芥暟鏈夋晥鏋溿傞【鍚嶆濅箟錛孲etFileApisToOEM 灝嗚繖浜涘嚱鏁拌緗負鎺ュ彈鎴栬繑鍥炰笌褰撳墠緋葷粺鍖哄煙璁劇疆瀵瑰簲鐨?OEM 瀛楃闆嗕腑鐨勬枃浠跺悕縐幫紝鑰?SetFileApisToANSI 鐢ㄤ簬涓鴻繖浜涘悕縐版仮澶嶉粯璁ゅ鹼紙Windows ANSI 緙栫爜錛夈備嬌鐢?AreFileApisANSI 鍙煡璇㈠埌褰撳墠閫夊畾鐨勭紪鐮併?/p>
鍒╃敤 SetFileApisToOEM 鍙交鏉懼湴瑙e喅 WindFirstFileA錛堟垨 GetCurrentDirectoryA錛屾垨 Win32 API 鐨勪換浣曟枃浠跺鐞嗗嚱鏁幫級鐨勭粨鏋滄棤娉曠洿鎺ヤ紶閫佺粰 WriteConsoleA 榪欎竴闂錛氬湪璋冪敤 SetFileApisToOEM 鍚庯紝WindFirstFileA 灝嗚繑鍥炰互 OEM錛堣屼笉鏄互 Windows ANSI 瀛楃闆嗭級緙栫爜鐨勬枃鏈備絾姝よВ鍐蟲柟妗堝茍闈炲簲瀵規(guī)墍鏈?Windows ANSI 涓?OEM 涓嶅吋瀹規(guī)儏鍐電殑涓囪兘鑹柟銆傝鎯蟲偍闇瑕佷粠鏌愪釜鏂囦歡澶勭悊鍑芥暟涓幏鍙栨枃鏈紝鐒跺悗灝嗗叾杈撳嚭鍒版帶鍒跺彴錛屾帴鐫鐢ㄥ叾浠栧嚱鏁幫紙涓嶅彈SetFileApisToOEM 鐨勫獎鍝嶏級澶勭悊璇ユ枃鏈傝繖縐嶇粷瀵圭悊鎯崇殑鎯呭喌闇瑕佹洿鏀圭紪鐮併傚惁鍒欙紝鎮(zhèn)ㄥ皢闇瑕佽皟鐢?SetFileApisToOEM 浠ヨ幏鍙栫敤浜庢帶鍒跺彴杈撳嚭鐨勬暟鎹紝鐒跺悗璋冪敤SetFileApisToANSI 寰楀埌鍚屼竴鏂囨湰錛堜嬌鐢ㄥ彟涓縐嶇紪鐮侊級榪涜鍐呴儴澶勭悊銆傚彟涓縐?SetFileApisToOEM 鏃犳硶鍙戞尌浣滅敤鐨勬儏鍐靛鍛戒護琛屽弬鏁扮殑澶勭悊錛氬綋鎮(zhèn)ㄧ殑搴旂敤紼嬪簭鐨勫叆鍙g偣涓?main錛堣屼笉鏄?wmain錛夋椂錛屽弬鏁板緇堜綔涓?Windows ANSI 瀛楃涓叉暟緇勮繘琛屼紶閫掋傝繖涓鍒囨樉鐒朵嬌緙栧啓闈?Unicode 鎺у埗鍙板簲鐢ㄧ▼搴忕殑紼嬪簭鍛樼殑宸ヤ綔鍙樺緱鏇村鏉備簡銆?/p>
鏇翠負澶嶆潅鐨勬槸涓烘帶鍒跺彴緙栧啓鐨?8 浣嶄唬鐮侀渶瑕佸鐞嗕袱縐嶄笉鍚岀被鍨嬬殑鍖哄煙璁劇疆銆傚湪緙栧啓浠g爜鏃訛紝鎮(zhèn)ㄥ彲浠ヤ嬌鐢?Win32 API 鎴?C 榪愯鏃跺簱鍑芥暟銆俉in32 API 鐨?ANSI 鍑芥暟鍋囧畾鏂囨湰鏄拡瀵瑰綋鍓嶆帶鍒跺彴浠g爜欏碉紙緋葷粺鍖哄煙璁劇疆榛樿瀹氫箟鐨勶級緙栫爜鐨勩係etConsoleCP 鍜?SetConsoleOutputCP 鍑芥暟鍙洿鏀硅繖浜涙搷浣滀腑浣跨敤鐨勪唬鐮侀〉銆傜敤鎴峰彲鍦ㄥ懡浠ゆ彁紺虹涓嬭皟鐢?chcp or mode con cp select= 鍛戒護錛岃繖灝嗕細鏇存敼褰撳墠鎺у埗鍙扮殑浠g爜欏點傝緗浐瀹氱殑鎺у埗鍙頒唬鐮侀〉鐨勫彟涓縐嶆柟娉曟槸鐢ㄩ粯璁ょ殑浠g爜欏甸泦鍒涘緩鎺у埗鍙板揩鎹鋒柟寮忥紙浠呴傜敤浜庝笢浜氭湰鍦板寲鐗堟湰鐨勬搷浣滅郴緇燂級銆?搴旂敤紼嬪簭搴旇兘澶熷搷搴旂敤鎴風殑鎿嶄綔銆?/p>
C 榪愯鏃跺簱錛圕RT 鍑芥暟錛変腑鍖哄垎鍖哄煙璁劇疆鍑芥暟鍙緷鐓?(_w)setlocale 璋冪敤鎵瀹氫箟鐨勮緗鐞嗘枃鏈傚鏋滀唬鐮佷腑鏈皟鐢?(_w)setlocale錛屽垯 CRT 鍑芥暟瀵硅繖浜涙搷浣滀嬌鐢?ANSI "C" 璇█涓嶅彉鍖哄煙璁劇疆錛岃繖鏍峰氨涓㈠け浜嗙壒瀹氫簬璇█鐨勫姛鑳姐?/p>
璇ュ嚱鏁扮殑澹版槑涓猴細 setlocale( int category, const char *locale)鎴?/p>
_wsetlocale( int category, const wchar_t *locale)鍏朵腑 "category" 鐢ㄤ簬瀹氫箟鍙楀獎鍝嶇殑鐗瑰畾浜庡尯鍩熺殑璁劇疆錛堝鏋滄寚瀹氫簡 LC_ALL錛屽垯鍏ㄩ儴瀹氫箟錛夈傚彲鍙樺尯鍩熻緗彲浠ユ槸鏄懼紡鍖哄煙璁劇疆鍚嶇О鎴栦笅闈㈢殑鏌愪竴欏癸細 ".OCP" 鎸囦笌褰撳墠鐢ㄦ埛鍖哄煙璁劇疆瀵瑰簲鐨?OEM 浠g爜欏?br style="line-height: normal" />".ACP" 鎴?"" 鎸囦笌褰撳墠鐢ㄦ埛鍖哄煙璁劇疆瀵瑰簲鐨?Windows 浠g爜欏?br style="line-height: normal" />".OCP" 鍜?".ACP" 鍙傛暟濮嬬粓寮曠敤鐢ㄦ埛鍖哄煙璁劇疆錛堣屼笉鏄郴緇熷尯鍩熻緗級鐨勮緗箋傚洜姝や笉鑳藉皢瀹冧滑鐢ㄤ簬璁劇疆 LC_CTYPE銆傛 "category" 瀹氫箟浜?Unicode 鍚?8 浣嶈漿鎹㈢殑瑙勫垯鍜屽叾浠栨枃鏈鐞嗙▼搴忥紝蹇呴』閬靛驚鎺у埗鍙扮殑璁劇疆錛堝彲浣跨敤 GetConsoleCP 鍜?GetConsoleOutputCP 璁塊棶錛夈?/p>瀵規(guī)帶鍒跺彴搴旂敤紼嬪簭鏈浣崇殑闀挎湡瑙e喅鏂規(guī)鏄嬌鐢?Unicode錛屽洜涓?Unicode 鎺ュ彛鏄拡瀵?Win32 API 鍜?C 榪愯鏃跺簱瀹氫箟鐨勩備粖鍚庣殑緙栫▼妯″瀷浠嶉渶瑕佹?zhèn)ㄦ槕旨忓湴璁揪|尯鍩熻緗紝浣嗚嚦灝戝彲鑲畾閫氳繃 Win32 鍜?CRT 鐪嬪埌鐨勬枃鏈笉鍐嶉渶瑕佽繘琛屼唬鐮佽漿鎹€?/span> 涓昏灝辨槸涓や釜鍑芥暟鐨勪嬌鐢ㄣ傛垜鍏堟妸涓孌靛彲浠ヨ繍琛岀殑浠g爜璐村嚭鏉ワ紝鐒跺悗璁茶榪欎袱涓嚱鏁般?/p>
2銆丵ueryPerformanceFrequncy(LARGE_INTEGER *freq) 瀹冪敤浜庤幏寰椾綘鐨勬満鍣ㄤ竴縐掗挓鎵ц澶氬皯嬈★紝灝辨槸浣犵殑鏃墮挓鍛ㄦ湡銆?/p>
3銆丵ueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) 瀹冭幏寰楃殑鏄疌PU浠庡紑鏈轟互鏉ユ墽琛岀殑鏃墮挓鍛ㄦ湡鏁般?/p>
O鍟︺傘傘傘傚ソ濂界敤鐢ㄥ畠鍚с?/p> 銆愩?g++ -DMY_MAC -o dtest dtest.c 鎵ц緇撴灉錛?/p>
鏃犳帀-D閫夐」錛岄噸鏂扮紪璇戯紝鎵ц緇撴灉錛? 鎴戜滑鍙互鍒╃敤緙栬瘧鍣ㄨ繖涓夐」鏉ヨ皟璇曟垜浠殑紼嬪簭濂ャ? 濡傛灉鎴戠殑瀹忎唬琛ㄤ竴涓父閲忔庝箞鍔炲憿錛燂紵 鐪嬬湅淇敼鍚庣殑浠g爜錛?/p>
鍦ㄧ粓绔墽琛屼竴涓嬪懡浠わ細 濡傛灉紼嬪簭涓湁澶氫釜瀹忓彲浠ヨ繖鏍風紪璇?/p>
^_^錛岋紝寰堝叴濂嬫槸鍚э紵錛熻繖鏍鋒垜浠氨涓嶇敤鍦ㄤ唬鐮侀噷淇敼瀹忓彉閲忎簡銆傘?br /> 涓轟粈涔圕++涓笉寤鴻浣跨敤malloc calloc realloc絳塁璇█鍑芥暟?鍥犱負:榪欐牱鍒嗛厤鐨勭┖闂?榪斿洖鐨勬寚閽堥渶瑕侀氳繃free鏉ラ噴鏀?浣唂ree閲婃斁絀洪棿涓嶅悓浜巇elete,free涓嶄細鎵ц鏋愭瀯鍑芥暟! 铏界劧瀹炰緥紼嬪簭,瀵圭┖闂寸殑鍒嗛厤閲婃斁娌℃湁浠諱綍閿欒,浣嗗湪鏌愪簺鎯呭喌,姣斿A綾葷殑鏋愭瀯浼撮殢鐫鏌愪簺鐗規(guī)畩澶勭悊,灝嗗鑷寸▼搴忓紓甯?
1.
浠婂ぉ鍐欑嚎紼嬪嚱鏁版椂錛屽彂鐜癿sdn涓ThreadProc鐨勫畾涔夋湁瑕佹眰錛欴WORD WINAPI ThreadProc(LPVOID lpParameter);
涓嶈В涓轟粈涔堣鐢╓INAPI瀹忓畾涔夛紝鏌ヤ簡鍚庡彂鐜頒笅闈㈢殑瀹氫箟銆備簬鏄箮闇瑕佸尯鍒玙_stdcall鍜宊_cdecl涓よ呯殑鍖哄埆錛?#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
#define cdecl _cdecl
#ifndef CDECL
#define CDECL _cdecl
#endif
鍑犱箮鎴戜滑鍐欑殑姣忎竴涓猈INDOWS API鍑芥暟閮芥槸__stdcall綾誨瀷鐨勶紝棣栧厛錛岄渶瑕佷簡瑙d袱鑰呬箣闂寸殑鍖哄埆錛?WINDOWS鐨勫嚱鏁拌皟鐢ㄦ椂闇瑕佺敤鍒版爤錛圫TACK錛屼竴縐嶅厛鍏ュ悗鍑虹殑瀛樺偍緇撴瀯錛夈傚綋鍑芥暟璋冪敤瀹屾垚鍚庯紝鏍堥渶瑕佹竻妤氾紝榪欓噷灝辨槸闂鐨勫叧閿紝濡備綍娓呴櫎錛燂紵濡傛灉鎴戜滑鐨勫嚱鏁頒嬌鐢ㄤ簡_cdecl錛岄偅涔堟爤鐨勬竻闄ゅ伐浣滄槸鐢辮皟鐢ㄨ咃紝鐢–OM鐨勬湳璇潵璁插氨鏄鎴鋒潵瀹屾垚鐨勩傝繖鏍峰甫鏉ヤ簡涓涓鎵嬬殑闂錛屼笉鍚岀殑緙栬瘧鍣ㄤ駭鐢熸爤鐨勬柟寮忎笉灝界浉鍚岋紝閭d箞璋冪敤鑰呰兘鍚︽甯哥殑瀹屾垚娓呴櫎宸ヤ綔鍛紵絳旀鏄笉鑳姐傚鏋滀嬌鐢╛_stdcall錛屼笂闈㈢殑闂灝辮В鍐充簡錛屽嚱鏁拌嚜宸辮В鍐蟲竻闄ゅ伐浣溿傛墍浠ワ紝鍦ㄨ法錛堝紑鍙戯級騫沖彴鐨勮皟鐢ㄤ腑錛屾垜浠兘浣跨敤__stdcall錛堣櫧鐒舵湁鏃舵槸浠?WINAPI鐨勬牱瀛愬嚭鐜幫級銆傞偅涔堜負浠涔堣繕闇瑕乢cdecl鍛紵褰撴垜浠亣鍒拌繖鏍風殑鍑芥暟濡俧printf()瀹冪殑鍙傛暟鏄彲鍙樼殑錛屼笉瀹氶暱鐨勶紝琚皟鐢ㄨ呬簨鍏堟棤娉曠煡閬撳弬鏁扮殑闀垮害錛屼簨鍚庣殑娓呴櫎宸ヤ綔涔熸棤娉曟甯哥殑榪涜錛屽洜姝わ紝榪欑鎯呭喌鎴戜滑鍙兘浣跨敤_cdecl銆傚埌榪欓噷鎴戜滑鏈変竴涓粨璁猴紝濡傛灉浣犵殑紼嬪簭涓病鏈夋秹鍙婂彲鍙樺弬鏁幫紝鏈濂戒嬌鐢╛_stdcall鍏抽敭瀛椼?br />
2.
__cdecl,__stdcall鏄0鏄庣殑鍑芥暟璋冪敤鍗忚.涓昏鏄紶鍙傚拰寮規(guī)爤鏂歸潰鐨勪笉鍚?涓鑸琧++鐢ㄧ殑鏄痏_cdecl,windows閲屽ぇ閮界敤鐨勬槸__stdcall(API)
__cdecl鏄疌/C++鍜孧FC紼嬪簭榛樿浣跨敤鐨勮皟鐢ㄧ害瀹氾紝涔熷彲浠ュ湪鍑芥暟澹版槑鏃跺姞涓奯_cdecl鍏抽敭瀛楁潵鎵嬪伐鎸囧畾銆傞噰鐢╛_cdecl綰﹀畾鏃訛紝鍑芥暟鍙傛暟鎸夌収浠庡彸鍒板乏鐨勯『搴忓叆鏍堬紝騫朵笖鐢辮皟鐢ㄥ嚱鏁拌呮妸鍙傛暟寮瑰嚭鏍堜互娓呯悊鍫嗘爤銆傚洜姝わ紝瀹炵幇鍙彉鍙傛暟鐨勫嚱鏁板彧鑳戒嬌鐢ㄨ璋冪敤綰﹀畾銆傜敱浜庢瘡涓涓嬌鐢?__cdecl綰﹀畾鐨勫嚱鏁伴兘瑕佸寘鍚竻鐞嗗爢鏍堢殑浠g爜錛屾墍浠ヤ駭鐢熺殑鍙墽琛屾枃浠跺ぇ灝忎細姣旇緝澶с俖_cdecl鍙互鍐欐垚_cdecl銆?br />__stdcall璋冪敤綰﹀畾鐢ㄤ簬璋冪敤Win32 API鍑芥暟銆傞噰鐢╛_stdcall綰﹀畾鏃訛紝鍑芥暟鍙傛暟鎸夌収浠庡彸鍒板乏鐨勯『搴忓叆鏍堬紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鏍堬紝鍑芥暟鍙傛暟涓暟鍥哄畾銆傜敱浜庡嚱鏁頒綋鏈韓鐭ラ亾浼犺繘鏉ョ殑鍙傛暟涓暟錛屽洜姝よ璋冪敤鐨勫嚱鏁板彲浠ュ湪榪斿洖鍓嶇敤涓鏉et n鎸囦護鐩存帴娓呯悊浼犻掑弬鏁扮殑鍫嗘爤銆俖_stdcall鍙互鍐欐垚_stdcall銆?br />__fastcall綰﹀畾鐢ㄤ簬瀵規(guī)ц兘瑕佹眰闈炲父楂樼殑鍦哄悎銆俖_fastcall綰﹀畾灝嗗嚱鏁扮殑浠庡乏杈瑰紑濮嬬殑涓や釜澶у皬涓嶅ぇ浜?涓瓧鑺傦紙DWORD錛夌殑鍙傛暟鍒嗗埆鏀懼湪ECX鍜孍DX瀵勫瓨鍣紝鍏朵綑鐨勫弬鏁頒粛鏃ц嚜鍙沖悜宸﹀帇鏍堜紶閫侊紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鍫嗘爤銆俖_fastcall鍙互鍐欐垚 _fastcall
3.
__stdcall:
_stdcall 璋冪敤綰﹀畾鐩稿綋浜?6浣嶅姩鎬佸簱涓粡甯鎬嬌鐢ㄧ殑PASCAL璋冪敤綰﹀畾銆?br />
鍦?2浣嶇殑VC++5.0涓璓ASCAL璋冪敤綰﹀畾涓嶅啀琚敮鎸侊紙瀹為檯涓婂畠宸茶瀹氫箟涓篲_stdcall銆傞櫎浜哶_pascal 澶栵紝__fortran鍜宊_syscall涔熶笉琚敮鎸侊級錛屽彇鑰屼唬涔嬬殑鏄痏_stdcall璋冪敤綰﹀畾銆備袱鑰呭疄璐ㄤ笂鏄竴鑷寸殑錛屽嵆鍑芥暟鐨勫弬鏁拌嚜鍙沖悜宸﹂氳繃鏍堜紶閫掞紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鍐呭瓨鏍堬紝浣嗕笉鍚岀殑鏄嚱鏁板悕鐨勪慨楗伴儴鍒嗭紙鍏充簬鍑芥暟鍚嶇殑淇グ閮ㄥ垎鍦ㄥ悗闈㈠皢璇︾粏璇存槑錛夈?br />
_stdcall鏄疨ascal紼嬪簭鐨勭己鐪佽皟鐢ㄦ柟寮忥紝閫氬父鐢ㄤ簬Win32 Api涓紝鍑芥暟閲囩敤浠庡彸鍒板乏鐨勫帇鏍堟柟寮忥紝鑷繁鍦ㄩ鍑烘椂娓呯┖鍫嗘爤銆俈C灝嗗嚱鏁扮紪璇戝悗浼氬湪鍑芥暟鍚嶅墠闈㈠姞涓婁笅鍒掔嚎鍓嶇紑錛屽湪鍑芥暟鍚嶅悗鍔犱笂"@"鍜屽弬鏁扮殑瀛楄妭鏁般?br />
_cdecl:
_cdecl c璋冪敤綰﹀畾, 鎸変粠鍙寵嚦宸︾殑欏哄簭鍘嬪弬鏁板叆鏍堬紝鐢辮皟鐢ㄨ呮妸鍙傛暟寮瑰嚭鏍堛傚浜庝紶閫佸弬鏁扮殑鍐呭瓨鏍堟槸鐢辮皟鐢ㄨ呮潵緇存姢鐨勶紙姝e洜涓哄姝わ紝瀹炵幇鍙彉鍙傛暟鐨勫嚱鏁板彧鑳戒嬌鐢ㄨ璋冪敤綰﹀畾錛夈傚彟澶栵紝鍦ㄥ嚱鏁板悕淇グ綰﹀畾鏂歸潰涔熸湁鎵涓嶅悓銆?br />
_cdecl鏄疌鍜孋錛嬶紜紼嬪簭鐨勭己鐪佽皟鐢ㄦ柟寮忋傛瘡涓涓皟鐢ㄥ畠鐨勫嚱鏁伴兘鍖呭惈娓呯┖鍫嗘爤鐨勪唬鐮侊紝鎵浠ヤ駭鐢熺殑鍙墽琛屾枃浠跺ぇ灝忎細姣旇皟鐢╛stdcall鍑芥暟鐨勫ぇ銆傚嚱鏁伴噰鐢ㄤ粠鍙沖埌宸︾殑鍘嬫爤鏂瑰紡銆俈C灝嗗嚱鏁扮紪璇戝悗浼氬湪鍑芥暟鍚嶅墠闈㈠姞涓婁笅鍒掔嚎鍓嶇紑銆傛槸MFC緙虹渷璋冪敤綰﹀畾銆?br />
__fastcall:
__fastcall璋冪敤綰﹀畾鏄?浜?濡傚叾鍚嶏紝瀹冪殑涓昏鐗圭偣灝辨槸蹇紝鍥犱負瀹冩槸閫氳繃瀵勫瓨鍣ㄦ潵浼犻佸弬鏁扮殑錛堝疄闄呬笂錛屽畠鐢‥CX鍜孍DX浼犻佸墠涓や釜鍙屽瓧錛圖WORD錛夋垨鏇村皬鐨勫弬鏁幫紝鍓╀笅鐨勫弬鏁頒粛鏃ц嚜鍙沖悜宸﹀帇鏍堜紶閫侊紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鍐呭瓨鏍堬級錛屽湪鍑芥暟鍚嶄慨楗扮害瀹氭柟闈紝瀹冨拰鍓嶄袱鑰呭潎涓嶅悓銆?br />
_fastcall鏂瑰紡鐨勫嚱鏁伴噰鐢ㄥ瘎瀛樺櫒浼犻掑弬鏁幫紝VC灝嗗嚱鏁扮紪璇戝悗浼氬湪鍑芥暟鍚嶅墠闈㈠姞涓?@"鍓嶇紑錛屽湪鍑芥暟鍚嶅悗鍔犱笂"@"鍜屽弬鏁扮殑瀛楄妭鏁般?br />
thiscall:
thiscall浠呬粎搴旂敤浜?C++"鎴愬憳鍑芥暟銆倀his鎸囬拡瀛樻斁浜嶤X瀵勫瓨鍣紝鍙傛暟浠庡彸鍒板乏鍘嬨倀hiscall涓嶆槸鍏抽敭璇嶏紝鍥犳涓嶈兘琚▼搴忓憳鎸囧畾銆?br />
naked call:
閲囩敤1-4鐨勮皟鐢ㄧ害瀹氭椂錛屽鏋滃繀瑕佺殑璇濓紝榪涘叆鍑芥暟鏃剁紪璇戝櫒浼氫駭鐢熶唬鐮佹潵淇濆瓨ESI錛孍DI錛孍BX錛孍BP瀵勫瓨鍣紝閫鍑哄嚱鏁版椂鍒欎駭鐢熶唬鐮佹仮澶嶈繖浜涘瘎瀛樺櫒鐨勫唴瀹廣?br />
naked call涓嶄駭鐢熻繖鏍風殑浠g爜銆俷aked call涓嶆槸綾誨瀷淇グ絎︼紝鏁呭繀欏誨拰_declspec鍏卞悓浣跨敤銆?br />
鍙﹂檮:
鍏抽敭瀛?__stdcall銆乢_cdecl鍜宊_fastcall鍙互鐩存帴鍔犲湪瑕佽緭鍑虹殑鍑芥暟鍓嶏紝涔熷彲浠ュ湪緙栬瘧鐜鐨凷etting...\C/C++ \Code Generation欏歸夋嫨銆傚綋鍔犲湪杈撳嚭鍑芥暟鍓嶇殑鍏抽敭瀛椾笌緙栬瘧鐜涓殑閫夋嫨涓嶅悓鏃訛紝鐩存帴鍔犲湪杈撳嚭鍑芥暟鍓嶇殑鍏抽敭瀛楁湁鏁堛傚畠浠搴旂殑鍛戒護琛屽弬鏁板垎鍒負/Gz銆?/Gd鍜?Gr銆傜己鐪佺姸鎬佷負/Gd錛屽嵆__cdecl銆?br />
瑕佸畬鍏ㄦā浠縋ASCAL璋冪敤綰﹀畾棣栧厛蹇呴』浣跨敤__stdcall璋冪敤綰﹀畾錛岃嚦浜庡嚱鏁板悕淇グ綰﹀畾錛屽彲浠ラ氳繃鍏跺畠鏂規(guī)硶妯′豢銆傝繕鏈変竴涓煎緱涓鎻愮殑鏄?WINAPI瀹忥紝Windows.h鏀寔璇ュ畯錛屽畠鍙互灝嗗嚭鍑芥暟緲昏瘧鎴愰傚綋鐨勮皟鐢ㄧ害瀹氾紝鍦╓IN32涓紝瀹冭瀹氫箟涓篲_stdcall銆備嬌鐢╓INAPI瀹忓彲浠ュ垱寤鴻嚜宸辯殑APIs銆?br />
鍚嶅瓧淇グ綰﹀畾
1銆佷慨楗板悕(Decoration name)
“C”鎴栬?#8220;C++”鍑芥暟鍦ㄥ唴閮紙緙栬瘧鍜岄摼鎺ワ級閫氳繃淇グ鍚嶈瘑鍒備慨楗板悕鏄紪璇戝櫒鍦ㄧ紪璇戝嚱鏁板畾涔夋垨鑰呭師鍨嬫椂鐢熸垚鐨勫瓧絎︿覆銆傛湁浜涙儏鍐典笅浣跨敤鍑芥暟鐨勪慨楗板悕鏄繀瑕佺殑錛屽鍦ㄦā鍧楀畾涔夋枃浠墮噷澶存寚瀹氳緭鍑?#8220;C++”閲嶈澆鍑芥暟銆佹瀯閫犲嚱鏁般佹瀽鏋勫嚱鏁幫紝鍙堝鍦ㄦ眹緙栦唬鐮侀噷璋冪敤“C””鎴?#8220;C++”鍑芥暟絳夈?br />
淇グ鍚嶇敱鍑芥暟鍚嶃佺被鍚嶃佽皟鐢ㄧ害瀹氥佽繑鍥炵被鍨嬨佸弬鏁扮瓑鍏卞悓鍐沖畾銆?br />
2銆佸悕瀛椾慨楗扮害瀹氶殢璋冪敤綰﹀畾鍜岀紪璇戠綾?C鎴朇++)鐨勪笉鍚岃屽彉鍖栥傚嚱鏁板悕淇グ綰﹀畾闅忕紪璇戠綾誨拰璋冪敤綰﹀畾鐨勪笉鍚岃屼笉鍚岋紝涓嬮潰鍒嗗埆璇存槑銆?br />
a銆丆緙栬瘧鏃跺嚱鏁板悕淇グ綰﹀畾瑙勫垯錛?br />
__stdcall璋冪敤綰﹀畾鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞涓婁竴涓笅鍒掔嚎鍓嶇紑錛屽悗闈㈠姞涓婁竴涓?#8220;@”絎﹀彿鍜屽叾鍙傛暟鐨勫瓧鑺傛暟錛屾牸寮忎負_functionname@number銆?br />
__cdecl璋冪敤綰﹀畾浠呭湪杈撳嚭鍑芥暟鍚嶅墠鍔犱笂涓涓笅鍒掔嚎鍓嶇紑錛屾牸寮忎負_functionname銆?br />
__fastcall璋冪敤綰﹀畾鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞涓婁竴涓?#8220;@”絎﹀彿錛屽悗闈篃鏄竴涓?#8220;@”絎﹀彿鍜屽叾鍙傛暟鐨勫瓧鑺傛暟錛屾牸寮忎負@functionname@number銆?br />
瀹冧滑鍧囦笉鏀瑰彉杈撳嚭鍑芥暟鍚嶄腑鐨勫瓧絎﹀ぇ灝忓啓錛岃繖鍜孭ASCAL璋冪敤綰﹀畾涓嶅悓錛孭ASCAL綰﹀畾杈撳嚭鐨勫嚱鏁板悕鏃犱換浣曚慨楗頒笖鍏ㄩ儴澶у啓銆?br />
b銆丆++緙栬瘧鏃跺嚱鏁板悕淇グ綰﹀畾瑙勫垯錛?br />
__stdcall璋冪敤綰﹀畾錛?br />1銆佷互“?”鏍囪瘑鍑芥暟鍚嶇殑寮濮嬶紝鍚庤窡鍑芥暟鍚嶏紱
2銆佸嚱鏁板悕鍚庨潰浠?#8220;@@YG”鏍囪瘑鍙傛暟琛ㄧ殑寮濮嬶紝鍚庤窡鍙傛暟琛紱
3銆佸弬鏁拌〃浠ヤ唬鍙瘋〃紺猴細
X--void 錛?br />D--char錛?br />E--unsigned char錛?br />F--short錛?br />H--int錛?br />I--unsigned int錛?br />J--long錛?br />K--unsigned long錛?br />M--float錛?br />N--double錛?br />_N--bool錛?br />....
PA--琛ㄧず鎸囬拡錛屽悗闈㈢殑浠e彿琛ㄦ槑鎸囬拡綾誨瀷錛屽鏋滅浉鍚岀被鍨嬬殑鎸囬拡榪炵畫鍑虹幇錛屼互“0”浠f浛錛屼竴涓?#8220;0”浠h〃涓嬈¢噸澶嶏紱
4銆佸弬鏁拌〃鐨勭涓欏逛負璇ュ嚱鏁扮殑榪斿洖鍊肩被鍨嬶紝鍏跺悗渚濇涓哄弬鏁扮殑鏁版嵁綾誨瀷,鎸囬拡鏍囪瘑鍦ㄥ叾鎵鎸囨暟鎹被鍨嬪墠錛?br />5銆佸弬鏁拌〃鍚庝互“@Z”鏍囪瘑鏁翠釜鍚嶅瓧鐨勭粨鏉燂紝濡傛灉璇ュ嚱鏁版棤鍙傛暟錛屽垯浠?#8220;Z”鏍囪瘑緇撴潫銆?br />
鍏舵牸寮忎負“?functionname@@YG*****@Z”鎴?#8220;?functionname@@YG*XZ”錛屼緥濡?br />int Test1錛坈har *var1,unsigned long錛?----“?Test1@@YGHPADK@Z”
void Test2錛堬級 -----“?Test2@@YGXXZ”
__cdecl璋冪敤綰﹀畾錛?br />瑙勫垯鍚屼笂闈㈢殑_stdcall璋冪敤綰﹀畾錛屽彧鏄弬鏁拌〃鐨勫紑濮嬫爣璇嗙敱涓婇潰鐨?#8220;@@YG”鍙樹負“@@YA”銆?br />
__fastcall璋冪敤綰﹀畾錛?br />瑙勫垯鍚屼笂闈㈢殑_stdcall璋冪敤綰﹀畾錛屽彧鏄弬鏁拌〃鐨勫紑濮嬫爣璇嗙敱涓婇潰鐨?#8220;@@YG”鍙樹負“@@YI”銆?br />VC++瀵瑰嚱鏁扮殑鐪佺己澹版槑鏄?#8220;__cedcl“,灝嗗彧鑳借C/C++璋冪敤.
CB鍦ㄨ緭鍑哄嚱鏁板0鏄庢椂浣跨敤4縐嶄慨楗扮鍙?br />//__cdecl
cb鐨勯粯璁ゅ鹼紝瀹冧細鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞_錛屽茍淇濈暀姝ゅ嚱鏁板悕涓嶅彉錛屽弬鏁版寜鐓т粠鍙沖埌宸︾殑欏哄簭渚濇浼犻掔粰鏍堬紝涔熷彲浠ュ啓鎴恄cdecl鍜宑decl褰㈠紡銆?br />//__fastcall
濂逛慨楗扮殑鍑芥暟鐨勫弬鏁板皢灝借偗鍛㈡劅鍦頒嬌鐢ㄥ瘎瀛樺櫒鏉ュ鐞嗭紝鍏跺嚱鏁板悕鍓嶅姞@錛屽弬鏁版寜鐓т粠宸﹀埌鍙崇殑欏哄簭鍘嬫爤錛?br />//__pascal
瀹冭鏄庣殑鍑芥暟鍚嶄嬌鐢≒ascal鏍煎紡鐨勫懡鍚嶇害瀹氥傝繖鏃跺嚱鏁板悕鍏ㄩ儴澶у啓銆傚弬鏁版寜鐓т粠宸﹀埌鍙崇殑欏哄簭鍘嬫爤錛?br />//__stdcall
浣跨敤鏍囧噯綰﹀畾鐨勫嚱鏁板悕銆傚嚱鏁板悕涓嶄細鏀瑰彉銆備嬌鐢╛_stdcall淇グ鏃躲傚弬鏁版寜鐓х敱鍙沖埌宸︾殑欏哄簭鍘嬫爤錛屼篃鍙互鏄痏stdcall錛?br />
VC++瀵瑰嚱鏁扮殑鐪佺己澹版槑鏄?__cedcl",灝嗗彧鑳借C/C++璋冪敤.
娉ㄦ剰錛?br />
1銆乢beginthread闇瑕乢_cdecl鐨勭嚎紼嬪嚱鏁板湴鍧錛宊beginthreadex鍜孋reateThread闇瑕乢_stdcall鐨勭嚎紼嬪嚱鏁板湴鍧銆?br />
2銆佷竴鑸琖IN32鐨勫嚱鏁伴兘鏄痏_stdcall銆傝屼笖鍦╓indef.h涓湁濡備笅鐨勫畾涔夛細
#define CALLBACK __stdcall
#define WINAPI銆 __stdcall
3銆乪xtern "C" _declspec(dllexport) int __cdecl Add(int a, int b);
4銆乪xtern "C"鐨勪綔鐢細濡傛灉Add(int a, int b)鏄湪c璇█緙栬瘧鍣ㄧ紪璇戯紝鑰屽湪c++鏂囦歡浣跨敤錛屽垯闇瑕佸湪c++鏂囦歡涓0鏄庯細extern "C" Add(int a, int b)錛屽洜涓篶緙栬瘧鍣ㄥ拰c++緙栬瘧鍣ㄥ鍑芥暟鍚嶇殑瑙i噴涓嶄竴鏍鳳紙c++緙栬瘧鍣ㄨВ閲婂嚱鏁板悕鐨勬椂鍊欒鑰冭檻鍑芥暟鍙傛暟錛岃繖鏍鋒槸浜嗘柟渚垮嚱鏁伴噸杞斤紝鑰屽湪c璇█涓笉瀛樺湪鍑芥暟閲嶈澆鐨勯棶棰橈級錛屼嬌鐢╡xtern "C"錛屽疄璐ㄥ氨鏄憡璇塩++緙栬瘧鍣紝璇ュ嚱鏁版槸c搴撻噷闈㈢殑鍑芥暟銆傚鏋滀笉浣跨敤extern "C"鍒欎細鍑虹幇閾炬帴閿欒銆?br />
涓鑸薄濡備笅浣跨敤錛?br />
#ifdef _cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C extern
#endif
#ifdef _cplusplus
extern "C"{
#endif
EXTERN_C int func(int a, int b);
#ifdef _cplusplus
}
#endif
5銆丮FC鎻愪緵浜嗕竴浜涘畯錛屽彲浠ヤ嬌鐢ˋFX_EXT_CLASS鏉ヤ唬鏇縚_declspec(DLLexport)錛屽茍淇グ綾誨悕錛屼粠鑰屽鍑虹被錛孉FX_API_EXPORT鏉ヤ慨楗板嚱鏁幫紝AFX_DATA_EXPORT鏉ヤ慨楗板彉閲?br />
AFX_CLASS_IMPORT錛歘_declspec(DLLexport)
AFX_API_IMPORT錛歘_declspec(DLLexport)
AFX_DATA_IMPORT錛歘_declspec(DLLexport)
AFX_CLASS_EXPORT錛歘_declspec(DLLexport)
AFX_API_EXPORT錛歘_declspec(DLLexport)
AFX_DATA_EXPORT錛歘_declspec(DLLexport)
AFX_EXT_CLASS錛?ifdef _AFXEXT
6銆丏LLMain璐熻矗鍒濆鍖?Initialization)鍜岀粨鏉?Termination)宸ヤ綔錛屾瘡褰撲竴涓柊鐨勮繘紼嬫垨鑰呰榪涚▼鐨勬柊鐨勭嚎紼嬭闂瓺LL鏃訛紝鎴栬呰闂瓺LL鐨勬瘡涓涓繘紼嬫垨鑰呯嚎紼嬩笉鍐嶄嬌鐢―LL鎴栬呯粨鏉熸椂錛岄兘浼氳皟鐢―LLMain銆備絾鏄紝浣跨敤TerminateProcess鎴?TerminateThread緇撴潫榪涚▼鎴栬呯嚎紼嬶紝涓嶄細璋冪敤DLLMain銆?br />
7銆佷竴涓狣LL鍦ㄥ唴瀛樹腑鍙湁涓涓疄渚?br />
DLL紼嬪簭鍜岃皟鐢ㄥ叾杈撳嚭鍑芥暟鐨勭▼搴忕殑鍏崇郴錛?br />
1)銆丏LL涓庤繘紼嬨佺嚎紼嬩箣闂寸殑鍏崇郴
DLL妯″潡琚槧灝勫埌璋冪敤瀹冪殑榪涚▼鐨勮櫄鎷熷湴鍧絀洪棿銆?br />
DLL浣跨敤鐨勫唴瀛樹粠璋冪敤榪涚▼鐨勮櫄鎷熷湴鍧絀洪棿鍒嗛厤錛屽彧鑳借璇ヨ繘紼嬬殑綰跨▼鎵璁塊棶銆?br />
DLL鐨勫彞鏌勫彲浠ヨ璋冪敤榪涚▼浣跨敤錛涜皟鐢ㄨ繘紼嬬殑鍙ユ焺鍙互琚獶LL浣跨敤銆?br />
DLLDLL鍙互鏈夎嚜宸辯殑鏁版嵁孌碉紝浣嗘病鏈夎嚜宸辯殑鍫嗘爤錛屼嬌鐢ㄨ皟鐢ㄨ繘紼嬬殑鏍堬紝涓庤皟鐢ㄥ畠鐨勫簲鐢ㄧ▼搴忕浉鍚岀殑鍫嗘爤妯″紡銆?br />
2)銆佸叧浜庡叡浜暟鎹
DLL瀹氫箟鐨勫叏灞鍙橀噺鍙互琚皟鐢ㄨ繘紼嬭闂紱DLL鍙互璁塊棶璋冪敤榪涚▼鐨勫叏灞鏁版嵁銆備嬌鐢ㄥ悓涓DLL鐨勬瘡涓涓繘紼嬮兘鏈夎嚜宸辯殑DLL鍏ㄥ眬鍙橀噺瀹炰緥銆傚鏋滃涓嚎紼嬪茍鍙戣闂悓涓鍙橀噺錛屽垯闇瑕佷嬌鐢ㄥ悓姝ユ満鍒訛紱瀵逛竴涓狣LL鐨勫彉閲忥紝濡傛灉甯屾湜姣忎釜浣跨敤DLL鐨勭嚎紼嬮兘鏈夎嚜宸辯殑鍊鹼紝鍒欏簲璇ヤ嬌鐢ㄧ嚎紼嬪眬閮ㄥ瓨鍌?(TLS錛孴hread Local Strorage)銆?br />
http://blog.sina.com.cn/s/blog_494e45fe0100l4wv.html
]]>
緇欑▼搴忚鏃跺浜庣▼搴忓憳鏉ヨ瀹炲湪鏄お閲嶈浜嗭紝鍦╳indows涓婄殑閭d釜clock錛堬級瀹炲湪鏄笉澶熺簿紜紝綺懼害鍙湁10ms錛岀湡璁╀漢闅捐繃銆傜爺絀朵簡涓媤indows涓嬩嬌鐢–銆丆++璁℃椂鐨勫嚱鏁幫紝緇欏ぇ瀹跺垎浜笅銆?
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv)
{
LARGE_INTEGER freq;
LARGE_INTEGER start_t, stop_t;
double exe_time;
QueryPerformanceFrequency(&freq);
fprintf(stdout, "The frequency of your pc is %d.\n", freq.QuadPart);
QueryPerformanceCounter(&start_t);
Sleep(1000);
QueryPerformanceCounter(&stop_t);
exe_time = 1e3*(stop_t.QuadPart-start_t.QuadPart)/freq.QuadPart;
fprintf(stdout, "Your program executed time is %fms.\n", exe_time);
getchar();
return 0;
}
typedef union _LARGE_INTEGER
{
struct
{
DWORD LowPart;
LONG HighPart;
};
struct
{
DWORD LowPart;
LONG HighPart;
} u;
LONGLONG QuadPart;
} LARGE_INTEGER, *PLARGE_INTEGER;
濡傛灉浣犱嬌鐢ㄧ殑緙栬瘧鍣ㄦ敮鎸?4浣嶆暣鏁幫紝閭d箞鍙互浣跨敤QuadPart鏉ュ紩鐢ㄥ彉閲忕殑鍊箋傚鏋滀綘鐨勭紪璇戝櫒涓嶆敮鎸?4浣嶆暣鏁幫紝閭d箞鍙互浣跨敤LowPart鍜孒ighPart鏉ュ紩鐢?4浣嶆暣鏁扮殑浣?2浣嶅拰楂?2浣嶃?/p>
]]>
鍒氬浜嗕竴鎷涳紝鍙互浣跨敤緙栬瘧鍣ㄧ殑-D閫夐」鏉ュ畾涔夌▼搴忎腑浣跨敤鐨勫畯銆?
#include <stdio.h>
int main(int argc, char **argv)
{
#ifdef MY_MAC
printf("Hello -D.\n");
#else
printf("MY_MAC was not defined.\n");
#endif
return 0;
}
銆愩? ./dtest
Hello -D.
銆愩?
銆愩? g++ ./dtest.c -o dtest
銆愩? ./dtest
MY_MAC was not defined.
#include <stdio.h>
int main(int argc, char **argv)
{
#ifdef MY_MAC
printf("Hello -D. %d\n", MY_MAC);
#else
printf("MY_MAC was not defined.\n");
#endif
return 0;
}
鎴戣緭鍑轟簡瀹忎唬琛ㄧ殑鍊箋?
銆愩? g++ -DMY_MAC=5 ./dtest.c -o dtest
銆愩? ./dtest
Hello -D. 5
銆愩?
銆愩?g++ -DMAC1=5 -DMAC2=6 soucefile.c
]]>
/*
* File: main.cpp
* Author: Vicky.H
* Email: eclipser@163.com
*/
#include <iostream>
#include <cstdlib>
#include <memory>
class A {
public:
A() {
std::cout << "create A" << std::endl;
}
A(const A& o) {
std::cout << "copy A" << std::endl;
}
~A() {
std::cout << "delete A" << std::endl;
}
};
/*
*
*/
int main(void) {
char* buf1 = (char*) malloc(10); //
char* buf2 = (char*) calloc(1, 10); // 鏁堟灉铏界劧涓庝笂闈竴鏍?涓嶅悓鐨勬槸,calloc浼氬皢絀洪棿鍒濆鍖栦負0.
free(buf1);
free(buf2);
std::cout << "---------------------------" << std::endl;
// 涓轟粈涔圕++涓笉寤鴻浣跨敤malloc calloc realloc絳塁璇█鍑芥暟?鍥犱負:榪欐牱鍒嗛厤鐨勭┖闂?榪斿洖鐨勬寚閽堥渶瑕侀氳繃free鏉ラ噴鏀?浣唂ree閲婃斁絀洪棿涓嶅悓浜巇elete,free涓嶄細鎵ц鏋愭瀯鍑芥暟!
A* ap = (A*) malloc(sizeof (class A) * 10);
std::uninitialized_fill_n(ap, 10, A());
free(ap); // 璋冪敤1嬈reate A ,1嬈elete A 10嬈opy A
return 0;
}

create A
copy A
copy A
copy A
copy A
copy A
copy A
copy A
copy A
copy A
copy A
delete A
]]>