锘??xml version="1.0" encoding="utf-8" standalone="yes"?>a4yy欧美一区二区三区,国产日韩精品一区二区浪潮av,欧美日韩日本国产亚洲在线http://www.shnenglu.com/apollo/articles/GCCComplate.html絎戠瑧鐢?/dc:creator>絎戠瑧鐢?/author>Sat, 04 Mar 2006 12:08:00 GMThttp://www.shnenglu.com/apollo/articles/GCCComplate.htmlhttp://www.shnenglu.com/apollo/comments/3720.htmlhttp://www.shnenglu.com/apollo/articles/GCCComplate.html#Feedback0http://www.shnenglu.com/apollo/comments/commentRss/3720.htmlhttp://www.shnenglu.com/apollo/services/trackbacks/3720.html
gcc and g++鍒嗗埆鏄痝nu鐨刢 & c++緙栬瘧鍣?gcc/g++鍦ㄦ墽琛岀紪璇戝伐浣滅殑鏃跺欙紝鎬誨叡闇瑕?姝?

1.棰勫鐞?鐢熸垚.i鐨勬枃浠禰棰勫鐞嗗櫒cpp]
2.灝嗛澶勭悊鍚庣殑鏂囦歡涓嶈漿鎹㈡垚姹囩紪璇█,鐢熸垚鏂囦歡.s[緙栬瘧鍣╡gcs]
3.鏈夋眹緙栧彉涓虹洰鏍囦唬鐮?鏈哄櫒浠g爜)鐢熸垚.o鐨勬枃浠禰姹囩紪鍣╝s]
4.榪炴帴鐩爣浠g爜,鐢熸垚鍙墽琛岀▼搴廩閾炬帴鍣╨d]
[鍙傛暟璇﹁В]
-x language filename
銆 璁懼畾鏂囦歡鎵浣跨敤鐨勮璦,浣垮悗緙鍚嶆棤鏁?瀵逛互鍚庣殑澶氫釜鏈夋晥.涔熷氨鏄牴鎹害瀹欳璇█鐨勫悗
緙鍚嶇О鏄?c鐨勶紝鑰孋++鐨勫悗緙鍚嶆槸.C鎴栬?cpp,濡傛灉浣犲緢涓э紝鍐沖畾浣犵殑C浠g爜鏂囦歡鐨勫悗緙
鍚嶆槸.pig 鍝堝搱錛岄偅浣犲氨瑕佺敤榪欎釜鍙傛暟,榪欎釜鍙傛暟瀵逛粬鍚庨潰鐨勬枃浠跺悕閮借搗浣滅敤錛岄櫎闈炲埌浜?
涓嬩竴涓弬鏁扮殑浣跨敤銆?
銆銆鍙互浣跨敤鐨勫弬鏁板悧鏈変笅闈㈢殑榪欎簺
銆銆`c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a
ssembler-with-cpp'.
銆銆鐪嬪埌鑻辨枃錛屽簲璇ュ彲浠ョ悊瑙g殑銆?
銆銆渚嬪瓙鐢ㄦ硶:
銆銆gcc -x c hello.pig
銆銆
-x none filename
銆銆鍏蟲帀涓婁竴涓夐」錛屼篃灝辨槸璁ゞcc鏍規(guī)嵁鏂囦歡鍚嶅悗緙錛岃嚜鍔ㄨ瘑鍒枃浠剁被鍨?
銆銆渚嬪瓙鐢ㄦ硶:
銆銆gcc -x c hello.pig -x none hello2.c
銆銆
-c
銆銆鍙縺媧婚澶勭悊,緙栬瘧,鍜屾眹緙?涔熷氨鏄粬鍙妸紼嬪簭鍋氭垚obj鏂囦歡
銆銆渚嬪瓙鐢ㄦ硶:
銆銆gcc -c hello.c
銆銆浠栧皢鐢熸垚.o鐨刼bj鏂囦歡
-S
銆銆鍙縺媧婚澶勭悊鍜岀紪璇戯紝灝辨槸鎸囨妸鏂囦歡緙栬瘧鎴愪負(fù)姹囩紪浠g爜銆?
銆銆渚嬪瓙鐢ㄦ硶
銆銆gcc -S hello.c
銆銆浠栧皢鐢熸垚.s鐨勬眹緙栦唬鐮侊紝浣犲彲浠ョ敤鏂囨湰緙栬緫鍣ㄥ療鐪?
-E
銆銆鍙縺媧婚澶勭悊,榪欎釜涓嶇敓鎴愭枃浠?浣犻渶瑕佹妸瀹冮噸瀹氬悜鍒頒竴涓緭鍑烘枃浠墮噷闈?
銆銆渚嬪瓙鐢ㄦ硶:
銆銆gcc -E hello.c > pianoapan.txt
銆銆gcc -E hello.c | more
銆銆鎱㈡參鐪嬪惂,涓涓猦ello word 涔熻涓庡鐞嗘垚800琛岀殑浠g爜
-o
銆銆鍒跺畾鐩爣鍚嶇О,緙虹渷鐨勬椂鍊?gcc 緙栬瘧鍑烘潵鐨勬枃浠舵槸a.out,寰堥毦鍚?濡傛灉浣犲拰鎴戞湁鍚屾劅
錛屾敼鎺夊畠,鍝堝搱
銆銆渚嬪瓙鐢ㄦ硶
銆銆gcc -o hello.exe hello.c (鍝?windows鐢ㄤ範(fàn)鎯簡)
銆銆gcc -o hello.asm -S hello.c
-pipe
銆銆浣跨敤綆¢亾浠f浛緙栬瘧涓復(fù)鏃舵枃浠?鍦ㄤ嬌鐢ㄩ潪gnu姹囩紪宸ュ叿鐨勬椂鍊?鍙兘鏈変簺闂
銆銆gcc -pipe -o hello.exe hello.c
-ansi
銆銆鍏抽棴gnu c涓笌ansi c涓嶅吋瀹圭殑鐗規(guī)?嬋媧籥nsi c鐨勪笓鏈夌壒鎬?鍖呮嫭紱佹涓浜沘sm inl
ine typeof鍏抽敭瀛?浠ュ強(qiáng)UNIX,vax絳夐澶勭悊瀹?
-fno-asm
銆銆姝ら夐」瀹炵幇ansi閫夐」鐨勫姛鑳界殑涓閮ㄥ垎錛屽畠紱佹灝哸sm,inline鍜宼ypeof鐢ㄤ綔鍏抽敭瀛椼?
銆銆銆銆
-fno-strict-prototype
銆銆鍙g++璧蜂綔鐢?浣跨敤榪欎釜閫夐」,g++灝嗗涓嶅甫鍙傛暟鐨勫嚱鏁?閮借涓烘槸娌℃湁鏄懼紡鐨勫鍙傛暟
鐨勪釜鏁板拰綾誨瀷璇存槑,鑰屼笉鏄病鏈夊弬鏁?
銆銆鑰実cc鏃犺鏄惁浣跨敤榪欎釜鍙傛暟,閮藉皢瀵規(guī)病鏈夊甫鍙傛暟鐨勫嚱鏁?璁や負(fù)鍩庢病鏈夋樉寮忚鏄庣殑綾誨瀷

銆銆
-fthis-is-varialble
銆銆灝辨槸鍚戜紶緇焎++鐪嬮綈,鍙互浣跨敤this褰撲竴鑸彉閲忎嬌鐢?
銆銆
-fcond-mismatch
銆銆鍏佽鏉′歡琛ㄨ揪寮忕殑絎簩鍜岀涓夊弬鏁扮被鍨嬩笉鍖歸厤,琛ㄨ揪寮忕殑鍊煎皢涓簐oid綾誨瀷
銆銆
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
銆銆榪欏洓涓弬鏁版槸瀵筩har綾誨瀷榪涜璁劇疆,鍐沖畾灝哻har綾誨瀷璁劇疆鎴恥nsigned char(鍓嶄袱涓弬
鏁?鎴栬?signed char(鍚庝袱涓弬鏁?
銆銆
-include file
銆銆鍖呭惈鏌愪釜浠g爜,綆鍗曟潵璇?灝辨槸渚夸互鏌愪釜鏂囦歡,闇瑕佸彟涓涓枃浠剁殑鏃跺?灝卞彲浠ョ敤瀹冭
瀹?鍔熻兘灝辯浉褰撲簬鍦ㄤ唬鐮佷腑浣跨敤#include<filename>
銆銆渚嬪瓙鐢ㄦ硶:
銆銆gcc hello.c -include /root/pianopan.h
銆銆
-imacros file
銆銆灝唂ile鏂囦歡鐨勫畯,鎵╁睍鍒癵cc/g++鐨勮緭鍏ユ枃浠?瀹忓畾涔夋湰韜茍涓嶅嚭鐜板湪杈撳叆鏂囦歡涓?
銆銆
-Dmacro
銆銆鐩稿綋浜嶤璇█涓殑#define macro
銆銆
-Dmacro=defn
銆銆鐩稿綋浜嶤璇█涓殑#define macro=defn
銆銆
-Umacro
銆銆鐩稿綋浜嶤璇█涓殑#undef macro
-undef
銆銆鍙栨秷瀵逛換浣曢潪鏍囧噯瀹忕殑瀹氫箟
銆銆
-Idir
銆銆鍦ㄤ綘鏄敤#include"file"鐨勬椂鍊?gcc/g++浼?xì)鍏堝湪褰撳墠鐩綍鏌ユ壘浣犳墍鍒跺畾鐨勫ご鏂囦歡,濡?
鏋滄病鏈夋壘鍒?浠栧洖鍒扮己鐪佺殑澶存枃浠剁洰褰曟壘,濡傛灉浣跨敤-I鍒跺畾浜嗙洰褰?浠?
銆銆鍥炲厛鍦ㄤ綘鎵鍒跺畾鐨勭洰褰曟煡鎵?鐒跺悗鍐嶆寜甯歌鐨勯『搴忓幓鎵?
銆銆瀵逛簬#include<file>,gcc/g++浼?xì)鍒?I鍒跺畾鐨勭洰褰曟煡鎵?鏌ユ壘涓嶅埌,鐒跺悗灝嗗埌緋葷粺鐨勭己
鐪佺殑澶存枃浠剁洰褰曟煡鎵?
銆銆
-I-
銆銆灝辨槸鍙栨秷鍓嶄竴涓弬鏁扮殑鍔熻兘,鎵浠ヤ竴鑸湪-Idir涔嬪悗浣跨敤
銆銆
-idirafter dir
銆銆鍦?I鐨勭洰褰曢噷闈㈡煡鎵懼け璐?璁插埌榪欎釜鐩綍閲岄潰鏌ユ壘.
銆銆
-iprefix prefix
-iwithprefix dir
銆銆涓鑸竴璧蜂嬌鐢?褰?I鐨勭洰褰曟煡鎵懼け璐?浼?xì)鍒皃refix+dir涓嬫煡鎵?
銆銆
-nostdinc
銆銆浣跨紪璇戝櫒涓嶅啀緋葷粺緙虹渷鐨勫ご鏂囦歡鐩綍閲岄潰鎵懼ご鏂囦歡,涓鑸拰-I鑱斿悎浣跨敤,鏄庣‘闄愬畾澶?
鏂囦歡鐨勪綅緗?
銆銆
-nostdin C++
銆銆瑙勫畾涓嶅湪g++鎸囧畾鐨勬爣鍑嗚礬緇忎腑鎼滅儲,浣嗕粛鍦ㄥ叾浠栬礬寰勪腑鎼滅儲,.姝ら夐」鍦ㄥ垱libg++搴?
浣跨敤
銆銆
-C
銆銆鍦ㄩ澶勭悊鐨勬椂鍊?涓嶅垹闄ゆ敞閲婁俊鎭?涓鑸拰-E浣跨敤,鏈夋椂鍊欏垎鏋愮▼搴忥紝鐢ㄨ繖涓緢鏂逛究鐨?

銆銆
-M
銆銆鐢熸垚鏂囦歡鍏寵仈鐨勪俊鎭傚寘鍚洰鏍囨枃浠舵墍渚濊禆鐨勬墍鏈夋簮浠g爜浣犲彲浠ョ敤gcc -M hello.c
鏉ユ祴璇曚竴涓嬶紝寰堢畝鍗曘?
銆銆
-MM
銆銆鍜屼笂闈㈢殑閭d釜涓鏍鳳紝浣嗘槸瀹冨皢蹇界暐鐢?include<file>閫犳垚鐨勪緷璧栧叧緋匯?
銆銆
-MD
銆銆鍜?M鐩稿悓錛屼絾鏄緭鍑哄皢瀵煎叆鍒?d鐨勬枃浠墮噷闈?
銆銆
-MMD
銆銆鍜?MM鐩稿悓錛屼絾鏄緭鍑哄皢瀵煎叆鍒?d鐨勬枃浠墮噷闈?
銆銆
-Wa,option
銆銆姝ら夐」浼犻抩ption緇欐眹緙栫▼搴?濡傛灉option涓棿鏈夐楀彿,灝卞皢option鍒嗘垚澶氫釜閫夐」,鐒?
鍚庝紶閫掔粰浼?xì)姹嚲~栫▼搴?
銆銆
-Wl.option
銆銆姝ら夐」浼犻抩ption緇欒繛鎺ョ▼搴?濡傛灉option涓棿鏈夐楀彿,灝卞皢option鍒嗘垚澶氫釜閫夐」,鐒?
鍚庝紶閫掔粰浼?xì)杩炴帴绋嬪?
銆銆
-llibrary
銆銆鍒跺畾緙栬瘧鐨勬椂鍊欎嬌鐢ㄧ殑搴?
銆銆渚嬪瓙鐢ㄦ硶
銆銆gcc -lcurses hello.c
銆銆浣跨敤ncurses搴撶紪璇戠▼搴?
銆銆
-Ldir
銆銆鍒跺畾緙栬瘧鐨勬椂鍊欙紝鎼滅儲搴撶殑璺緞銆傛瘮濡備綘鑷繁鐨勫簱錛屽彲浠ョ敤瀹冨埗瀹氱洰褰曪紝涓嶇劧
銆銆緙栬瘧鍣ㄥ皢鍙湪鏍囧噯搴撶殑鐩綍鎵俱傝繖涓猟ir灝辨槸鐩綍鐨勫悕縐般?
銆銆
-O0
-O1
-O2
-O3
銆銆緙栬瘧鍣ㄧ殑浼樺寲閫夐」鐨?涓駭鍒紝-O0琛ㄧず娌℃湁浼樺寲,-O1涓虹己鐪佸鹼紝-O3浼樺寲綰у埆鏈楂樸
銆 銆銆
-g
銆銆鍙槸緙栬瘧鍣紝鍦ㄧ紪璇戠殑鏃跺欙紝浜х敓璋冭瘯淇℃伅銆?
銆銆
-gstabs
銆銆姝ら夐」浠tabs鏍煎紡澹扮О璋冭瘯淇℃伅,浣嗘槸涓嶅寘鎷琯db璋冭瘯淇℃伅.
銆銆
-gstabs+
銆銆姝ら夐」浠tabs鏍煎紡澹扮О璋冭瘯淇℃伅,騫朵笖鍖呭惈浠呬緵gdb浣跨敤鐨勯澶栬皟璇曚俊鎭?
銆銆
-ggdb
銆銆姝ら夐」灝嗗敖鍙兘鐨勭敓鎴恎db鐨勫彲浠ヤ嬌鐢ㄧ殑璋冭瘯淇℃伅.
-static
銆銆姝ら夐」灝嗙姝嬌鐢ㄥ姩鎬佸簱錛屾墍浠ワ紝緙栬瘧鍑烘潵鐨勪笢瑗匡紝涓鑸兘寰堝ぇ錛屼篃涓嶉渶瑕佷粈涔?
鍔ㄦ佽繛鎺ュ簱錛屽氨鍙互榪愯.
-share
銆銆姝ら夐」灝嗗敖閲忎嬌鐢ㄥ姩鎬佸簱錛屾墍浠ョ敓鎴愭枃浠舵瘮杈冨皬錛屼絾鏄渶瑕佺郴緇熺敱鍔ㄦ佸簱.
-traditional
銆銆璇曞浘璁╃紪璇戝櫒鏀寔浼犵粺鐨凜璇█鐗規(guī)?
[鍙傝冭祫鏂橾
-Linux/UNIX楂樼駭緙栫▼
銆銆涓綰㈡棗杞歡鎶鏈湁闄愬叕鍙哥紪钁?娓呭崕澶у鍑虹増紺懼嚭鐗?
-Gcc man page
銆銆
[ChangeLog]
-2002-08-10
銆銆ver 0.1 鍙戝竷鏈鍒濈殑鏂囨。
-2002-08-11
銆銆ver 0.11 淇敼鏂囨。鏍煎紡
-2002-08-12
銆銆ver 0.12 鍔犲叆浜嗗闈欐佸簱錛屽姩鎬佸簱鐨勫弬鏁?
-2002-08-16
銆銆ver 0.16 澧炲姞浜唃cc緙栬瘧鐨?涓樁孌電殑鍛戒護(hù)
榪愯 gcc/egcs
**********榪愯 gcc/egcs***********************
銆銆GCC 鏄?GNU 鐨?C 鍜?C++ 緙栬瘧鍣ㄣ傚疄闄呬笂錛孏CC 鑳藉緙栬瘧涓夌璇█錛欳銆丆++ 鍜?O
bject C錛圕 璇█鐨勪竴縐嶉潰鍚戝璞℃墿灞曪級銆傚埄鐢?gcc 鍛戒護(hù)鍙悓鏃剁紪璇戝茍榪炴帴 C 鍜?C++
婧愮▼搴忋?
銆銆濡傛灉浣犳湁涓や釜鎴栧皯鏁板嚑涓?C 婧愭枃浠訛紝涔熷彲浠ユ柟渚垮湴鍒╃敤 GCC 緙栬瘧銆佽繛鎺ュ茍鐢熸垚鍙?
鎵ц鏂囦歡銆備緥濡傦紝鍋囪浣犳湁涓や釜婧愭枃浠?main.c 鍜?factorial.c 涓や釜婧愭枃浠訛紝鐜板湪瑕佺紪
璇戠敓鎴愪竴涓綆楅樁涔樼殑紼嬪簭銆?
浠g爜:
-----------------------
娓呭崟 factorial.c
-----------------------
int factorial (int n)
{
銆銆if (n <= 1)
銆銆銆return 1;
銆銆else
銆銆銆return factorial (n - 1) * n;
}
-----------------------
娓呭崟 main.c
-----------------------
#include銆<stdio.h>
#include銆<unistd.h>
int factorial (int n);
int main (int argc, char **argv)
{
銆銆int n;
銆銆if (argc < 2)
銆銆{
銆銆銆銆printf ("Usage: %s n\n", argv [0]);
銆銆銆銆return -1;
銆銆}
銆銆else
銆銆{
銆銆銆n = atoi (argv[1]);
銆銆銆printf ("Factorial of %d is %d.\n", n, factorial (n));
銆銆 }
銆銆return 0;
}
-----------------------
鍒╃敤濡備笅鐨勫懡浠ゅ彲緙栬瘧鐢熸垚鍙墽琛屾枃浠訛紝騫舵墽琛岀▼搴忥細(xì)
$ gcc -o factorial main.c factorial.c
$ ./factorial 5
Factorial of 5 is 120.
銆銆GCC 鍙悓鏃剁敤鏉ョ紪璇?C 紼嬪簭鍜?C++ 紼嬪簭銆備竴鑸潵璇達(dá)紝C 緙栬瘧鍣ㄩ氳繃婧愭枃浠剁殑鍚庣紑
鍚嶆潵鍒ゆ柇鏄?C 紼嬪簭榪樻槸 C++ 紼嬪簭銆傚湪 Linux 涓紝C 婧愭枃浠剁殑鍚庣紑鍚嶄負(fù) .c錛岃?C++ 婧?
鏂囦歡鐨勫悗緙鍚嶄負(fù) .C 鎴?.cpp銆備絾鏄紝gcc 鍛戒護(hù)鍙兘緙栬瘧 C++ 婧愭枃浠訛紝鑰屼笉鑳借嚜鍔ㄥ拰 C
++ 紼嬪簭浣跨敤鐨勫簱榪炴帴銆傚洜姝わ紝閫氬父浣跨敤 g++ 鍛戒護(hù)鏉ュ畬鎴?C++ 紼嬪簭鐨勭紪璇戝拰榪炴帴錛岃紼?
搴忎細(xì)鑷姩璋冪敤 gcc 瀹炵幇緙栬瘧銆傚亣璁炬垜浠湁涓涓涓嬬殑 C++ 婧愭枃浠訛紙hello.C錛夛細(xì)
#include <iostream>
void main (void)
{
銆銆cout << "Hello, world!" << endl;
}
鍒欏彲浠ュ涓嬭皟鐢?g++ 鍛戒護(hù)緙栬瘧銆佽繛鎺ュ茍鐢熸垚鍙墽琛屾枃浠訛細(xì)
$ g++ -o hello hello.C
$ ./hello
Hello, world!
**********************gcc/egcs 鐨勪富瑕侀夐」*********
gcc 鍛戒護(hù)鐨勫父鐢ㄩ夐」
閫夐」 瑙i噴
-ansi 鍙敮鎸?ANSI 鏍囧噯鐨?C 璇硶銆傝繖涓閫夐」灝嗙姝?GNU C 鐨勬煇浜涚壒鑹詫紝
渚嬪 asm 鎴?typeof 鍏抽敭璇嶃?
-c 鍙紪璇戝茍鐢熸垚鐩爣鏂囦歡銆?
-DMACRO 浠ュ瓧絎︿覆鈥?鈥濆畾涔?MACRO 瀹忋?
-DMACRO=DEFN 浠ュ瓧絎︿覆鈥淒EFN鈥濆畾涔?MACRO 瀹忋?
-E 鍙繍琛?C 棰勭紪璇戝櫒銆?
-g 鐢熸垚璋冭瘯淇℃伅銆侴NU 璋冭瘯鍣ㄥ彲鍒╃敤璇ヤ俊鎭?
-IDIRECTORY 鎸囧畾棰濆鐨勫ご鏂囦歡鎼滅儲璺緞DIRECTORY銆?
-LDIRECTORY 鎸囧畾棰濆鐨勫嚱鏁板簱鎼滅儲璺緞DIRECTORY銆?
-lLIBRARY 榪炴帴鏃舵悳绱㈡寚瀹氱殑鍑芥暟搴揕IBRARY銆?
-m486 閽堝 486 榪涜浠g爜浼樺寲銆?
-o FILE 鐢熸垚鎸囧畾鐨勮緭鍑烘枃浠躲傜敤鍦ㄧ敓鎴愬彲鎵ц鏂囦歡鏃躲?
-O0 涓嶈繘琛屼紭鍖栧鐞嗐?
-O 鎴?-O1 浼樺寲鐢熸垚浠g爜銆?
-O2 榪涗竴姝ヤ紭鍖栥?
-O3 姣?-O2 鏇磋繘涓姝ヤ紭鍖栵紝鍖呮嫭 inline 鍑芥暟銆?
-shared 鐢熸垚鍏變韓鐩爣鏂囦歡銆傞氬父鐢ㄥ湪寤虹珛鍏變韓搴撴椂銆?
-static 紱佹浣跨敤鍏變韓榪炴帴銆?
-UMACRO 鍙栨秷瀵?MACRO 瀹忕殑瀹氫箟銆?
-w 涓嶇敓鎴愪換浣曡鍛婁俊鎭?
-Wall 鐢熸垚鎵鏈夎鍛婁俊鎭?/font>

]]>
GCC浣跨敤鍚戝http://www.shnenglu.com/apollo/articles/GCCGuide.html絎戠瑧鐢?/dc:creator>絎戠瑧鐢?/author>Sat, 25 Feb 2006 04:29:00 GMThttp://www.shnenglu.com/apollo/articles/GCCGuide.htmlhttp://www.shnenglu.com/apollo/comments/3493.htmlhttp://www.shnenglu.com/apollo/articles/GCCGuide.html#Feedback0http://www.shnenglu.com/apollo/comments/commentRss/3493.htmlhttp://www.shnenglu.com/apollo/services/trackbacks/3493.html鍦ㄤ負(fù)Linux寮鍙戝簲鐢ㄧ▼搴忔椂錛岀粷澶у鏁版儏鍐典笅浣跨敤鐨勯兘鏄疌璇█錛屽洜姝ゅ嚑涔庢瘡涓浣峀inux紼嬪簭鍛橀潰涓寸殑棣栬闂閮芥槸濡備綍鐏墊椿榪愮敤C緙栬瘧鍣ㄣ傜洰鍓?Linux涓嬫渶甯哥敤鐨凜璇█緙栬瘧鍣ㄦ槸GCC錛圙NU Compiler Collection錛夛紝瀹冩槸GNU欏圭洰涓鍚圓NSI C鏍囧噯鐨勭紪璇戠郴緇燂紝鑳藉緙栬瘧鐢–銆丆++鍜孫bject C絳夎璦緙栧啓鐨勭▼搴忋侴CC涓嶄粎鍔熻兘闈炲父寮哄ぇ錛岀粨鏋勪篃寮傚父鐏墊椿銆傛渶鍊煎緱縐伴亾鐨勪竴鐐瑰氨鏄畠鍙互閫氳繃涓嶅悓鐨勫墠绔ā鍧楁潵鏀寔鍚勭璇█錛屽Java銆?Fortran銆丳ascal銆丮odula-3鍜孉da絳夈?

寮鏀俱佽嚜鐢卞拰鐏墊椿鏄疞inux鐨勯瓍鍔涙墍鍦紝鑰岃繖涓鐐瑰湪GCC涓婄殑浣撶幇灝辨槸紼嬪簭鍛橀氳繃瀹冭兘澶熸洿濂藉湴鎺у埗鏁翠釜緙栬瘧榪囩▼銆傚湪浣跨敤GCC緙栬瘧紼嬪簭鏃訛紝緙栬瘧榪囩▼鍙互琚粏鍒嗕負(fù)鍥涗釜闃舵錛?

鈼?棰勫鐞嗭紙Pre-Processing錛?

鈼?緙栬瘧錛圕ompiling錛?

鈼?姹囩紪錛圓ssembling錛?

鈼?閾炬帴錛圠inking錛?

Linux 紼嬪簭鍛樺彲浠ユ牴鎹嚜宸辯殑闇瑕佽GCC鍦ㄧ紪璇戠殑浠諱綍闃舵緇撴潫錛屼互渚挎鏌ユ垨浣跨敤緙栬瘧鍣ㄥ湪璇ラ樁孌電殑杈撳嚭淇℃伅錛屾垨鑰呭鏈鍚庣敓鎴愮殑浜岃繘鍒舵枃浠惰繘琛屾帶鍒訛紝浠ヤ究閫氳繃鍔犲叆涓嶅悓鏁伴噺鍜岀綾葷殑璋冭瘯浠g爜鏉ヤ負(fù)浠婂悗鐨勮皟璇曞仛濂藉噯澶囥傚拰鍏跺畠甯哥敤鐨勭紪璇戝櫒涓鏍鳳紝GCC涔熸彁渚涗簡鐏墊椿鑰屽己澶х殑浠g爜浼樺寲鍔熻兘錛屽埄鐢ㄥ畠鍙互鐢熸垚鎵ц鏁堢巼鏇撮珮鐨勪唬鐮併?

GCC鎻愪緵浜?0澶氭潯璀﹀憡淇℃伅鍜屼笁涓鍛婄駭鍒紝浣跨敤瀹冧滑鏈夊姪浜庡寮虹▼搴忕殑紼沖畾鎬у拰鍙Щ妞嶆с傛澶栵紝GCC榪樺鏍囧噯鐨凜鍜孋++璇█榪涜浜嗗ぇ閲忕殑鎵╁睍錛屾彁楂樼▼搴忕殑鎵ц鏁堢巼錛屾湁鍔╀簬緙栬瘧鍣ㄨ繘琛屼唬鐮佷紭鍖栵紝鑳藉鍑忚交緙栫▼鐨勫伐浣滈噺銆?

GCC璧鋒

鍦ㄥ涔?fàn)鋴社敤GCC涔嬪墠錛屼笅闈㈢殑榪欎釜渚嬪瓙鑳藉甯姪鐢ㄦ埛榪呴熺悊瑙CC鐨勫伐浣滃師鐞嗭紝騫跺皢鍏剁珛鍗寵繍鐢ㄥ埌瀹為檯鐨勯」鐩紑鍙戜腑鍘匯傞鍏堢敤鐔熸?zhèn)夌殑缂栬緫鍣ㄨ緭鍏ユ竻鍗?鎵紺虹殑浠g爜錛?

娓呭崟1錛歨ello.c

#include <stdio.h>
int main(void)
{
printf ("Hello world, Linux programming!n");
return 0;
}

鐒跺悗鎵ц涓嬮潰鐨勫懡浠ょ紪璇戝拰榪愯榪欐紼嬪簭錛?

# gcc hello.c -o hello
# ./hello
Hello world, Linux programming!

浠庣▼搴忓憳鐨勮搴︾湅錛屽彧闇綆鍗曞湴鎵ц涓鏉CC鍛戒護(hù)灝卞彲浠ヤ簡錛屼絾浠庣紪璇戝櫒鐨勮搴︽潵鐪嬶紝鍗撮渶瑕佸畬鎴愪竴緋誨垪闈炲父綣佹潅鐨勫伐浣溿傞鍏堬紝GCC闇瑕佽皟鐢ㄩ澶勭悊紼嬪簭 cpp錛岀敱瀹冭礋璐e睍寮鍦ㄦ簮鏂囦歡涓畾涔夌殑瀹忥紝騫跺悜鍏朵腑鎻掑叆鈥?include鈥濊鍙ユ墍鍖呭惈鐨勫唴瀹癸紱鎺ョ潃錛孏CC浼?xì)璋冪敤ccl鍜宎s灝嗗鐞嗗悗鐨勬簮浠g爜緙栬瘧鎴愮洰鏍囦唬鐮侊紱鏈鍚庯紝GCC浼?xì)璋冪敤閾炬帴绋嬪簭ld錛屾妸鐢熸垚鐨勭洰鏍囦唬鐮侀摼鎺ユ垚涓涓彲鎵ц紼嬪簭銆?

涓轟簡鏇村ソ鍦扮悊瑙CC鐨勫伐浣滆繃紼嬶紝鍙互鎶婁笂榪扮紪璇戣繃紼嬪垎鎴愬嚑涓楠ゅ崟鐙繘琛岋紝騫惰瀵熸瘡姝ョ殑榪愯緇撴灉銆傜涓姝ユ槸榪涜棰勭紪璇戯紝浣跨敤-E鍙傛暟鍙互璁〨CC鍦ㄩ澶勭悊緇撴潫鍚庡仠姝㈢紪璇戣繃紼嬶細(xì)

#  gcc -E hello.c -o hello.i

姝ゆ椂鑻ユ煡鐪媓ello.cpp鏂囦歡涓殑鍐呭錛屼細(xì)鍙戠幇stdio.h鐨勫唴瀹圭‘瀹為兘鎻掑埌鏂囦歡閲屽幓浜嗭紝鑰屽叾瀹冨簲褰撹棰勫鐞嗙殑瀹忓畾涔変篃閮藉仛浜嗙浉搴旂殑澶勭悊銆備笅涓姝ユ槸灝唄ello.i緙栬瘧涓虹洰鏍囦唬鐮侊紝榪欏彲浠ラ氳繃浣跨敤-c鍙傛暟鏉ュ畬鎴愶細(xì)

#  gcc -c hello.i -o hello.o

GCC榛樿灝?i鏂囦歡鐪嬫垚鏄澶勭悊鍚庣殑C璇█婧愪唬鐮侊紝鍥犳涓婅堪鍛戒護(hù)灝嗚嚜鍔ㄨ煩榪囬澶勭悊姝ラ鑰屽紑濮嬫墽琛岀紪璇戣繃紼嬶紝涔熷彲浠ヤ嬌鐢?x鍙傛暟璁〨CC浠庢寚瀹氱殑姝ラ寮濮嬬紪璇戙傛渶鍚庝竴姝ユ槸灝嗙敓鎴愮殑鐩爣鏂囦歡閾炬帴鎴愬彲鎵ц鏂囦歡錛?

#  gcc hello.o -o hello

鍦ㄩ噰鐢ㄦā鍧楀寲鐨勮璁℃濇兂榪涜杞歡寮鍙戞椂錛岄氬父鏁翠釜紼嬪簭鏄敱澶氫釜婧愭枃浠剁粍鎴愮殑錛岀浉搴斿湴涔熷氨褰㈡垚浜嗗涓紪璇戝崟鍏冿紝浣跨敤GCC鑳藉寰堝ソ鍦扮鐞嗚繖浜涚紪璇戝崟鍏冦傚亣璁炬湁涓涓敱foo1.c鍜宖oo2.c涓や釜婧愭枃浠剁粍鎴愮殑紼嬪簭錛屼負(fù)浜嗗瀹冧滑榪涜緙栬瘧錛屽茍鏈緇堢敓鎴愬彲鎵ц紼嬪簭foo錛屽彲浠ヤ嬌鐢ㄤ笅闈㈣繖鏉″懡浠わ細(xì)

#  gcc foo1.c foo2.c -o foo

濡傛灉鍚屾椂澶勭悊鐨勬枃浠朵笉姝竴涓紝GCC浠嶇劧浼?xì)鎸夌収棰勫鐞嗐佺紪璇戝拰閾炬帴鐨勮繃紼嬩緷嬈¤繘琛屻傚鏋滄繁絀惰搗鏉ワ紝涓婇潰榪欐潯鍛戒護(hù)澶ц嚧鐩稿綋浜庝緷嬈℃墽琛屽涓嬩笁鏉″懡浠わ細(xì)

# gcc -c foo1.c -o foo1.o
# gcc -c foo2.c -o foo2.o
# gcc foo1.o foo2.o -o foo

鍦ㄧ紪璇戜竴涓寘鍚澶氭簮鏂囦歡鐨勫伐紼嬫椂錛岃嫢鍙敤涓鏉CC鍛戒護(hù)鏉ュ畬鎴愮紪璇戞槸闈炲父嫻垂鏃墮棿鐨勩傚亣璁鵑」鐩腑鏈?00涓簮鏂囦歡闇瑕佺紪璇戯紝騫朵笖姣忎釜婧愭枃浠朵腑閮藉寘鍚?10000琛屼唬鐮侊紝濡傛灉鍍忎笂闈㈤偅鏍蜂粎鐢ㄤ竴鏉CC鍛戒護(hù)鏉ュ畬鎴愮紪璇戝伐浣滐紝閭d箞GCC闇瑕佸皢姣忎釜婧愭枃浠墮兘閲嶆柊緙栬瘧涓閬嶏紝鐒跺悗鍐嶅叏閮ㄨ繛鎺ヨ搗鏉ャ傚緢鏄劇劧錛岃繖鏍鋒氮璐圭殑鏃墮棿鐩稿綋澶氾紝灝ゅ叾鏄綋鐢ㄦ埛鍙槸淇敼浜嗗叾涓煇涓涓枃浠剁殑鏃跺欙紝瀹屽叏娌℃湁蹇呰灝嗘瘡涓枃浠墮兘閲嶆柊緙栬瘧涓閬嶏紝鍥犱負(fù)寰堝宸茬粡鐢熸垚鐨勭洰鏍囨枃浠舵槸涓嶄細(xì)鏀瑰彉鐨勩傝瑙e喅榪欎釜闂錛屽叧閿槸瑕佺伒媧昏繍鐢℅CC錛屽悓鏃惰繕瑕佸熷姪鍍廙ake榪欐牱鐨勫伐鍏楓?

璀﹀憡鎻愮ず鍔熻兘

GCC鍖呭惈瀹屾暣鐨勫嚭閿欐鏌ュ拰璀﹀憡鎻愮ず鍔熻兘錛屽畠浠彲浠ュ府鍔㎜inux紼嬪簭鍛樺啓鍑烘洿鍔犱笓涓氬拰浼樼編鐨勪唬鐮併傚厛鏉ヨ璇繪竻鍗?鎵紺虹殑紼嬪簭錛岃繖孌典唬鐮佸啓寰楀緢緋熺硶錛屼粩緇嗘鏌ヤ竴涓嬩笉闅炬寫鍑哄緢澶氭瘺鐥咃細(xì)

鈼唌ain鍑芥暟鐨勮繑鍥炲艱澹版槑涓簐oid錛屼絾瀹為檯涓婂簲璇ユ槸int錛?

鈼嗕嬌鐢ㄤ簡GNU璇硶鎵╁睍錛屽嵆浣跨敤long long鏉ュ0鏄?4浣嶆暣鏁幫紝涓嶇鍚圓NSI/ISO C璇█鏍囧噯錛?

鈼唌ain鍑芥暟鍦ㄧ粓姝㈠墠娌℃湁璋冪敤return璇彞銆?

娓呭崟2錛歩llcode.c

#include <stdio.h>
void main(void)
{
  long long int var = 1;
  printf("It is not standard C code!n");
}

涓嬮潰鏉ョ湅鐪婫CC鏄浣曞府鍔╃▼搴忓憳鏉ュ彂鐜拌繖浜涢敊璇殑銆傚綋GCC鍦ㄧ紪璇戜笉絎﹀悎ANSI/ISO C璇█鏍囧噯鐨勬簮浠g爜鏃訛紝濡傛灉鍔犱笂浜?pedantic閫夐」錛岄偅涔堜嬌鐢ㄤ簡鎵╁睍璇硶鐨勫湴鏂瑰皢浜х敓鐩稿簲鐨勮鍛婁俊鎭細(xì)

# gcc -pedantic illcode.c -o illcode
illcode.c: In function `main':
illcode.c:9: ISO C89 does not support `long long'
illcode.c:8: return type of `main' is not `int'

