锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
涓錛岀粨鏋勫竷灞
string鐨勫師鍨嬫槸
瀹冩槸basic_string涓涓猼ypedef錛岄鍏堟潵鐪媌asic_string鐨勭被灞傛緇撴瀯錛?br />
_Container_base_secure
聽聽聽聽聽聽 /\
聽聽聽聽聽聽 |
_String_base
聽聽聽聽聽聽 /\
聽聽聽聽聽聽 |
_String_val
聽聽聽聽聽聽 /\
聽聽聽聽聽聽 |
basic_string
_Container_base_secure閲屾湁涓涓猒Iterator_base綾誨瀷鐨勬寚閽堟垚鍛榑Myfirstiter錛屽緱鍗?涓瓧鑺傦紝_String_base娌℃湁鏁版嵁鎴愬憳錛宊String_val閲屾湁涓涓猒Alval綾誨瀷錛堜竴涓猘llocator錛夌殑鎴愬憳_Alty錛屾病鏈夋暟鎹垚鍛橈紝鍙崰鐢?涓瓧鑺傦紝鍔犱笂padding錛屼篃灝辨槸4涓瓧鑺傦紝basic_string鏈?涓暟鎹垚鍛橈紝涓涓猽nion鍗?6涓瓧鑺傦紝涓や釜璺熼暱搴︾浉鍏崇殑鏁村瀷鍙橀噺鍚?涓瓧鑺傘傛墍鏈夌被閮戒笉鍚櫄鍑芥暟錛屽竷灞濡備笅錛?br />
聽聽聽聽_Myfirstiter錛歘Iterator_base*聽聽(4聽bytes)
_String_base聽(nop)
_String_val
聽聽聽聽聽聽_Alty錛歘Alval聽聽(1聽byte聽+3 bytes聽padding)
聽聽聽聽聽聽
basic_string
聽聽聽聽_Bx聽聽聽聽聽聽聽聽:聽聽聽_Bxty聽聽聽聽聽聽聽(16聽bytes)
聽聽聽聽_Mysize聽:聽聽聽size_type聽聽聽(4聽bytes)
聽聽聽聽_Myres聽錛毬犅爏ize_type聽聽聽(4聽bytes)
榪欎釜鏄痓asic_string鐨剈nion:
union聽_Bxty
{聽
聽聽聽 _Elem聽 _Buf[_BUF_SIZE];
聽聽聽 _Elem*聽_Ptr;
}聽_Bx;
涓嬮潰鏄竴孌墊祴璇曟嫹璐濅笉鍚屽瓧絎︿覆闀垮害鐨勪唬鐮?
#include聽<stdio.h>
#include聽<iostream>
#include聽<string>
#include聽<vector>
using聽namespace聽std;
template聽<size_t聽N>
void聽test_string()
{
聽聽聽聽const聽size_t聽loop聽=聽1000000; // 涓鐧句竾嬈?br />聽聽聽
聽聽聽 // 棰勫厛鍒嗛厤濂藉唴瀛?br />聽聽聽聽vector<string>聽vec;
聽聽聽聽vec.resize(loop);
聽聽聽聽
聽聽聽聽char聽szbuf[N]聽=聽{};
聽聽聽聽memset(szbuf,聽'a',聽N聽-聽1);
聽聽聽 // 璁$畻鎷瘋礉鏃墮棿
聽聽聽聽size_t聽time聽=聽GetTickCount();
聽聽聽聽for聽(int聽i聽=聽0;聽i聽<聽loop;聽++i)
聽聽聽聽{
聽聽聽聽聽聽聽聽vec[i]聽=聽szbuf;
聽聽聽聽}
聽聽聽聽time聽=聽GetTickCount()聽-聽time;
聽聽聽聽printf("buffer聽size:聽%u,聽loop:聽%u,聽used聽%u聽ms\n",聽N,聽loop,聽time);
}
int聽main(int聽argc,聽char*聽argv[])
{
聽聽聽聽test_string<8>();
聽聽聽聽test_string<12>();
聽聽聽聽test_string<16>();
聽聽聽聽test_string<20>();
聽聽聽聽test_string<24>();
聽聽聽聽test_string<32>();
聽聽聽聽return聽0;
}
buffer size: 4, loop: 1000000, used 78 ms
buffer size: 8, loop: 1000000, used 94 ms
buffer size: 12, loop: 1000000, used 93 ms
buffer size: 16, loop: 1000000, used 94 ms
buffer size: 20, loop: 1000000, used 422 ms
buffer size: 24, loop: 1000000, used 422 ms
buffer size: 32, loop: 1000000, used 438 ms
鍦ㄥ瓧絎︿覆(鍖呭惈0緇撳熬瀛楃)灝忎簬16涓瓧鑺傜殑鏃跺欐秷鑰楃殑鏃墮棿閮藉緢浣庤屼笖鍑犱箮涓鑷?94ms)錛岃屼竴鏃﹁秴榪囦簡16涓瓧鑺傛秷鑰楁椂闂村垯榪呴熷鍔狅紝鍙樻垚浜?22ms錛堣繎5鍊嶏級銆傚彲浠ョ湅鍑猴紝濡傛灉浣跨敤闀垮害杈冨皬鐨勫瓧絎︿覆錛屽湪娑夊強澶ч噺鎷瘋礉澶勭悊鐨勬椂鍊欙紝vc榪欎釜鎶宸х殑鏁堢巼榪樻槸鎸洪珮鐨勩?br />
涓嬮潰鏄浉鍚屼唬鐮侀噰鐢ㄤ嬌鐢ㄤ簡Copy-On-Write鎶鏈殑GNU std::string鐨勮繍琛岀粨鏋滐紙Ubuntu + gcc4.4 + -O2鍙傛暟錛夛細
buffer size: 8, loop: 1000000, used 140 ms
buffer size: 12, loop: 1000000, used 119 ms
buffer size: 16, loop: 1000000, used 140 ms
buffer size: 20, loop: 1000000, used 126 ms
buffer size: 24, loop: 1000000, used 154 ms
buffer size: 32, loop: 1000000, used 129 ms
閫熷害澧為暱寰堝鉤鍧囷紝鍦?6瀛楄妭浠ヤ笅鐨勬椂鍊欑敤鏃舵瘮vc澶氾紝浣嗘槸瓚呰繃16瀛楄妭鍚庢晥鐜囨瘮vc楂橈紙緇嗚妭娌″幓鐮旂┒錛夈?br />
浜岋紝铏氭瀽鏋勫嚱鏁?br />
basic_string鍜屽畠鐨勫熀綾籣Container_base_secure鐨勬瀽鏋勫嚱鏁伴兘涓嶆槸virutual function錛岃繖鍦ㄧ戶鎵跨殑鏃跺欎細鏈夊壇浣滅敤錛屽厛鐪嬩笅闈㈣繖孌典唬鐮侊細
{
public:
聽聽聽聽~mystring()
聽聽聽聽{
聽聽聽聽聽聽聽聽cout聽<<聽"dctor"聽<<聽endl;
聽聽聽聽}
};
void聽main()
{
聽聽聽聽std::string*聽pstr聽=聽new聽mystring();
聽聽聽聽delete聽pstr;聽 // ~mystring()娌℃湁琚皟鐢?br />}
娌℃湁铏氬嚱鏁版墍浠ユ瀽鏋勫嚱鏁版棤娉曞姩鎬佺粦瀹氾紝涓婇潰鐨勪唬鐮佽繍琛屽埌delete鏃跺皢鐩存帴璋冪敤std::string鐨勬瀽鏋勫嚱鏁幫紝鑰屼笉浼氬幓鎵緈ystring鐨勬瀽鏋勫嚱鏁般傚鏋渵mystring娑夊強鍒拌祫婧愰噴鏀劇殑璇濓紝閭d箞鏃犵枒涓婇潰鐨勪唬鐮佸皢瀵艱嚧娉勬紡銆?br />
榪樻湁涓鐐瑰煎緱涓鎻愮殑灝辨槸瀵箂td::string鎴栧寘鍚玸td::string鐨勫璞″疄鏂絑eroMemory
铏界劧澶у鏁板悎鏍肩殑C++紼嬪簭鍛橀兘鐭ラ亾涓嶅簲璇ュ闈濸OD瀵硅薄瀹炴柦ZeroMomory錛屼絾鏄湪宸ョ▼瀹為檯涓‘瀹炴湁榪欐牱鐨勪唬鐮侊紝鑰屼笖浠栦滑榪愯鐨勫緢姝e父(vc++涓?錛岃繖鏄負浠涔堝憿錛熸垜璇曞浘鍋氫竴涓畝鍗曡В閲娿?br />
濡備笂鎵榪幫紝std::string鐨勭戶鎵夸綋緋婚噷娌℃湁virtual function錛屽璞″竷灞閲屼篃灝辨病鏈塿ptr錛岃屼笖鏁翠釜緇ф壙浣撶郴閮介噰鐢ㄧ殑鏄崟緇ф壙錛宐ptr鍙堢渷浜嗭紙鍙傝僉ippman鐨?lt;Inside C++ Object Model>錛夛紝鎵浠td::string瀵硅薄鐨勫竷灞鍏ㄦ槸瀹冪殑鑷韓鐨勬暟鎹垚鍛橈紝_Container_base_secure鐨刜Myfirstiter鏄寚閽堟垚鍛橈紝鏈韓鍦ㄥ垵濮嬪寲鏃跺氨闇瑕佺疆闆訛紝_String_val鐨刜Alval鎴愬憳鏄釜allocator錛屽彧鏈夊嚱鏁頒笉鍖呭惈鏁版嵁錛岃皟鐢ㄦ椂涔熷氨涓嶅繀浼爐his鎸囬拡錛屾墍浠ョ粰瀹冪疆闆朵笉浼氭湁鍓綔鐢紝basic_string鎸囬拡鏈韓鐨勪笁涓垚鍛樺垎鍒槸緙撳啿鍖猴紝瀛楃涓查暱搴﹀拰棰勭暀闀垮害錛屽垵濮嬪寲鏃跺皢瀹冧滑緗浂涔熸槸娌℃湁鍓綔鐢ㄧ殑銆傛墍浠ュstd::string榪涜ZeroMemory鎿嶄綔鐨勪唬鐮佷緷鐒惰繍琛岀殑寰堟甯搞?br />
騫沖父閮芥槸鎶婃潯浠惰繍綆楃褰撲綔綆鍖杋f/else浠g爜琛屾暟鐨勫彟涓縐嶅艦寮忥紝浠婂ぉ鍋剁劧鍐欎笅浜嗕笅闈㈣繖鐮d唬鐮侊紝灝辨槸璁╃浜屼釜鍜岀涓変釜琛ㄨ揪寮忕殑鍏鋒湁涓嶅悓綾誨瀷錛岀湅鐪媠izeof鐨勭粨鏋滐細
int聽main()
{
聽聽聽 int聽n聽=聽sizeof((聽true聽?聽3聽:聽3.14);聽聽聽聽//聽涓嶅悓鐨勭被鍨?/span>
聽聽聽 printf(鈥淭ype聽size:聽%d\n鈥?聽n);
聽聽聽 return聽0;
}
緇撴灉鏄?聽 Type size: 8
浜岋紝緇嗚妭
涓涓?a >鏉′歡鎿嶄綔絎?/a>鏄笅闈㈣繖鏍風殑褰㈠紡:
exp1 ? exp2 : exp3
琛ㄨ揪寮廵xp1鎬繪槸浼氳姹傚箋俥xp2鍜宔xp3鏄惁琚墽琛屼緷璧栦簬exp1鐨勫鹼紝濡傛灉exp1涓虹湡鍒檈xp2浼氳姹傚鹼紝鍚﹀垯exp3琚眰鍊箋?br />
Side Effect:
鍦ㄦ墽琛宔xp2鎴栬卐xp3涔嬪墠錛宔xp1鐨勬墍鏈塻ide effect蹇呴』鍏ㄩ儴姹傚兼垨鑰呮洿鏂板畬鎴愶紝鍥犱負鏉′歡鎿嶄綔絎︾殑絎竴涓搷浣滄暟姹傚間箣鍚庡氨鏄竴涓?a >sequence point銆傚鏋渆xp2鍜宔xp3閮芥湁side effect錛岄偅涔堝彧鏈変竴涓細琚眰鍊箋?br />
榪斿洖綾誨瀷錛?br />
鏉′歡鎿嶄綔絎︾殑榪斿洖綾誨瀷鍙栧喅浜巈xp2鍜宔xp3綾誨瀷錛岀紪璇戝櫒浼氭鏌xp2錛堝彲鑳芥槸涓涓猚lass type錛夎兘鍚﹁漿鎹負exp3鎴栬卐xp3鑳藉惁杞崲涓篹xp2錛屽鏋滀袱涓兘涓嶆弧瓚籌紝緙栬瘧鍣ㄥ氨浼氭姏鍑轟竴涓敊璇?br />
涓夛紝瀹炶返
鍙exp2鎴杄xpr3鑳借漿鎹負瀵規(guī)柟鐨勭被鍨嬶紝閭d箞鏉′歡鎿嶄綔絎﹀氨鍙互閫氳繃緙栬瘧鍣紝濡傛灉瀹冧滑涔嬮棿娌℃湁鑳藉杞崲鐨勮鍒欙紝鑷劧榪囦笉浜嗙紪璇戝櫒榪欎竴鍏籌紝濡備笅闈㈣繖琛屼唬鐮?
sizeof(true ? 鈥渢ext鈥?: 3.14);聽聽 聽// error
sizeof(true ? 鈥渢ext鈥?: 0);聽聽 聽// OK, bug or feature?
涓轟簡鍒╃敤C++緇欐垜浠彁渚涚殑寮虹被鍨嬫敮鎸侊紝鎴戜滑搴旇鍦ㄥ疄璺典腑璁〆xp2鍜宔xp3鐨勭被鍨嬩繚鎸佷竴鑷淬?br />
鍙﹀錛?a >BOOST_FOREACH閲岄潰鐢ㄥ埌浜嗘潯浠舵搷浣滅鐨勮繖涓妧宸ф潵钀冨彇瀹瑰櫒琛ㄨ揪寮忕被鍨嬶紝鍚屾椂閬垮厤瀵硅〃杈懼紡姹傚鹼紝浠ユ杈懼埌瀵箁value鐨勫畬緹庢敮鎸侊紝鍏朵腑鐨勪唬鐮佸涓嬶細
//聽綾誨瀷鍖呰鍣?/span>
template<聽class聽T聽>聽struct聽type2type聽{};
//聽杞崲T鍒皌ype2type<t>
template<聽class聽T聽>
type2type<聽T聽>聽encode_type(聽T聽const聽&聽t聽)
{
聽聽聽聽return聽type2type<聽T聽>();
}
//聽瀹氫箟浜嗗埌any2type<t>鐨勮漿鎹?/span>
struct聽any_type
{
聽聽聽聽template<聽class聽T聽>
聽聽聽聽operator聽type2type<聽T聽>聽()聽const
聽聽聽聽{
聽聽聽聽聽聽聽聽return聽type2type<聽T聽>();
聽聽聽聽}
};
//聽灝嗚〃杈懼紡鐨勭被鍨嬭漿鎹負type2type<聽expression>錛屽茍閬垮厤瀵孤爀xpression姹傚?/span>
#define聽ENCODED_TYPEOF(聽expression聽)聽聽聽聽聽聽聽聽 (聽true聽?聽any_type()聽:聽encode_type(聽expression聽)聽)
ENCODED_TYPEOF(expression)浼氳灞曞紑涓?(true ? any_type() : encode_type(expression))錛宔xp2鐨勭被鍨嬩負any_type錛宔xp3鐨勭被鍨嬩負type2type<expression>錛屼袱涓〃杈懼紡鐨勭被鍨嬭涓鑷達紝type2type<expression>鍙堜笉鑳借漿鎹負any_type錛屾墍浠ュ彧鏈夌粰any_type瀹氫箟涓涓漿鎹㈡搷浣滅錛岃any_type鑳藉杞崲涓簍ype2type<expression>銆?br />
鏈鍚庢垜浠緱鍒癊NCODE_TYPEOF(expression)鐨勭被鍨嬩負type2type< expression>錛屽茍涓旀病鏈夊 expression姹傚箋?br />
鍙傝?
http://drdobbs.com/cpp/184401310
http://geeksforgeeks.org/?p=9205
http://www.artima.com/cppsource/foreach2.html
榪欓噷涓轟簡涓句緥鏂逛究錛屽亣璁句紶閫掔殑3涓兘鏄痠nt綾誨瀷鐨勫弬鏁般備唬鐮侊細
void聽fun(int聽n,聽);
int聽main()
{
聽聽聽聽int聽par1聽=聽128;
聽聽聽聽int聽par2聽=聽256;
聽聽聽聽int聽par3聽=聽512;
聽聽聽聽fun(par1,聽par2,聽par3聽);
聽聽聽聽return聽0;
}
void聽fun(int聽par1,聽)
{
聽聽聽聽int*聽p聽=聽&par1;聽聽聽聽聽聽聽聽聽聽聽聽聽//鑾峰彇par1鐨勫湴鍧聽聽聽
聽聽聽聽printf("%d聽\n",聽*++p);聽聽聽聽聽聽//鎵撳嵃par2鐨勫?/span>
聽聽聽聽printf("%d聽\n",聽*++p);聽聽聽聽聽聽//鎵撳嵃par3鐨勫?/span>
}
C榛樿鐨勫嚱鏁拌皟鐢ㄨ鑼冩槸__cdecl,涔熷氨鏄墍鏈夊弬鏁頒粠鍙沖埌宸︿緷嬈″叆鏍堬紝涓ユ牸鐨刦un澹版槑搴旇鏄?
void __cdecl fun(int n, ...);
鐢變簬鍏ユ爤欏哄簭鏄粠鍙沖悜宸︼紝鎵浠ain緇欎紶閫掔殑par1,par2鍜宲ar3鐨勫叆鏍堥『搴忔槸錛?br />
push聽聽聽 par3
push聽聽聽 par2
push聽聽聽 par1
褰撶劧姹囩紪浠g爜(wintel)鏇村彲鑳芥槸錛?br />
mov聽聽聽聽聽聽聽聽 eax,dword ptr [par3]
push聽聽聽聽聽聽聽 eax
mov聽聽聽聽聽聽聽聽 ecx,dword ptr [par2]
push聽聽聽聽聽聽聽 ecx
mov聽聽聽聽聽聽聽聽 edx,dword ptr [par1]
push聽聽聽聽聽聽聽 edx
鏈鍚庡啀call fun,鎵ц鍑芥暟浣撶殑浠g爜銆?br />
鍏堝帇鏍堢殑鍙傛暟浼氭斁鍦ㄩ珮鍦板潃錛屽洜涓烘爤鏄敱涓婂線涓嬬敓闀跨殑錛屾墍浠ar1錛宲ar2錛宲ar3鍦ㄥ唴瀛樹腑鐨勯『搴忓皢浼氭槸錛?br />
0xFE6C 聽聽聽聽聽聽 par3
0xFE70聽聽聽聽聽聽聽聽 par2
0xFE74 聽聽聽聽聽聽聽 par1
鍦板潃鏄亣璁撅紝浣嗚窛紱誨簲璇ユ槸sizeof(int)鐨勫?4涓瓧鑺?銆?br />
鍙﹀錛屾爣鍑嗗簱閲岀殑printf涓鏃忕殑搴撳嚱鏁?sprintf, fprintf)閭f牱鎺ュ彈鍙彉鍙傛暟涓暟鐨勫嚱鏁頒篃鍙湁鐢╟decl鎵嶈兘澶熷疄鐜般傚亣璁炬湁涓嬮潰涓琛岃鍙ワ細
printf("%d %d %d \n", m, n, k);
鍙互鐪嬪埌瀹冩槸閫氳繃鎶婂弬鏁扮殑涓暟鍜岀被鍨嬩繚瀛樺湪絎竴涓弬鏁版潵瀹炵幇姝g‘瀵誨潃鐨勩傛牸寮忕%d鎸囧畾浜嗚璇誨彇鐨勭被鍨嬶紝鑰屾牸寮忕鐨勬暟鐩寚瀹氫簡浼犻掑弬鏁扮殑涓暟銆傝繖灝辨槸涓轟粈涔坧rintf("%d %d \n", m, n, k)鍙互鎴愬姛鎵ц錛岃宲rintf("%d %d %d \n", m,
n)浼氬け璐ョ殑鍘熷洜銆備紶閫掔殑鍙傛暟澶氫簬闇瑕佸鐞嗙殑鏁扮洰鏃跺彲浠ュ拷鐣ユ帀錛屼絾鏄皯浜庨渶瑕佸鐞嗙殑鏁扮洰鏃跺氨璁塊棶瓚婄晫浜嗐?br />
浜岋紝
鎴戜滑閫氬父浼氫嬌鐢–璇█鐨剉arargs瀹忔潵緙栧啓鏀寔鍙彉鍙傛暟鍒楄〃鐨勫嚱鏁幫紝鍦ˋNSI C鏍囧噯閲岋紝榪欎簺瀹忓寘鍚湪
涓嬮潰鍐嶅垎鏋愪竴涓媣arargs瀹忥紝澧炲姞varargs瀹忓悗鐨勪唬鐮侊細
#include聽stdarg.h>
void聽__cdecl聽fun(int聽n,聽);
int聽main()
{
聽聽聽聽int聽par1聽=聽128;
聽聽聽聽int聽par2聽=聽256;
聽聽聽聽int聽par3聽=聽512;
聽聽聽聽fun(par1,聽par2,聽par3聽);
聽聽聽聽return聽0;
}
void聽fun(int聽n,聽)
{
聽聽聽聽va_list聽ap;
聽聽聽聽va_start(ap,聽n);
聽聽聽聽printf("%d聽\n",聽va_arg(ap,聽int));
聽聽聽聽printf("%d聽\n",聽va_arg(ap,聽int));
聽聽聽聽va_end(ap);
}
鍦∕icrosoft涓篤C鎻愪緵鐨勫疄鐜頒腑錛屽彲浠ョ湅鍒拌繖鏍風殑瀹氫箟錛?br />
#define聽_INTSIZEOF(n)聽聽聽(聽(sizeof(n)聽+聽sizeof(int)聽-聽1)聽&聽~(sizeof(int)聽-聽1)聽)
typedef聽char*聽va_list;
#define聽va_start(ap,v)聽(聽ap聽=聽(va_list)_ADDRESSOF(v)聽+聽_INTSIZEOF(v)聽)
#define聽va_arg(ap,t)聽聽聽聽(聽*(t聽*)((ap聽+=聽_INTSIZEOF(t))聽-聽_INTSIZEOF(t))聽)
#define聽va_end(ap)聽聽聽聽聽聽(聽ap聽=聽(va_list)0聽)
va_list聽聽聽聽 涓涓猚har鍨嬫寚閽堬紝姣忔鍗曚釜瀛楄妭瀵誨潃銆?
va_start聽聽聽 閫氳繃_INTSIZEOF璁$畻綾誨瀷鐨勫ぇ灝忥紝騫惰ap鑾峰緱v鍚庨潰鍙傛暟瀵硅薄鐨勫湴鍧聽聽聽聽聽聽聽
va_arg聽聽聽 聽 ap鎸囧悜鍙傛暟鍒楄〃涓璦p涓嬩竴涓弬鏁板璞★紝騫惰繑鍥瀉p涔嬪墠鎸囧悜鐨則綾誨瀷鍙傛暟瀵硅薄
灝唙a_list絳夊畯榪樺師鍚庝細鏇存槑鐧戒竴鐐癸細)
{
聽聽聽聽int聽par2,聽par3;
聽聽聽聽char*聽聽聽ap;聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽//va_list聽ap;
聽聽聽聽ap聽=聽(char*)&par1聽+聽4;聽聽聽聽聽聽//va_start(ap,聽par1);
聽聽聽聽par2聽=聽*(int*)(ap+=4聽-聽4);聽//m聽=聽va_arg(ap,聽int);
聽聽聽聽par3聽=聽*(int*)(ap+=4聽-聽4);聽//m聽=聽va_arg(ap,聽int);
聽聽聽聽ap聽=聽(char*)0;聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽//va_end(ap);
}
鏍規(guī)嵁榪欎釜瀹炵幇錛寁a_arg鐨勭浜屼釜鍙傛暟鑻ヤ負char, short鍒欎細琚漿鎹負int綾誨瀷錛岃嫢涓篺loat鍒欎細杞崲涓篸oule綾誨瀷錛岃繖鏄洜涓篲INTSIZEOF瀹忕殑榪斿洖鍊?4鎴?)鐨勫師鍥狅紝姣曠珶瀹忕敤C鏉ュ仛娉涘瀷榪樻槸涓嶅C++鐨勬ā鏉挎潵鐨勫ソ銆?br />
涓夛紝
鏍規(guī)嵁鏍囧噯搴撴彁渚涚殑va_list鎴戜滑鍙互瀹炵幇鑷繁鐨勮兘鎺ュ彈鍙彉鍙傛暟鐨勫垪琛ㄧ殑鍑芥暟錛屼笅闈互Win32API涓殑MessageBox浣滀負璇曢獙銆?br />
鍦╳indows紼嬪簭璁捐涓湁鏃跺欎篃闇瑕佽緭鍑轟竴浜涜皟璇曚俊鎭紝浣嗘槸榪欎釜鏃跺欏鏋滄牴鎹湪鎺у埗鍙頒笅鐨勭紪紼嬩範鎯嬌鐢╬rintf()鍑芥暟鏉ュ疄鐜板皢淇℃伅杈撳嚭鍒扮獥鍙g殑
璇濇槸姣旇緝楹葷儲鐨勶紝榪欐牱鍙互閫夋嫨涓涓渶綆鍗曠殑Windows紿楀彛鍑芥暟MessageBox銆備絾鏄疢essageBox()鐨勫弬鏁扮被鍨嬫槸瀛楃涓詫紝鎵浠ユ垜浠渶瑕?
瀵瑰畠鍋氫竴浜涙牸寮忓寲銆傝繖灝遍渶瑕佺敤鍒版爣鍑嗗簱鐨剉sprintf鍑芥暟(榪欓噷)銆?br />
#include聽stdarg.h>聽聽聽聽聽 //聽va_list,聽va_start(),聽va_end()
#include聽windows.h>聽聽聽聽聽//聽MessageBoxA()
void聽my_messagebox(const聽char*聽format,聽)
{
聽聽聽聽char聽聽聽聽聽聽聽聽buffer[MAX_PATH]聽=聽{0};//260涓瓧鑺傜殑緙撳啿
聽聽聽聽va_list聽聽聽聽聽ap;聽聽聽
聽聽聽聽va_start(ap,聽format);
聽聽聽聽vsprintf(buffer,聽format,聽ap);
聽聽聽聽va_end(ap);
聽聽聽聽::MessageBoxA(NULL,聽buffer,聽"",聽MB_OK);//ANSCII鐗堟湰鐨凪essageBox()
}