闇瑕佹敞鎰忕殑鏄紝-pedantic緙栬瘧閫夐」騫朵笉鑳戒繚璇佽緙栬瘧紼嬪簭涓嶢NSI/ISO C鏍囧噯鐨勫畬鍏ㄥ吋瀹癸紝瀹冧粎浠呭彧鑳界敤鏉ュ府鍔㎜inux紼嬪簭鍛樼榪欎釜鐩爣瓚婃潵瓚婅繎銆傛垨鑰呮崲鍙ヨ瘽璇達(dá)紝-pedantic閫夐」鑳藉甯姪紼嬪簭鍛樺彂鐜頒竴浜涗笉絎﹀悎 ANSI/ISO C鏍囧噯鐨勪唬鐮侊紝浣嗕笉鏄叏閮紝浜嬪疄涓婂彧鏈堿NSI/ISO C璇█鏍囧噯涓姹傝繘琛岀紪璇戝櫒璇婃柇鐨勯偅浜涙儏鍐碉紝鎵嶆湁鍙兘琚獹CC鍙戠幇騫舵彁鍑鴻鍛娿?

闄や簡-pedantic涔嬪錛孏CC榪樻湁涓浜涘叾瀹冪紪璇戦夐」涔熻兘澶熶駭鐢熸湁鐢ㄧ殑璀﹀憡淇℃伅銆傝繖浜涢夐」澶у浠?W寮澶達(dá)紝鍏朵腑鏈鏈変環(huán)鍊肩殑褰撴暟-Wall浜嗭紝浣跨敤瀹冭兘澶熶嬌GCC浜х敓灝藉彲鑳藉鐨勮鍛婁俊鎭細(xì)

# gcc -Wall illcode.c -o illcode
illcode.c:8: warning: return type of `main' is not `int'
illcode.c: In function `main':
illcode.c:9: warning: unused variable `var'

GCC緇欏嚭鐨勮鍛婁俊鎭櫧鐒朵粠涓ユ牸鎰忎箟涓婅涓嶈兘綆椾綔鏄敊璇紝浣嗗嵈寰堝彲鑳芥垚涓洪敊璇殑鏍栬韓涔嬫墍銆備竴涓紭縐鐨凩inux紼嬪簭鍛樺簲璇ュ敖閲忛伩鍏嶄駭鐢熻鍛婁俊鎭紝浣胯嚜宸辯殑浠g爜濮嬬粓淇濇寔綆媧併佷紭緹庡拰鍋ュ.鐨勭壒鎬с?

鍦ㄥ鐞嗚鍛婃柟闈紝鍙︿竴涓父鐢ㄧ殑緙栬瘧閫夐」鏄?Werror錛屽畠瑕佹眰GCC灝嗘墍鏈夌殑璀﹀憡褰撴垚閿欒榪涜澶勭悊錛岃繖鍦ㄤ嬌鐢ㄨ嚜鍔ㄧ紪璇戝伐鍏鳳紙濡侻ake絳夛級鏃墮潪甯告湁鐢ㄣ傚鏋滅紪璇戞椂甯︿笂-Werror閫夐」錛岄偅涔圙CC浼?xì)鍦ㄦ墍鏈変駭鐢熻鍛婄殑鍦版柟鍋滄緙栬瘧錛岃揩浣跨▼搴忓憳瀵硅嚜宸辯殑浠g爜榪涜淇敼銆傚彧鏈夊綋鐩稿簲鐨勮鍛婁俊鎭秷闄ゆ椂錛屾墠鍙兘灝嗙紪璇戣繃紼嬬戶緇湞鍓嶆帹榪涖傛墽琛屾儏鍐靛涓嬶細(xì)

# gcc -Wall -Werror illcode.c -o illcode
cc1: warnings being treated as errors
illcode.c:8: warning: return type of `main' is not `int'
illcode.c: In function `main':
illcode.c:9: warning: unused variable `var'

瀵筁inux紼嬪簭鍛樻潵璁詫紝GCC緇欏嚭鐨勮鍛婁俊鎭槸寰堟湁浠峰肩殑錛屽畠浠笉浠呭彲浠ュ府鍔╃▼搴忓憳鍐欏嚭鏇村姞鍋ュ.鐨勭▼搴忥紝鑰屼笖榪樻槸璺熻釜鍜岃皟璇曠▼搴忕殑鏈夊姏宸ュ叿銆傚緩璁湪鐢℅CC緙栬瘧婧愪唬鐮佹椂濮嬬粓甯︿笂-Wall閫夐」錛屽茍鎶婂畠閫愭笎鍩瑰吇鎴愪負(fù)涓縐嶄範(fàn)鎯紝榪欏鎵懼嚭甯歌鐨勯殣寮忕紪紼嬮敊璇緢鏈夊府鍔┿?

鍦↙inux 涓嬪紑鍙戣蔣浠舵椂錛屽畬鍏ㄤ笉浣跨敤絎笁鏂瑰嚱鏁板簱鐨勬儏鍐墊槸姣旇緝?yōu)畱瑙佺殑锛岄氬父鏉ヨ閮介渶瑕佸熷姪涓涓垨澶氫釜鍑芥暟搴撶殑鏀寔鎵嶈兘澶熷畬鎴愮浉搴旂殑鍔熻兘銆備粠紼嬪簭鍛樼殑瑙掑害鐪嬶紝鍑芥暟搴撳疄闄呬笂灝辨槸涓浜涘ご鏂囦歡錛?h錛夊拰搴撴枃浠訛紙.so鎴栬?a錛夌殑闆嗗悎銆傝櫧鐒禠inux涓嬬殑澶у鏁板嚱鏁伴兘榛樿灝嗗ご鏂囦歡鏀懼埌/usr/include/鐩綍涓嬶紝鑰屽簱鏂囦歡鍒欐斁鍒?usr/lib/鐩綍涓嬶紝浣嗗茍涓嶆槸鎵鏈夌殑鎯呭喌閮芥槸榪欐牱銆傛鍥犲姝わ紝GCC鍦ㄧ紪璇戞椂蹇呴』鏈夎嚜宸辯殑鍔炴硶鏉ユ煡鎵炬墍闇瑕佺殑澶存枃浠跺拰搴撴枃浠躲?

GCC閲囩敤鎼滅儲鐩綍鐨勫姙娉曟潵鏌ユ壘鎵闇瑕佺殑鏂囦歡錛?I閫夐」鍙互鍚慓CC鐨勫ご鏂囦歡鎼滅儲璺緞涓坊鍔犳柊鐨勭洰褰曘備緥濡傦紝濡傛灉鍦?home/xiaowp/include/鐩綍涓嬫湁緙栬瘧鏃舵墍闇瑕佺殑澶存枃浠訛紝涓轟簡璁〨CC鑳藉欏哄埄鍦版壘鍒板畠浠紝灝卞彲浠ヤ嬌鐢?I閫夐」錛?

# gcc foo.c -I /home/xiaowp/include -o foo

鍚屾牱錛屽鏋滀嬌鐢ㄤ簡涓嶅湪鏍囧噯浣嶇疆鐨勫簱鏂囦歡錛岄偅涔堝彲浠ラ氳繃-L閫夐」鍚慓CC鐨勫簱鏂囦歡鎼滅儲璺緞涓坊鍔犳柊鐨勭洰褰曘備緥濡傦紝濡傛灉鍦?home/xiaowp/lib/鐩綍涓嬫湁閾炬帴鏃舵墍闇瑕佺殑搴撴枃浠秎ibfoo.so錛屼負(fù)浜嗚GCC鑳藉欏哄埄鍦版壘鍒板畠錛屽彲浠ヤ嬌鐢ㄤ笅闈㈢殑鍛戒護(hù)錛?

# gcc foo.c -L /home/xiaowp/lib -lfoo -o foo

鍊煎緱濂藉ソ瑙i噴涓涓嬬殑鏄?l閫夐」錛屽畠鎸囩ずGCC鍘昏繛鎺ュ簱鏂囦歡libfoo.so銆侺inux涓嬬殑搴撴枃浠跺湪鍛藉悕鏃舵湁涓涓害瀹氾紝閭e氨鏄簲璇ヤ互lib涓変釜瀛楁瘝寮澶達(dá)紝鐢變簬鎵鏈夌殑搴撴枃浠墮兘閬靛驚浜嗗悓鏍風(fēng)殑瑙勮寖錛屽洜姝ゅ湪鐢?l閫夐」鎸囧畾閾炬帴鐨勫簱鏂囦歡鍚嶆椂鍙互鐪佸幓lib涓変釜瀛楁瘝錛屼篃灝辨槸璇碐CC鍦ㄥ-lfoo榪涜澶勭悊鏃訛紝浼?xì)鑷姩鍘婚摼鎺ュ悕湄?fù)libfoo.so鐨勬枃浠躲?

Linux涓嬬殑搴撴枃浠跺垎涓轟袱澶х被鍒嗗埆鏄姩鎬侀摼鎺ュ簱錛堥氬父浠?so緇撳熬錛夊拰闈欐侀摼鎺ュ簱錛堥氬父浠?a 緇撳熬錛夛紝涓よ呯殑宸埆浠呭湪紼嬪簭鎵ц鏃舵墍闇鐨勪唬鐮佹槸鍦ㄨ繍琛屾椂鍔ㄦ佸姞杞界殑錛岃繕鏄湪緙栬瘧鏃墮潤鎬佸姞杞界殑銆傞粯璁ゆ儏鍐典笅錛孏CC鍦ㄩ摼鎺ユ椂浼樺厛浣跨敤鍔ㄦ侀摼鎺ュ簱錛屽彧鏈夊綋鍔ㄦ侀摼鎺ュ簱涓嶅瓨鍦ㄦ椂鎵嶈冭檻浣跨敤闈欐侀摼鎺ュ簱錛屽鏋滈渶瑕佺殑璇濆彲浠ュ湪緙栬瘧鏃跺姞涓?static閫夐」錛屽己鍒朵嬌鐢ㄩ潤鎬侀摼鎺ュ簱銆備緥濡傦紝濡傛灉鍦?/home/xiaowp/lib/鐩綍涓嬫湁閾炬帴鏃舵墍闇瑕佺殑搴撴枃浠秎ibfoo.so鍜宭ibfoo.a錛屼負(fù)浜嗚GCC鍦ㄩ摼鎺ユ椂鍙敤鍒伴潤鎬侀摼鎺ュ簱錛屽彲浠ヤ嬌鐢ㄤ笅闈㈢殑鍛戒護(hù)錛?

# gcc foo.c -L /home/xiaowp/lib -static -lfoo -o foo
浠g爜浼樺寲

浠g爜浼樺寲鎸囩殑鏄紪璇戝櫒閫氳繃鍒嗘瀽婧愪唬鐮侊紝鎵懼嚭鍏朵腑灝氭湭杈懼埌鏈浼樼殑閮ㄥ垎錛岀劧鍚庡鍏墮噸鏂拌繘琛岀粍鍚堬紝鐩殑鏄敼鍠勭▼搴忕殑鎵ц鎬ц兘銆侴CC鎻愪緵鐨勪唬鐮佷紭鍖栧姛鑳介潪甯稿己澶э紝瀹冮氳繃緙栬瘧閫夐」-On鏉ユ帶鍒朵紭鍖栦唬鐮佺殑鐢熸垚錛屽叾涓璶鏄竴涓唬琛ㄤ紭鍖栫駭鍒殑鏁存暟銆傚浜庝笉鍚岀増鏈殑GCC鏉ヨ錛宯鐨勫彇鍊艱寖鍥村強(qiáng)鍏跺搴旂殑浼樺寲鏁堟灉鍙兘騫朵笉瀹屽叏鐩稿悓錛屾瘮杈冨吀鍨嬬殑鑼冨洿鏄粠0鍙樺寲鍒?鎴?銆?

緙栬瘧鏃朵嬌鐢ㄩ夐」-O鍙互鍛婅瘔GCC鍚屾椂鍑忓皬浠g爜鐨勯暱搴﹀拰鎵ц鏃墮棿錛屽叾鏁堟灉絳変環(huán)浜?O1銆傚湪榪欎竴綰у埆涓婅兘澶熻繘琛岀殑浼樺寲綾誨瀷铏界劧鍙栧喅浜庣洰鏍囧鐞嗗櫒錛屼絾涓鑸兘浼?xì)鍖呮嫭绾拷E嬭煩杞紙Thread Jump錛夊拰寤惰繜閫鏍堬紙Deferred Stack Pops錛変袱縐嶄紭鍖栥傞夐」-O2鍛婅瘔GCC闄や簡瀹屾垚鎵鏈?O1綰у埆鐨勪紭鍖栦箣澶栵紝鍚屾椂榪樿榪涜涓浜涢澶栫殑璋冩暣宸ヤ綔錛屽澶勭悊鍣ㄦ寚浠よ皟搴︾瓑銆傞夐」-O3鍒欓櫎浜嗗畬鎴愭墍鏈?O2綰у埆鐨勪紭鍖栦箣澶栵紝榪樺寘鎷驚鐜睍寮鍜屽叾瀹冧竴浜涗笌澶勭悊鍣ㄧ壒鎬х浉鍏崇殑浼樺寲宸ヤ綔銆傞氬父鏉ヨ錛屾暟瀛楄秺澶т紭鍖栫殑絳夌駭瓚婇珮錛屽悓鏃朵篃灝辨剰鍛崇潃紼嬪簭鐨勮繍琛岄熷害瓚婂揩銆傝澶歀inux紼嬪簭鍛橀兘鍠滄浣跨敤-O2閫夐」錛屽洜涓哄畠鍦ㄤ紭鍖栭暱搴︺佺紪璇戞椂闂村拰浠g爜澶у皬涔嬮棿錛屽彇寰椾簡涓涓瘮杈冪悊鎯崇殑騫寵 鐐廣?

涓嬮潰閫氳繃鍏蜂綋瀹炰緥鏉ユ劅鍙椾竴涓婫CC鐨勪唬鐮佷紭鍖栧姛鑳斤紝鎵鐢ㄧ▼搴忓娓呭崟3鎵紺恒?

娓呭崟3錛歰ptimize.c

#include <stdio.h>

int main(void)

 double counter;  

double result;  

double temp;  

for (counter = 0;    counter < 2000.0 * 2000.0 * 2000.0  / 20.0 + 2020;    counter += (5 - 1) / 4)

{    temp = counter / 1979;    result  = counter;      } 

 printf("Result is %lfn", result); 

 return 0;

}

棣栧厛涓嶅姞浠諱綍浼樺寲閫夐」榪涜緙栬瘧錛?

# gcc -Wall optimize.c -o optimize

鍊熷姪Linux鎻愪緵鐨則ime鍛戒護(hù)錛屽彲浠ュぇ鑷寸粺璁″嚭璇ョ▼搴忓湪榪愯鏃舵墍闇瑕佺殑鏃墮棿錛?

# time ./optimizeResult is 400002019.000000real    0m14.942suser    0m14.940ssys     0m0.000s

鎺ヤ笅鍘諱嬌鐢ㄤ紭鍖栭夐」鏉ュ浠g爜榪涜浼樺寲澶勭悊錛?

# gcc -Wall -O optimize.c -o optimize

鍦ㄥ悓鏍風(fēng)殑鏉′歡涓嬪啀嬈℃祴璇曚竴涓嬭繍琛屾椂闂達(dá)細(xì)

# time ./optimizeResult is 400002019.000000real    0m3.256suser    0m3.240ssys     0m0.000s

瀵規(guī)瘮涓ゆ鎵ц鐨勮緭鍑虹粨鏋滀笉闅劇湅鍑猴紝紼嬪簭鐨勬ц兘鐨勭‘寰楀埌浜嗗緢澶у箙搴︾殑鏀瑰杽錛岀敱鍘熸潵鐨?4縐掔緝鐭埌浜?縐掋傝繖涓緥瀛愭槸涓撻棬閽堝GCC鐨勪紭鍖栧姛鑳借岃璁$殑錛屽洜姝や紭鍖栧墠鍚庣▼搴忕殑鎵ц閫熷害鍙戠敓浜嗗緢澶х殑鏀瑰彉銆傚敖綆CC鐨勪唬鐮佷紭鍖栧姛鑳介潪甯稿己澶э紝浣嗕綔涓轟竴鍚嶄紭縐鐨凩inux紼嬪簭鍛橈紝棣栧厛榪樻槸瑕佸姏姹傝兘澶熸墜宸ョ紪鍐欏嚭楂樿川閲忕殑浠g爜銆傚鏋滅紪鍐欑殑浠g爜綆鐭紝騫朵笖閫昏緫鎬у己錛岀紪璇戝櫒灝變笉浼?xì)鍋氭洿澶氱殑宸ヤ綔锛岀敋鑷虫犚?guī)湰鐢ㄤ笉鐫浼樺寲銆?

 浼樺寲铏界劧鑳藉緇欑▼搴忓甫鏉ユ洿濂界殑鎵ц鎬ц兘錛屼絾鍦ㄥ涓嬩竴浜涘満鍚堜腑搴旇閬垮厤浼樺寲浠g爜錛?

鈼?紼嬪簭寮鍙戠殑鏃跺?浼樺寲絳夌駭瓚婇珮錛屾秷鑰楀湪緙栬瘧涓婄殑鏃墮棿灝辮秺闀匡紝鍥犳鍦ㄥ紑鍙戠殑鏃跺欐渶濂戒笉瑕佷嬌鐢ㄤ紭鍖栭夐」錛屽彧鏈夊埌杞歡鍙戣鎴栧紑鍙戠粨鏉熺殑鏃跺欙紝鎵嶈冭檻瀵規(guī)渶緇堢敓鎴愮殑浠g爜榪涜浼樺寲銆?

鈼?璧勬簮鍙楅檺鐨勬椂鍊?涓浜涗紭鍖栭夐」浼?xì)澧炲姞鍙墽琛屼唬鐮佺殑浣摽U紝濡傛灉紼嬪簭鍦ㄨ繍琛屾椂鑳藉鐢寵鍒扮殑鍐呭瓨璧勬簮闈炲父绱у紶錛堝涓浜涘疄鏃跺祵鍏ュ紡璁懼錛夛紝閭e氨涓嶈瀵逛唬鐮佽繘琛屼紭鍖栵紝鍥犱負(fù)鐢辮繖甯︽潵鐨勮礋闈㈠獎鍝嶅彲鑳戒細(xì)浜х敓闈炲父涓ラ噸鐨勫悗鏋溿?

鈼?璺熻釜璋冭瘯鐨勬椂鍊?鍦ㄥ浠g爜榪涜浼樺寲鐨勬椂鍊欙紝鏌愪簺浠g爜鍙兘浼?xì)琚垹闄ゆ垨鏀瑰啓锛屾垨鑰呬負(fù)浜嗗彇寰楁洿浣崇殑鎬ц兘鑰岃繘琛岄噸緇勶紝浠庤屼嬌璺熻釜鍜岃皟璇曞彉寰楀紓甯稿洶闅俱?

璋冭瘯

涓涓姛鑳藉己澶х殑璋冭瘯鍣ㄤ笉浠呬負(fù)紼嬪簭鍛樻彁渚涗簡璺熻釜紼嬪簭鎵ц鐨勬墜孌碉紝鑰屼笖榪樺彲浠ュ府鍔╃▼搴忓憳鎵懼埌瑙e喅闂鐨勬柟娉曘傚浜嶭inux紼嬪簭鍛樻潵璁詫紝GDB錛圙NU Debugger錛夐氳繃涓嶨CC鐨勯厤鍚堜嬌鐢紝涓哄熀浜嶭inux鐨勮蔣浠跺紑鍙戞彁渚涗簡涓涓畬鍠勭殑璋冭瘯鐜銆?

榛樿鎯呭喌涓嬶紝GCC鍦ㄧ紪璇戞椂涓嶄細(xì)灝嗚皟璇曠鍙鋒彃鍏ュ埌鐢熸垚鐨勪簩榪涘埗浠g爜涓紝鍥犱負(fù)榪欐牱浼?xì)澧炲姞鍙墽琛屾枃錃g鐨勫ぇ灝忋傚鏋滈渶瑕佸湪緙栬瘧鏃剁敓鎴愯皟璇曠鍙蜂俊鎭紝鍙互浣跨敤GCC 鐨?g鎴栬?ggdb閫夐」銆侴CC鍦ㄤ駭鐢熻皟璇曠鍙鋒椂錛屽悓鏍烽噰鐢ㄤ簡鍒嗙駭鐨勬濊礬錛屽紑鍙戜漢鍛樺彲浠ラ氳繃鍦?g閫夐」鍚庨檮鍔犳暟瀛?銆?鎴?鏉ユ寚瀹氬湪浠g爜涓姞鍏ヨ皟璇曚俊鎭殑澶氬皯銆傞粯璁ょ殑綰у埆鏄?錛?g2錛夛紝姝ゆ椂浜х敓鐨勮皟璇曚俊鎭寘鎷墿灞曠殑絎﹀彿琛ㄣ佽鍙楓佸眬閮ㄦ垨澶栭儴鍙橀噺淇℃伅銆傜駭鍒?錛?g3錛夊寘鍚駭鍒?涓殑鎵鏈夎皟璇曚俊鎭紝浠ュ強(qiáng)婧愪唬鐮佷腑瀹氫箟鐨勫畯銆傜駭鍒?錛?g1錛変笉鍖呭惈灞閮ㄥ彉閲忓拰涓庤鍙鋒湁鍏崇殑璋冭瘯淇℃伅錛屽洜姝ゅ彧鑳藉鐢ㄤ簬鍥炴函璺熻釜鍜屽爢鏍堣漿鍌ㄤ箣鐢ㄣ傚洖婧窡韙寚鐨勬槸鐩戣紼嬪簭鍦ㄨ繍琛岃繃紼嬩腑鐨勫嚱鏁拌皟鐢ㄥ巻鍙詫紝鍫嗘爤杞偍鍒欐槸涓縐嶄互鍘熷鐨勫崄鍏繘鍒舵牸寮忎繚瀛樼▼搴忔墽琛岀幆澧冪殑鏂規(guī)硶錛屼袱鑰呴兘鏄粡甯哥敤鍒扮殑璋冭瘯鎵嬫銆?

GCC浜х敓鐨勮皟璇曠鍙峰叿鏈夋櫘閬嶇殑閫傚簲鎬э紝鍙互琚澶氳皟璇曞櫒鍔犱互鍒╃敤錛屼絾濡傛灉浣跨敤鐨勬槸GDB錛岄偅涔堣繕鍙互閫氳繃-ggdb閫夐」鍦ㄧ敓鎴愮殑浜岃繘鍒朵唬鐮佷腑鍖呭惈GDB涓撶敤鐨勮皟璇曚俊鎭傝繖縐嶅仛娉曠殑浼樼偣鏄彲浠ユ柟渚縂DB鐨勮皟璇曞伐浣滐紝浣嗙己鐐規(guī)槸鍙兘瀵艱嚧鍏跺畠璋冭瘯鍣紙濡侱BX錛夋棤娉曡繘琛屾甯哥殑璋冭瘯銆傞夐」-ggdb鑳藉鎺ュ彈鐨勮皟璇曠駭鍒拰-g鏄畬鍏ㄤ竴鏍風(fēng)殑錛屽畠浠杈撳嚭鐨勮皟璇曠鍙鋒湁鐫鐩稿悓鐨勫獎鍝嶃?

闇瑕佹敞鎰忕殑鏄紝浣跨敤浠諱綍涓涓皟璇曢夐」閮戒細(xì)浣挎渶緇堢敓鎴愮殑浜岃繘鍒舵枃浠剁殑澶у皬鎬ュ墽澧炲姞錛屽悓鏃跺鍔犵▼搴忓湪鎵ц鏃剁殑寮閿錛屽洜姝よ皟璇曢夐」閫氬父浠呭湪杞歡鐨勫紑鍙戝拰璋冭瘯闃舵浣跨敤銆傝皟璇曢夐」瀵圭敓鎴愪唬鐮佸ぇ灝忕殑褰卞搷浠庝笅闈㈢殑瀵規(guī)瘮榪囩▼涓彲浠ョ湅鍑烘潵錛?

# gcc optimize.c -o optimize

# ls optimize -l-rwxrwxr-x  1 xiaowp   xiaowp  11649 Nov 20 08:53 optimize  (鏈姞璋冭瘯閫夐」)

# gcc -g optimize.c -o optimize

# ls optimize -l-rwxrwxr-x  1 xiaowp   xiaowp  15889 Nov 20 08:54 optimize  (鍔犲叆璋冭瘯閫夐」)

铏界劧璋冭瘯閫夐」浼?xì)澧炲姞鏂囦欢鐨勫ぇ灏忓Q屼絾浜嬪疄涓奓inux涓殑璁稿杞歡鍦ㄦ祴璇曠増鏈敋鑷蟲渶緇堝彂琛岀増鏈腑浠嶇劧浣跨敤浜嗚皟璇曢夐」鏉ヨ繘琛岀紪璇戯紝榪欐牱鍋氱殑鐩殑鏄紦鍔辯敤鎴峰湪鍙戠幇闂鏃惰嚜宸卞姩鎵嬭В鍐籌紝鏄疞inux鐨勪竴涓樉钁楃壒鑹層?

涓嬮潰榪樻槸閫氳繃涓涓叿浣撶殑瀹炰緥璇存槑濡備綍鍒╃敤璋冭瘯絎﹀彿鏉ュ垎鏋愰敊璇紝鎵鐢ㄧ▼搴忚娓呭崟4鎵紺恒?

娓呭崟4錛歝rash.c

#include <stdio.h>

 int main(void)

{  

int input =0;  

printf("Input an integer:");  

scanf("%d", input);  

printf("The integer you input is %dn", input); 

 return 0;

}

緙栬瘧騫惰繍琛屼笂榪頒唬鐮侊紝浼?xì)漶旂敓涓涓弗閲嶇殑孌甸敊璇紙Segmentation fault錛夊涓嬶細(xì)

# gcc -g crash.c -o crash

# ./crashInput

an integer:10Segmentation fault

涓轟簡鏇村揩閫熷湴鍙戠幇閿欒鎵鍦紝鍙互浣跨敤GDB榪涜璺熻釜璋冭瘯錛屾柟娉曞涓嬶細(xì)

# gdb crashGNU gdb Red Hat Linux (5.3post-0.20021129.18rh)鈥︹?gdb)

褰揋DB鎻愮ず絎﹀嚭鐜扮殑鏃跺欙紝琛ㄦ槑GDB宸茬粡鍋氬ソ鍑嗗榪涜璋冭瘯浜嗭紝鐜板湪鍙互閫氳繃run鍛戒護(hù)璁╃▼搴忓紑濮嬪湪GDB鐨勭洃鎺т笅榪愯錛?

(gdb) runStarting program: /home/xiaowp/thesis/gcc/code/crashInput an integer:10Program received signal SIGSEGV, Segmentation fault.0x4008576b in _IO_vfscanf_internal () from /lib/libc.so.6

浠旂粏鍒嗘瀽涓涓婫DB緇欏嚭鐨勮緭鍑虹粨鏋滀笉闅劇湅鍑猴紝紼嬪簭鏄敱浜庢閿欒鑰屽鑷村紓甯鎬腑姝㈢殑錛岃鏄庡唴瀛樻搷浣滃嚭浜嗛棶棰橈紝鍏蜂綋鍙戠敓闂鐨勫湴鏂規(guī)槸鍦ㄨ皟鐢?_IO_vfscanf_internal ( )鐨勬椂鍊欍備負(fù)浜嗗緱鍒版洿鍔犳湁浠峰肩殑淇℃伅錛屽彲浠ヤ嬌鐢℅DB鎻愪緵鐨勫洖婧窡韙懡浠acktrace錛屾墽琛岀粨鏋滃涓嬶細(xì)

(gdb) backtrace

#0  0x4008576b in _IO_vfscanf_internal () from /lib/libc.so.6

#1  0xbffff0c0 in ?? ()

#2  0x4008e0ba in scanf () from /lib/libc.so.6

#3  0x08048393 in main () at crash.c:11

#4  0x40042917 in __libc_start_main () from /lib/libc.so.6

璺寵繃杈撳嚭緇撴灉涓殑鍓嶉潰涓夎錛屼粠杈撳嚭緇撴灉鐨勭鍥涜涓笉闅劇湅鍑猴紝GDB宸茬粡灝嗛敊璇畾浣嶅埌crash.c涓殑絎?1琛屼簡銆傜幇鍦ㄤ粩緇嗘鏌ヤ竴涓嬶細(xì)

(gdb) frame 3

#3  0x08048393 in main () at crash.c:1111       scanf("%d", input);

浣跨敤GDB鎻愪緵鐨刦rame鍛戒護(hù)鍙互瀹氫綅鍒板彂鐢熼敊璇殑浠g爜孌碉紝璇ュ懡浠ゅ悗闈㈣窡鐫鐨勬暟鍊煎彲浠ュ湪backtrace鍛戒護(hù)杈撳嚭緇撴灉涓殑琛岄鎵懼埌銆傜幇鍦ㄥ凡緇忓彂鐜伴敊璇墍鍦ㄤ簡錛屽簲璇ュ皢

scanf("%d", input);鏀逛負(fù)scanf("%d", &input);

瀹屾垚鍚庡氨鍙互閫鍑篏DB浜嗭紝鍛戒護(hù)濡備笅錛?

(gdb) quit

GDB鐨勫姛鑳借繙榪滀笉姝㈠姝わ紝瀹冭繕鍙互鍗曟璺熻釜紼嬪簭銆佹鏌ュ唴瀛樺彉閲忓拰璁劇疆鏂偣絳夈?

璋冭瘯鏃跺彲鑳戒細(xì)闇瑕佺敤鍒扮紪璇戝櫒浜х敓鐨勪腑闂寸粨鏋滐紝榪欐椂鍙互浣跨敤-save-temps閫夐」錛岃GCC灝嗛澶勭悊浠g爜銆佹眹緙栦唬鐮佸拰鐩爣浠g爜閮戒綔涓烘枃浠朵繚瀛樿搗鏉ャ傚鏋滄兂媯鏌ョ敓鎴愮殑浠g爜鏄惁鑳藉閫氳繃鎵嬪伐璋冩暣鐨勫姙娉曟潵鎻愰珮鎵ц鎬ц兘錛屽湪緙栬瘧榪囩▼涓敓鎴愮殑涓棿鏂囦歡灝嗕細(xì)寰堟湁甯姪錛屽叿浣撴儏鍐靛涓嬶細(xì)

# gcc -save-temps foo.c -o foo

# ls foo*foo  foo.c  foo.i  foo.s

GCC 鏀寔鐨勫叾瀹冭皟璇曢夐」榪樺寘鎷?p鍜?pg錛屽畠浠細(xì)灝嗗墫鏋愶紙Profiling錛変俊鎭姞鍏ュ埌鏈緇堢敓鎴愮殑浜岃繘鍒朵唬鐮佷腑銆傚墫鏋愪俊鎭浜庢壘鍑虹▼搴忕殑鎬ц兘鐡墮寰堟湁甯姪錛屾槸鍗忓姪Linux紼嬪簭鍛樺紑鍙戝嚭楂樻ц兘紼嬪簭鐨勬湁鍔涘伐鍏楓傚湪緙栬瘧鏃跺姞鍏?p閫夐」浼?xì)鍦ㄧ敓鎴愮殑浠g爜涓姞鍏ラ氱敤鍓栨瀽宸ュ叿錛圥rof錛夎兘澶熻瘑鍒殑緇熻淇℃伅錛岃? pg閫夐」鍒欑敓鎴愬彧鏈塆NU鍓栨瀽宸ュ叿錛圙prof錛夋墠鑳借瘑鍒殑緇熻淇℃伅銆?

鏈鍚庢彁閱掍竴鐐癸紝铏界劧GCC鍏佽鍦ㄤ紭鍖栫殑鍚屾椂鍔犲叆璋冭瘯絎﹀彿淇℃伅錛屼絾浼樺寲鍚庣殑浠g爜瀵逛簬璋冭瘯鏈韓鑰岃█灝嗘槸涓涓緢澶х殑鎸戞垬銆備唬鐮佸湪緇忚繃浼樺寲涔嬪悗錛屽湪婧愮▼搴忎腑澹版槑鍜屼嬌鐢ㄧ殑鍙橀噺寰堝彲鑳戒笉鍐嶄嬌鐢紝鎺у埗嫻佷篃鍙兘浼?xì)绐佺劧锜╄浆鍒版剰澶栫殑鍦版柟锛屽惊鐜鍙ユ湁鍙兘鍥犱负弩@鐜睍寮鑰屽彉寰楀埌澶勯兘鏈夛紝鎵鏈夎繖浜涘璋冭瘯鏉ヨ閮藉皢鏄竴鍦哄櫓姊︺傚緩璁湪璋冭瘯鐨勬椂鍊欐渶濂戒笉浣跨敤浠諱綍浼樺寲閫夐」錛屽彧鏈夊綋紼嬪簭鍦ㄦ渶緇堝彂琛岀殑鏃跺欐墠鑰冭檻瀵瑰叾榪涜浼樺寲銆?
涓婃鐨勫煿璁洯鍦頒腑浠嬬粛浜咷CC鐨勭紪璇戣繃紼嬨佽鍛婃彁紺哄姛鑳姐佸簱渚濊禆銆佷唬鐮佷紭鍖栧拰紼嬪簭璋冭瘯鍏釜鏂歸潰鐨勫唴瀹廣傝繖鏈熸槸鏈鍚庣殑涓閮ㄥ垎鍐呭銆?
鍦ㄥ皢婧愪唬鐮佸彉鎴愬彲鎵ц鏂囦歡鐨勮繃紼嬩腑錛岄渶瑕佺粡榪囪澶氫腑闂存楠わ紝鍖呭惈棰勫鐞嗐佺紪璇戙佹眹緙栧拰榪炴帴銆傝繖浜涜繃紼嬪疄闄呬笂鏄敱涓嶅悓鐨勭▼搴忚礋璐e畬鎴愮殑銆傚ぇ澶氭暟鎯呭喌涓婫CC鍙互涓篖inux紼嬪簭鍛樺畬鎴愭墍鏈夌殑鍚庡彴宸ヤ綔錛岃嚜鍔ㄨ皟鐢ㄧ浉搴旂▼搴忚繘琛屽鐞嗐?

榪欐牱鍋氭湁涓涓緢鏄庢樉鐨勭己鐐癸紝灝辨槸GCC鍦ㄥ鐞嗘瘡涓涓簮鏂囦歡鏃訛紝鏈緇堥兘闇瑕佺敓鎴愬ソ鍑犱釜涓存椂鏂囦歡鎵嶈兘瀹屾垚鐩稿簲鐨勫伐浣滐紝浠庤屾棤褰腑瀵艱嚧澶勭悊閫熷害鍙樻參銆備緥濡傦紝GCC 鍦ㄥ鐞嗕竴涓簮鏂囦歡鏃訛紝鍙兘闇瑕佷竴涓復(fù)鏃舵枃浠舵潵淇濆瓨棰勫鐞嗙殑杈撳嚭銆佷竴涓復(fù)鏃舵枃浠舵潵淇濆瓨緙栬瘧鍣ㄧ殑杈撳嚭銆佷竴涓復(fù)鏃舵枃浠舵潵淇濆瓨姹囩紪鍣ㄧ殑杈撳嚭錛岃岃鍐欒繖浜涗復(fù)鏃舵枃浠舵樉鐒墮渶瑕佽楄垂涓瀹氱殑鏃墮棿銆傚綋杞歡欏圭洰鍙樺緱闈炲父搴炲ぇ鐨勬椂鍊欙紝鑺辮垂鍦ㄨ繖涓婇潰鐨勪唬浠峰彲鑳戒細(xì)鍙樺緱寰堟矇閲嶃?

瑙e喅鐨勫姙娉曟槸錛屼嬌鐢↙inux鎻愪緵鐨勪竴縐嶆洿鍔犻珮鏁堢殑閫氫俊鏂瑰紡鈥旂閬撱傚畠鍙互鐢ㄦ潵鍚屾椂榪炴帴涓や釜紼嬪簭錛屽叾涓竴涓▼搴忕殑杈撳嚭灝嗚鐩存帴浣滀負(fù)鍙︿竴涓▼搴忕殑杈撳叆錛岃繖鏍峰氨鍙互閬垮厤浣跨敤涓存椂鏂囦歡錛屼絾緙栬瘧鏃跺嵈闇瑕佹秷鑰楁洿澶氱殑鍐呭瓨銆?

鍦ㄧ紪璇戣繃紼嬩腑浣跨敤綆¢亾鏄敱GCC鐨?pipe閫夐」鍐沖畾鐨勩備笅闈㈢殑榪欐潯鍛戒護(hù)灝辨槸鍊熷姪GCC鐨勭閬撳姛鑳芥潵鎻愰珮緙栬瘧閫熷害鐨勶細(xì)

# gcc -pipe foo.c -o foo

鍦ㄧ紪璇戝皬鍨嬪伐紼嬫椂浣跨敤綆¢亾錛岀紪璇戞椂闂翠笂鐨勫樊寮傚彲鑳借繕涓嶆槸寰堟槑鏄撅紝浣嗗湪婧愪唬鐮侀潪甯稿鐨勫ぇ鍨嬪伐紼嬩腑錛屽樊寮傚皢鍙樺緱闈炲父鏄庢樉銆?

鏂囦歡鎵╁睍鍚?

鍦ㄤ嬌鐢℅CC鐨勮繃紼嬩腑錛岀敤鎴峰涓浜涘父鐢ㄧ殑鎵╁睍鍚嶄竴瀹氳鐔熸?zhèn)夊Q屽茍鐭ラ亾鍏跺惈涔夈備負(fù)浜嗘柟渚垮ぇ瀹跺涔?fàn)鋴社敤GCC錛屽湪姝ゅ皢榪欎簺鎵╁睍鍚嶇綏鍒楀涓嬶細(xì)

.c C鍘熷紼嬪簭錛?

.C C++鍘熷紼嬪簭錛?

.cc C++鍘熷紼嬪簭錛?

.cxx C++鍘熷紼嬪簭錛?

.m Objective-C鍘熷紼嬪簭錛?

.i 宸茬粡榪囬澶勭悊鐨凜鍘熷紼嬪簭錛?

.ii 宸茬粡榪囬澶勭悊涔婥++鍘熷紼嬪簭錛?

.s 緇勫悎璇█鍘熷紼嬪簭錛?

.S 緇勫悎璇█鍘熷紼嬪簭錛?

.h 棰勫鐞嗘枃浠?鏍囧ご鏂囦歡)錛?

.o 鐩爣鏂囦歡錛?

.a 瀛樻。鏂囦歡銆?

GCC甯哥敤閫夐」

GCC浣滀負(fù)Linux涓婥/C++閲嶈鐨勭紪璇戠幆澧冿紝鍔熻兘寮哄ぇ錛岀紪璇戦夐」綣佸銆備負(fù)浜嗘柟渚垮ぇ瀹舵棩鍚庣紪璇戞柟渚匡紝鍦ㄦ灝嗗父鐢ㄧ殑閫夐」鍙?qiáng)璇存槑缃楀垪鍑烘潵濡備笅锛?xì)

-c 閫氱煡GCC鍙栨秷閾炬帴姝ラ錛屽嵆緙栬瘧婧愮爜騫跺湪鏈鍚庣敓鎴愮洰鏍囨枃浠訛紱

-Dmacro 瀹氫箟鎸囧畾鐨勫畯錛屼嬌瀹冭兘澶熼氳繃婧愮爜涓殑#ifdef榪涜媯楠岋紱

-E 涓嶇粡榪囩紪璇戦澶勭悊紼嬪簭鐨勮緭鍑鴻岃緭閫佽嚦鏍囧噯杈撳嚭錛?

-g3 鑾峰緱鏈夊叧璋冭瘯紼嬪簭鐨勮緇嗕俊鎭紝瀹冧笉鑳戒笌-o閫夐」鑱斿悎浣跨敤錛?

-Idirectory 鍦ㄥ寘鍚枃浠舵悳绱㈣礬寰勭殑璧風(fēng)偣澶勬坊鍔犳寚瀹氱洰褰曪紱

-llibrary 鎻愮ず閾炬帴紼嬪簭鍦ㄥ垱寤烘渶緇堝彲鎵ц鏂囦歡鏃跺寘鍚寚瀹氱殑搴擄紱

-O銆?O2銆?O3 灝嗕紭鍖栫姸鎬佹墦寮錛岃閫夐」涓嶈兘涓?g閫夐」鑱斿悎浣跨敤錛?

-S 瑕佹眰緙栬瘧紼嬪簭鐢熸垚鏉ヨ嚜婧愪唬鐮佺殑姹囩紪紼嬪簭杈撳嚭錛?

-v 鍚姩鎵鏈夎鎶ワ紱

-Wall 鍦ㄥ彂鐢熻鎶ユ椂鍙栨秷緙栬瘧鎿嶄綔錛屽嵆灝嗚鎶ョ湅浣滄槸閿欒錛?

-Werror 鍦ㄥ彂鐢熻鎶ユ椂鍙栨秷緙栬瘧鎿嶄綔錛屽嵆鎶婃姤璀﹀綋浣滄槸閿欒錛?

-w 紱佹鎵鏈夌殑鎶ヨ銆?

灝忕粨

GCC 鏄湪Linux涓嬪紑鍙戠▼搴忔椂蹇呴』鎺屾彙鐨勫伐鍏蜂箣涓銆傛湰鏂囧GCC鍋氫簡涓涓畝瑕佺殑浠嬬粛錛屼富瑕佽榪頒簡濡備綍浣跨敤GCC緙栬瘧紼嬪簭銆佷駭鐢熻鍛婁俊鎭佽皟璇曠▼搴忓拰鍔犲揩 GCC鐨勭紪璇戦熷害銆傚鎵鏈夊笇鏈涙棭鏃ヨ法鍏inux寮鍙戣呰鍒楃殑浜烘潵璇達(dá)紝GCC灝辨槸鎴愪負(fù)涓鍚嶄紭縐鐨凩inux紼嬪簭鍛樼殑璧瘋窇綰褲?




]]>
VC灝忔妧宸?5涓?http://www.shnenglu.com/apollo/articles/3461.html絎戠瑧鐢?/dc:creator>絎戠瑧鐢?/author>Fri, 24 Feb 2006 05:26:00 GMThttp://www.shnenglu.com/apollo/articles/3461.htmlhttp://www.shnenglu.com/apollo/comments/3461.htmlhttp://www.shnenglu.com/apollo/articles/3461.html#Feedback0http://www.shnenglu.com/apollo/comments/commentRss/3461.htmlhttp://www.shnenglu.com/apollo/services/trackbacks/3461.html涓銆?nbsp;涓嬈″彧榪愯涓涓▼搴忓疄渚?/STRONG>
涓嬪垪涓ょ鏂瑰紡閮藉彲浠ュ疄鐜幫紝寤鴻閲囩敤絎簩縐嶆柟寮忥細(xì)
1銆?nbsp;if( FindWindow(NULL,"紼嬪簭鏍囬"))
         exit(0);
2銆丅OOL CDemoTBarEApp::InstanceIsRun()
{
 HANDLE m_hMutex;
 m_hMutex = ::CreateMutex(NULL, TRUE, _T("YourApplication"));
 ASSERT(m_hMutex);
 if (GetLastError() == ERROR_ALREADY_EXISTS)
 {
  m_hMutex = NULL;
  return TRUE;//瀹炰緥宸茬粡榪愯
 }
 return FALSE;//瀹炰緥鏈繍琛?BR>}

浜屻?nbsp;瑁呰澆鍏夋爣
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
銆銆鍏朵腑::SetCursor()鏄叏灞鍑芥暟錛岀敤鏉ヨ緗暣涓緥紼嬬殑鍏夋爣鍙傛暟鏄畯瀹氫箟鍏夋爣鍙ユ焺銆侫fxGetApp ()鏄竴涓郴緇熷嚱鏁幫紝瀹冭繑鍥炲綋鍓嶇殑涓涓狢WinApp瀵硅薄銆傚叾鎴愬憳鍑芥暟LoadStandardCursor()鐢ㄦ潵璇誨彇涓涓郴緇熸寚閽堬紝姣忎竴縐嶇郴緇熸寚閽堢殑鍏蜂綋瀹忓畾涔夊涓嬶細(xì)
IDC_APPSTARTING  甯﹀皬娌欐紡鐨勬爣鍑嗙澶?BR>IDC_ARROW  鏍囧噯綆ご
IDC_CROSS  鍗佸瓧鍏夋爣錛堢敤浜庡畾浣嶏級
IDC_HAND  Windows 2000錛氭墜鍨?BR>IDC_HELP  甯﹂棶鍙風(fēng)殑綆ご
IDC_IBEAM  I鍨嬫爣
IDC_ICON  Obsolete for applications marked version 4.0 or later.
IDC_NO   紱佹絎﹀彿
IDC_SIZE  Obsolete for applications marked version 4.0 or later. Use IDC_SIZEALL.
IDC_SIZEALL  鍗佸瓧綆ご
IDC_SIZENESW  鎸囧悜涓滃寳鍜岃タ鍗楃殑鍙屽悜綆ご
IDC_SIZENS  鎸囧悜鍗楀拰鍖楃殑鍙屽悜綆ご
IDC_SIZENWSE  鎸囧悜瑗垮寳鍜屼笢鍗楃殑鍙屽悜綆ご
IDC_SIZEWE  鎸囧悜涓滆タ鐨勫弻鍚戠澶?BR>IDC_UPARROW  涓婄澶?BR>IDC_WAIT  娌欐紡

涓夈佽幏寰椾富妗嗘灦錛?/STRONG> 
CMainFrame * pMainframe = (CMainFrame *) AfxGetApp()->m_pMainWnd;
.鑾峰彇搴旂敤紼嬪簭鐨勫疄渚嬪彞鏌勶細(xì)
      Example: HANDLE hInstance=AfxGetInstanceHandle();

鑾峰緱搴旂敤紼嬪簭涓葷獥鍙g殑鎸囬拡錛?BR>      Example: AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //浣跨▼搴忔渶澶у寲

鍥涖侀噸鏂板緩绔嬪瓧浣撶殑浠g爜
 if(m_fontLogo.m_hObject)
  m_fontLogo.Detach();

 m_fontLogo.CreateFont(nHeight, 0, 0, 0, nWeight, bItalic, bUnderline,0,0,0,0,0,0, Name);

浜斻佺敤鎸囧畾棰滆壊濉厖鍖哄煙
 dc.FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE));

鍏佺粯鍒剁珛浣撳瓧浣撴晥鏋滅殑瀛椾綋錛屽緢鍊煎緱涓鐪?BR>void CTestView::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 
 CRect rect;
 GetWindowRect(rect);

 CFont  m_fontLogo;
 m_fontLogo.CreateFont(24, 0, 0, 0, FW_BOLD, true,
  FALSE,0,0,0,0,0,0, "Arial");
 CString m_LogoText;
 m_LogoText=_T("Benlux Pro3D System");
 dc.SetBkMode(TRANSPARENT);

 CFont * OldFont = dc.SelectObject(&m_fontLogo);

 // draw text in DC
 COLORREF OldColor = dc.SetTextColor( ::GetSysColor( COLOR_3DHILIGHT));

 rect.right = rect.Width();
 rect.bottom = rect.Height();
 rect.left = rect.top = 0;
 dc.FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE));


 dc.DrawText( m_LogoText, rect + CPoint(1,1), DT_SINGLELINE | DT_LEFT | DT_VCENTER);
 dc.SetTextColor( ::GetSysColor( COLOR_3DSHADOW));
 dc.DrawText( m_LogoText, rect, DT_SINGLELINE | DT_LEFT | DT_VCENTER);

 // restore old text color
 dc.SetTextColor( OldColor);
 // restore old font
 dc.SelectObject(OldFont); 
 // Do not call CView::OnPaint() for painting messages
}

涓冦佺畝鍗曠殑娑堟伅媯绱㈠拰鎶藉彇鍑芥暟錛岃兘澶熻緋葷粺鍝嶅簲鍏跺畠鎿嶄綔
BOOL PeekAndPump()
{
 static MSG msg;

 while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) {
  if (!AfxGetApp()->PumpMessage()) {
   ::PostQuitMessage(0);
   return FALSE;
  } 
 }
 return TRUE;
}

鍏佸湪浣犵殑紼嬪簭涓敤鍔ㄧ敾鍏夋爣鏇挎崲榛樿鐨勭瓑寰呭厜鏍?(ANI鍏夋爣鐨勪嬌鐢?
 HCURSOR m_hAniCursor=NULL;
 BeginWaitCursor();   //begin wait cursor for api function
 
 //load ani cursor from file in current path
 TCHAR cursorPath[MAX_PATH]; GetModuleFileName(NULL,cursorPath,MAX_PATH);
 char drive[_MAX_DRIVE];
 char dir[_MAX_DIR];
 char fname[_MAX_FNAME];
 char ext[_MAX_EXT];
 _splitpath(cursorPath, drive, dir, fname, ext );
 sprintf(cursorPath,"%s%swait.ani",drive,dir);  //ani cursor file name is wait.ani
 
 m_hAniCursor= LoadCursorFromFile(cursorPath);
 HCURSOR oldCursor;
 if(m_hAniCursor != NULL)
  oldCursor=SetCursor(m_hAniCursor);
 
 for(long i=0;i<1000;i++) 
  Sleep(5);
 
 oldCursor=NULL;
 m_hAniCursor=NULL;
 EndWaitCursor();  //end wait cursor for api function

涔?jié)銆佸浣曢檺鍒剁紪杈戞涓殑鍑嗚瀛楃
     濡傛灉鐢ㄦ埛鍦ㄧ紪杈戞帶浠朵腑鍙厑璁告帴鏀舵暟瀛楋紝鍙互浣跨敤涓涓爣鍑嗙殑緙栬緫鎺т歡騫舵寚
瀹氭柊鐨勫垱寤烘爣蹇桬S_NUMBERS,瀹冩槸Windows 95鏂板鍔犵殑鏍囧織錛岃鏍囧織闄愬埗 緙栬緫鎺?BR>浠跺彧鎸夋敹鏁板瓧瀛楃銆?BR>濡傛灉鐢ㄦ埛闇瑕佸鏉傜殑緙栬緫鎺т歡錛屽彲浠ヤ嬌鐢∕icrosoft 鐨勫睆钄界紪杈戞帶浠訛紝瀹冩槸涓涓緢鏈夌敤鐨凮LE瀹氬埗鎺т歡銆?BR>    濡傛灉甯屾湜涓嶄嬌鐢∣LE 瀹氬埗鎺т歡鑷繁澶勭悊瀛楃錛屽彲浠ユ淳鐢熶竴涓狢Edit 綾誨茍澶勭悊WM_CHAR娑堟伅錛岀劧鍚庝粠緙栬緫鎺т歡涓繃婊ゅ嚭鐗瑰畾鐨勫瓧絎︺傞鍏堬紝浣跨敤ClassWizard 寤虹珛涓涓?CEdit鐨勬淳鐢熺被錛屽叾嬈★紝鍦ㄥ璇濈被涓寚瀹氫竴涓垚鍛樺彉閲忓皢緙栬緫鎺т歡鍒嗙被鍦∣nInitdialog 涓皟鐢–Wnd: : SubclassDlgItem .

//In your dialog class declaration (.H file )
private :
    CMyEdit m_wndEdit ; // Instance of your new edit control .

//In you dialog class implementation (.CPP file )
BOOL CSampleDialog : : OnInitDialog ( )
{

    //Subclass the edit lontrod .
    m_wndEdit .SubclassDlgItem  (IDC_EDIT,this );
    鈥?BR>}
    浣跨敤ClassWizard澶勭悊WM_CHAR娑堟伅錛岃綆梟Char鍙傞噺騫跺喅瀹氭墍鎵ц鐨勬搷浣滐紝鐢ㄦ埛鍙互紜畾鏄惁淇敼銆佷紶閫佸瓧絎︺備笅渚嬭鏄庝簡濡備綍鏄劇ず瀛楁瘝瀛楃錛屽鏋滃瓧絎︽槸瀛楁瘝瀛楃錛屽垯璋冪敤CWnd ; OnChar錛屽惁鍒欎笉璋冪敤OnChar.
//Only display alphabetic dharacters .
void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UITN nFlags )
{
    //Determine if nChar is an alphabetic character .
    if (: : IsCharAlpha  ( ( TCHAR) nChar ) )
        CEdit : : OnChar (nChar, nRepCnt , nFlags );
}
    濡傛灉瑕佷慨鏀瑰瓧絎︼紝鍒欎笉鑳戒粎浠呯畝鍗曞湴鐢ㄤ慨鏀硅繃鐨刵Char璋冪敤CEdit : : OnChar銆傝淇敼涓涓瓧絎︼紝闇瑕侀鍏堜慨鏀筺Char錛岀劧鍚庣敤淇敼榪囩殑nChar璋冪敤CWnd: : DefWindowProc銆備笅渚嬭鏄庝簡濡備綍灝嗗瓧絎﹁漿鍙樹負(fù)澶у啓錛?BR>//Make all characters uppercase
void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UINT nFlags )
{
    //Make sure character is uppercase .
    if (: : IsCharAlpha  ( .( TCHAR) nChar)
         nChar=: : CharUpper (nChar ) ;
    //Bypass default OnChar processing and directly call  default window proc.
    DefWindProc (WM_CHAR, nChar , MAKELPARAM (nRepCnt , nFlags )) ;
}

鍗併佷覆澶暱鏃跺浣曞湪鍏舵湯灝炬樉紺轟竴涓渷鐣ュ彿
    璋冪敤CDC:: DrawText騫舵寚瀹欴T_END_ELLIPSIS鏍囧織錛岃繖鏍峰氨鍙互鐢ㄥ皬鐣ュ彿鍙栦唬涓叉湯灝劇殑瀛楃浣垮叾閫傚悎浜庢寚瀹氱殑杈圭晫鐭╁艦銆傚鏋滆鏄劇ず璺緞淇℃伅錛屾寚瀹欴T_END_ELLIPSIS鏍囧織騫剁渷鐣ュ彿鍙栦唬涓蹭腑闂寸殑瀛楃銆?BR>void CSampleView:: OnDraw (CDC* pDC)
{
     CTestDoc* pDoc=GetDocument ();
     ASSERT_VALID (pDoc);
                                                                                   
     //Add ellpsis to end of string if it does not fit
     pDC->Drawtext (CString ("This is a long string"),
         CRect (10, 10, 80, 30), DT_LEFT | DT_END_ELLIPSIS);

     //Add ellpsis to middle of string if it does not fit
     pDC->DrawText (AfxgetApp () ->m_pszhelpfilePath,
         CRect (10, 40, 200, 60), DT_LEFT | DT_PATH_ELLIPSIS);
}

鍗佷竴銆佸浣曞疄鐜頒竴涓鐨尯鐭╁艦(鍏鋒湁韙抗鐭╁艦騫跺彲縐誨姩銆佺緝鏀劇殑鐭╁艦)
     CRectTracker鏄竴涓緢鏈夌敤鐨勭被錛屽彲浠ラ氳繃璋冪敤CRectTracker:: TrackRubberBand鍝嶅簲WM_LBUTTONDOWN娑堟伅鏉ュ垱寤轟竴涓鐨尯鐭╁艦銆備笅渚嬭〃鏄庝嬌鐢–RectTracker縐誨姩鍜岄噸緗紿椾腑鐨勮摑鑹叉き鍦嗙殑澶у皬鏄緢瀹規(guī)槗鐨勪簨鎯呫?BR>    棣栧厛錛屽湪鏂囨。綾諱腑澹版槑涓涓狢RectTracker鏁版嵁鎴愬憳錛?BR>class CTestDoc: Public CDocument
{鈥?BR>public:
 CRectTracker m_tracker;
鈥?BR>};
     鍏舵錛屽湪鏂囨。綾葷殑鏋勯犲嚱鏁頒腑鍒濆鍖朇RectTracker 瀵硅薄錛?BR>CTestDoc::CTestDoc()
{
 m_tracker.m_rect.SetRect (10, 10, 300, 300);
 m_tracker.m_nStyle=CRectTracker:: resizeInside  |
  CRectTracker:: dottedLine; 
}
     鐒跺悗錛屽湪瑙嗗浘綾葷殑OnDraw鍑芥暟涓敾妞渾鍜岃釜榪圭煩褰細(xì)
void CTestView::OnDraw(CDC* pDC)
{
 CTestDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);

//Select blue brush into device context.
     CBrush brush (RGB (0, 0, 255));
     CBrush* pOldBrush=pDC->SelectObject (&brush);

     //draw ellipse in tracking rectangle.
     CRect rcEllipse;
     pDoc->m_tracker.GetTrueRect (rcEllipse);
     pDC->Ellipse (rcEllipse);

     //Draw tracking rectangle.
     pDoc->m_tracker.Draw (pDC);
     //Select blue brush out of device context.
     pDC->SelectObject(pOldBrush);
}
    鏈鍚庯紝瑙嗗浘綾諱腑澶勭悊WM_LBUTTONDOWN娑堟伅錛屽茍澧炲姞涓嬭堪浠g爜銆傝孌典唬鐮佹牴鎹紶鏍囧嚮閿儏鍐靛彲浠ユ嫋鏀俱佺Щ鍔ㄦ垨鑰呴噸緗き鍦嗙殑澶у皬銆?/P>

void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
   //Get pointer to document.
     CTestDoc* pDoc=GetDocument();
     ASSERT_VALID (pDoc);

     //If clicked on ellipse, drag or resize it. Otherwise create a
     //rubber-band rectangle nd create a new ellipse.
     BOOL bResult=pDoc->m_tracker.HitTest (point)!=
         CRectTracker::hitNothing;

     //Tracker rectangle changed so update views.
     if (bResult)
     {
        pDoc->m_tracker.Track (this,point,TRUE);
        pDoc->SetModifiedFlag ();
        pDoc->UpdateAllViews (NULL);
     }
     else
        pDoc->m_tracker.TrackRubberBand (this,point,TRUE);

 CView::OnLButtonDown(nFlags, point);
}

鍗佷簩銆佸浣曞湪涓存椂鐩綍鍒涘緩涓涓復(fù)鏃舵枃浠?/STRONG>
濡傛灉浣犺鍦ㄤ復(fù)鏃剁洰褰曚笅鍒涘緩涓存椂鏂囦歡錛屼笅闈㈢殑浠g爜鑳藉府鍒頒綘鐨勫繖銆?BR>bool GetuniqueTempName (CString& strTempName)
{
  strTempName="";
     //Get the temporary files directory.
     TCHAR szTempPath [MAX_PATH];
     DWORD dwResult=:: GetTempPath (MAX_PATH, szTempPath);
     if (dwResult==0)
   return false;

     //Create a unique temporary file.
     TCHAR szTempFile[MAX_PATH];
     UINT nResult=GetTempFileName (szTempPath, _T ("~ex"),0,szTempFile);
     if (dwResult==0)
   return false;

     strTempName=szTempFile;
  return true;
}

鍗佷笁銆佸浣曢檺鍒剁獥鍙g殑鏈灝忚寖鍥?/STRONG>
瑕侀檺鍒剁獥浣撶殑澶у皬錛屼笅闈㈢殑浠g爜鑳藉府鍒頒綘鐨勫繖銆?BR>鍦–MainFrame涓鍔燱M_GETMAXMININFO娑堟伅鐨勫鐞嗗嚱鏁幫紝鐒跺悗鍦ㄨ繖涓嚱鏁頒腑鍐欎唬鐮佸涓?
//闄愬埗涓葷獥浣撶殑鏈灝忛珮搴﹀拰瀹藉害
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
 lpMMI->ptMinTrackSize.x=600;
 lpMMI->ptMinTrackSize.y=400;
 CNewFrameWnd::OnGetMinMaxInfo(lpMMI);
}

鍗佸洓銆佹庢牱鍒犻櫎鏂囦歡鍒板洖鏀剁珯涓?/STRONG>
 瑕佸垹闄ゆ枃浠跺埌鍥炴敹绔欙紝寰堢畝鍗曘傚彧瑕佺敤SHFileOperation鍑芥暟灝辮浜嗭紝涓嬮潰鐨勪唬鐮佹垜灝嗕負(fù)浣犳紨紺轟簡榪欎竴涓嚱鏁扮殑鐢ㄦ硶銆傚綋鐒朵綘鍙互鐩存帴鎷瘋礉鍒頒綘鐨勯」鐩腑銆?BR>//鍒犻櫎鏂囦歡鍒板洖鏀剁珯涓?BR>//pszPath  : 寰呭垹闄ょ殑鍏ㄨ礬寰勬枃浠跺悕
//bDelete  : TRUE 鍒犻櫎錛屼笉縐誨埌鍥炴敹绔欙紝FALSE:縐誨埌鍥炴敹绔?BR>涓銆?nbsp;//榪斿洖    : TRUE 鍒犻櫎鎴愬姛     FALSE 鍒犻櫎澶辮觸
BOOL CDelFileToRecycleDlg::Recycle(LPCTSTR pszPath, BOOL bDelete/*=FALSE*/)
{
 SHFILEOPSTRUCT  shDelFile;
 memset(&shDelFile,0,sizeof(SHFILEOPSTRUCT));
 shDelFile.fFlags |= FOF_SILENT;      // don"t report progress
 shDelFile.fFlags |= FOF_NOERRORUI;     // don"t report errors
 shDelFile.fFlags |= FOF_NOCONFIRMATION;    // don"t confirm delete
 // Copy pathname to double-NULL-terminated string.
 //
 TCHAR buf[_MAX_PATH + 1]; // allow one more character
 _tcscpy(buf, pszPath);   // copy caller"s pathname
 buf[_tcslen(buf)+1]=0;   // need two NULLs at end

 // Set SHFILEOPSTRUCT params for delete operation
 shDelFile.wFunc = FO_DELETE;       // REQUIRED: delete operation
 shDelFile.pFrom = buf;         // REQUIRED: which file(s)
 shDelFile.pTo = NULL;          // MUST be NULL
 if (bDelete)
 {         // if delete requested..
  shDelFile.fFlags &= ~FOF_ALLOWUNDO;    // ..don"t use Recycle Bin
 }
 else
 {           // otherwise..
  shDelFile.fFlags |= FOF_ALLOWUNDO;    // ..send to Recycle Bin
 }
     return SHFileOperation(&shDelFile);    // do it!
}

鍗佷簲銆佸唴瀛樻硠婕忔鏌?/STRONG>
    涔熻浣犲凡緇忕煡閬擄紝鍦–++鍜孋璇█涓寚閽堥棶棰樹篃灝辨槸鍐呭瓨鐢寵涓庨噴鏀炬槸涓涓護(hù)浜哄ご鐤肩殑浜嬫儏錛屽亣濡備綘鐢寵浜嗗唴瀛橈紝浣嗘病鏈夐噴鏀撅紝騫朵笖浣犵殑紼嬪簭闇瑕侀暱鏃墮棿鍦拌繍琛岋紝閭d箞錛岀郴緇熺殑璧勬簮灝嗛愭笎鍑忓皯錛屽綋緋葷粺鐨勮祫婧愬叏閮ㄨ鐢ㄥ畬鏃訛紝緋葷粺灝嗕細(xì)宕╂簝銆傛墍浠ュ湪寮鍙戠▼搴忕殑榪囩▼涓竴瀹氳淇濊瘉璧勬簮鐨勫畬鍏ㄩ噴鏀俱備笅闈㈡垜浠潵浠嬬粛鍐呭瓨婕忔礊鐨勬鏌ャ?BR>紺轟緥濡備笅錛?BR>// do your memory allocations and deallocations...
 CString s = "This is a frame variable";
#ifdef _DEBUG
 CMemoryState oldMemState, newMemState, diffMemState;
 oldMemState.Checkpoint();
#endif
 // the next object is a heap object
 CString* p = new CString( "Smith  Alan  581_0215" );
 delete p;
 p=NULL;
#ifdef _DEBUG
 newMemState.Checkpoint();
 BOOL b=diffMemState.Difference(oldMemState, newMemState);
 if (b)
 {
  AfxMessageBox( "Memory leaked! " );
 }
#endif
    鏍規(guī)嵁璇曢獙錛岀敱浜庢垜浠棤娉曢噴鏀炬帀璞nt CString char 鐢寵鐨勫彉閲忋傚彧鑳介噴鏀炬寚閽堝瀷鐨勫彉閲忋傝屾嫻嬪唴瀛樻椂錛岀収鏍蜂細(xì)鍑虹幇鍐呭瓨娉勬紡鐜拌薄銆傛墍浠ワ紝榪欑鍐呭瓨?gòu)個嫻嬫柟寮忓眬闄愭ц繕鏄緢澶с傚洜涓烘垜浠棤娉曢噴鏀鵑潪鎸囬拡鍨嬪彉閲忋?/P>

]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲欧美视频一区二区三区| 国产精品激情电影| 99精品国产在热久久下载| 欧美激情一区二区三区成人| 欧美激情第9页| 欧美影院在线| 欧美激情第五页| 久久欧美中文字幕| 国产精品多人| 亚洲精品四区| 国产亚洲网站| 亚洲精品女人| 国产精品视频xxxx| 日韩视频一区二区三区在线播放免费观看 | 性欧美大战久久久久久久免费观看 | 亚洲激情一区| 久久精品国产一区二区三区| 99成人精品| 欧美激情一区二区三区在线视频观看| 欧美一二三视频| 亚洲欧美另类综合偷拍| 欧美黄网免费在线观看| 免费人成精品欧美精品| 国产精品爽爽ⅴa在线观看| 亚洲欧洲日韩在线| 亚洲欧洲另类国产综合| 久久天堂av综合合色| 亚洲蜜桃精久久久久久久| 看片网站欧美日韩| 99国产精品自拍| 亚洲国产成人久久综合一区| 国产日韩欧美精品在线| 欧美专区在线| 99热精品在线观看| 久久精品亚洲一区二区三区浴池 | 欧美一区观看| 国产区在线观看成人精品| 久久免费少妇高潮久久精品99| 欧美成人免费网站| 国产精品99久久久久久久久久久久 | 小辣椒精品导航| 欧美激情第8页| 亚洲欧美国产日韩天堂区| 在线不卡亚洲| 亚洲综合第一| 国产日韩欧美夫妻视频在线观看| 欧美日韩专区在线| 亚洲欧美一区二区激情| 中文精品99久久国产香蕉| 91久久精品国产91性色| 亚洲精品日韩欧美| 最新国产の精品合集bt伙计| 亚洲夫妻自拍| 日韩亚洲一区在线播放| 99国产精品99久久久久久| 亚洲欧美中日韩| 久久精品91| 欧美区在线观看| 午夜精品一区二区三区在线播放 | 亚洲综合国产| 欧美精品一区二区三| 日韩亚洲不卡在线| 巨胸喷奶水www久久久免费动漫| 亚洲另类自拍| 禁断一区二区三区在线| 欧美日韩色一区| 久久av资源网站| 亚洲天堂久久| 99re热这里只有精品免费视频| 亚洲中无吗在线| 99精品久久免费看蜜臀剧情介绍| 国内外成人免费激情在线视频网站| 麻豆国产精品va在线观看不卡| 国产精品99久久久久久有的能看| 欧美成人精品激情在线观看 | 亚洲欧美在线网| 国一区二区在线观看| 国产一区二区三区免费观看| 欧美成人高清| 欧美成人高清视频| 欧美日韩在线一区二区三区| 欧美一区二区日韩| 六月天综合网| 欧美日韩另类综合| 久久精品水蜜桃av综合天堂| 最新日韩av| 亚洲制服丝袜在线| 91久久精品美女高潮| 国内一区二区在线视频观看| 国产麻豆日韩| 国内精品写真在线观看| 亚洲电影免费观看高清完整版| 亚洲黄一区二区三区| 日韩亚洲欧美中文三级| 久久久久国产精品一区二区| 久久久综合网站| 一本大道av伊人久久综合| 亚洲精品国产品国语在线app| 欧美大胆人体视频| 亚洲午夜伦理| 欧美高清免费| 午夜日本精品| 亚洲三级视频| 国产日韩精品视频一区| 免费视频亚洲| 亚洲欧美日韩一区二区| 亚洲国产日韩在线| 久久成人av少妇免费| 亚洲精品久久久久久久久久久久 | 欧美电影资源| 欧美一区二区三区在线视频 | 国产精品扒开腿做爽爽爽视频| 欧美一区2区三区4区公司二百| 亚洲日本视频| 欧美v日韩v国产v| 欧美在线观看你懂的| 一本色道久久综合亚洲精品不卡 | 亚洲欧美一区二区原创| 亚洲精品日本| 在线成人亚洲| 国产亚洲欧美日韩美女| 国产精品国产三级国产aⅴ浪潮| 蜜桃av一区二区三区| 欧美在线关看| 亚洲欧美韩国| 国产精品99久久久久久有的能看| 亚洲高清av在线| 欧美成人蜜桃| 另类天堂av| 久久久久亚洲综合| 欧美伊人影院| 久久se精品一区精品二区| 亚洲午夜久久久久久久久电影网| 亚洲毛片在线看| 亚洲精品久久在线| 亚洲欧洲日本一区二区三区| 韩国福利一区| 一色屋精品视频免费看| 国内欧美视频一区二区| 国产日韩欧美在线播放| 国产乱码精品| 国产区在线观看成人精品| 国产精品亚洲美女av网站| 国产精品乱子乱xxxx| 国产精品国产一区二区| 国产精品久久久久久久久久妞妞 | 国产欧美日韩在线播放| 国产欧美一区二区精品婷婷| 国产欧美精品日韩精品| 国产专区综合网| 亚洲成色777777女色窝| 亚洲国产高清自拍| 亚洲精品专区| 亚洲无线视频| 久久激情视频| 免费高清在线一区| 亚洲日本欧美在线| 欧美精品久久久久久久久久| 欧美日韩国产在线观看| 国产精品看片你懂得| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 久久久免费精品| 亚洲成人中文| 亚洲午夜精品视频| 久久久久久久久久久成人| 免费日本视频一区| 国产精品大全| 在线成人av.com| 亚洲午夜一区二区三区| 欧美在线一二三| 亚洲成色777777女色窝| 亚洲视频一起| 久久亚洲精品伦理| 欧美香蕉视频| 亚洲第一页中文字幕| 亚洲欧美精品在线观看| 久久亚洲精品伦理| 99re6热在线精品视频播放速度| 亚洲欧美在线磁力| 欧美精品偷拍| 国内精品**久久毛片app| 日韩午夜电影在线观看| 久久国产精品电影| 99亚洲视频| 麻豆免费精品视频| 国产日韩欧美一区在线| 一本久久精品一区二区| 久久婷婷麻豆| 亚洲欧美99| 欧美日韩国产精品一卡| 在线观看国产成人av片| 午夜亚洲视频| 亚洲免费观看高清在线观看| 久久久久久色| 国产精品综合av一区二区国产馆| 亚洲精品极品| 欧美成人按摩| 久久精品av麻豆的观看方式| 国产精品网站在线播放| 中文在线一区|