锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
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鏍規嵁鏂囦歡鍚嶅悗緙錛岃嚜鍔ㄨ瘑鍒枃浠剁被鍨?
銆銆渚嬪瓙鐢ㄦ硶:
銆銆gcc -x c hello.pig -x none hello2.c
銆銆
-c
銆銆鍙縺媧婚澶勭悊,緙栬瘧,鍜屾眹緙?涔熷氨鏄粬鍙妸紼嬪簭鍋氭垚obj鏂囦歡
銆銆渚嬪瓙鐢ㄦ硶:
銆銆gcc -c hello.c
銆銆浠栧皢鐢熸垚.o鐨刼bj鏂囦歡
-S
銆銆鍙縺媧婚澶勭悊鍜岀紪璇戯紝灝辨槸鎸囨妸鏂囦歡緙栬瘧鎴愪負姹囩紪浠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鐢ㄤ範鎯簡)
銆銆gcc -o hello.asm -S hello.c
-pipe
銆銆浣跨敤綆¢亾浠f浛緙栬瘧涓復鏃舵枃浠?鍦ㄤ嬌鐢ㄩ潪gnu姹囩紪宸ュ叿鐨勬椂鍊?鍙兘鏈変簺闂
銆銆gcc -pipe -o hello.exe hello.c
-ansi
銆銆鍏抽棴gnu c涓笌ansi c涓嶅吋瀹圭殑鐗規?嬋媧籥nsi c鐨勪笓鏈夌壒鎬?鍖呮嫭紱佹涓浜沘sm inl
ine typeof鍏抽敭瀛?浠ュ強UNIX,vax絳夐澶勭悊瀹?
-fno-asm
銆銆姝ら夐」瀹炵幇ansi閫夐」鐨勫姛鑳界殑涓閮ㄥ垎錛屽畠紱佹灝哸sm,inline鍜宼ypeof鐢ㄤ綔鍏抽敭瀛椼?
銆銆銆銆
-fno-strict-prototype
銆銆鍙g++璧蜂綔鐢?浣跨敤榪欎釜閫夐」,g++灝嗗涓嶅甫鍙傛暟鐨勫嚱鏁?閮借涓烘槸娌℃湁鏄懼紡鐨勫鍙傛暟
鐨勪釜鏁板拰綾誨瀷璇存槑,鑰屼笉鏄病鏈夊弬鏁?
銆銆鑰実cc鏃犺鏄惁浣跨敤榪欎釜鍙傛暟,閮藉皢瀵規病鏈夊甫鍙傛暟鐨勫嚱鏁?璁や負鍩庢病鏈夋樉寮忚鏄庣殑綾誨瀷
銆銆
-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++浼氬厛鍦ㄥ綋鍓嶇洰褰曟煡鎵句綘鎵鍒跺畾鐨勫ご鏂囦歡,濡?
鏋滄病鏈夋壘鍒?浠栧洖鍒扮己鐪佺殑澶存枃浠剁洰褰曟壘,濡傛灉浣跨敤-I鍒跺畾浜嗙洰褰?浠?
銆銆鍥炲厛鍦ㄤ綘鎵鍒跺畾鐨勭洰褰曟煡鎵?鐒跺悗鍐嶆寜甯歌鐨勯『搴忓幓鎵?
銆銆瀵逛簬#include<file>,gcc/g++浼氬埌-I鍒跺畾鐨勭洰褰曟煡鎵?鏌ユ壘涓嶅埌,鐒跺悗灝嗗埌緋葷粺鐨勭己
鐪佺殑澶存枃浠剁洰褰曟煡鎵?
銆銆
-I-
銆銆灝辨槸鍙栨秷鍓嶄竴涓弬鏁扮殑鍔熻兘,鎵浠ヤ竴鑸湪-Idir涔嬪悗浣跨敤
銆銆
-idirafter dir
銆銆鍦?I鐨勭洰褰曢噷闈㈡煡鎵懼け璐?璁插埌榪欎釜鐩綍閲岄潰鏌ユ壘.
銆銆
-iprefix prefix
-iwithprefix dir
銆銆涓鑸竴璧蜂嬌鐢?褰?I鐨勭洰褰曟煡鎵懼け璐?浼氬埌prefix+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鍒嗘垚澶氫釜閫夐」,鐒?
鍚庝紶閫掔粰浼氭眹緙栫▼搴?
銆銆
-Wl.option
銆銆姝ら夐」浼犻抩ption緇欒繛鎺ョ▼搴?濡傛灉option涓棿鏈夐楀彿,灝卞皢option鍒嗘垚澶氫釜閫夐」,鐒?
鍚庝紶閫掔粰浼氳繛鎺ョ▼搴?
銆銆
-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
銆銆璇曞浘璁╃紪璇戝櫒鏀寔浼犵粺鐨凜璇█鐗規?
[鍙傝冭祫鏂橾
-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緙栬瘧鐨?涓樁孌電殑鍛戒護
榪愯 gcc/egcs
**********榪愯 gcc/egcs***********************
銆銆GCC 鏄?GNU 鐨?C 鍜?C++ 緙栬瘧鍣ㄣ傚疄闄呬笂錛孏CC 鑳藉緙栬瘧涓夌璇█錛欳銆丆++ 鍜?O
bject C錛圕 璇█鐨勪竴縐嶉潰鍚戝璞℃墿灞曪級銆傚埄鐢?gcc 鍛戒護鍙悓鏃剁紪璇戝茍榪炴帴 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;
}
-----------------------
鍒╃敤濡備笅鐨勫懡浠ゅ彲緙栬瘧鐢熸垚鍙墽琛屾枃浠訛紝騫舵墽琛岀▼搴忥細
$ gcc -o factorial main.c factorial.c
$ ./factorial 5
Factorial of 5 is 120.
銆銆GCC 鍙悓鏃剁敤鏉ョ紪璇?C 紼嬪簭鍜?C++ 紼嬪簭銆備竴鑸潵璇達紝C 緙栬瘧鍣ㄩ氳繃婧愭枃浠剁殑鍚庣紑
鍚嶆潵鍒ゆ柇鏄?C 紼嬪簭榪樻槸 C++ 紼嬪簭銆傚湪 Linux 涓紝C 婧愭枃浠剁殑鍚庣紑鍚嶄負 .c錛岃?C++ 婧?
鏂囦歡鐨勫悗緙鍚嶄負 .C 鎴?.cpp銆備絾鏄紝gcc 鍛戒護鍙兘緙栬瘧 C++ 婧愭枃浠訛紝鑰屼笉鑳借嚜鍔ㄥ拰 C
++ 紼嬪簭浣跨敤鐨勫簱榪炴帴銆傚洜姝わ紝閫氬父浣跨敤 g++ 鍛戒護鏉ュ畬鎴?C++ 紼嬪簭鐨勭紪璇戝拰榪炴帴錛岃紼?
搴忎細鑷姩璋冪敤 gcc 瀹炵幇緙栬瘧銆傚亣璁炬垜浠湁涓涓涓嬬殑 C++ 婧愭枃浠訛紙hello.C錛夛細
#include <iostream>
void main (void)
{
銆銆cout << "Hello, world!" << endl;
}
鍒欏彲浠ュ涓嬭皟鐢?g++ 鍛戒護緙栬瘧銆佽繛鎺ュ茍鐢熸垚鍙墽琛屾枃浠訛細
$ g++ -o hello hello.C
$ ./hello
Hello, world!
**********************gcc/egcs 鐨勪富瑕侀夐」*********
gcc 鍛戒護鐨勫父鐢ㄩ夐」
閫夐」 瑙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 鐢熸垚鎵鏈夎鍛婁俊鎭?
]]>
Author錛歴ungo (TW@Javaworld) 鏂囩珷鍘熸枃錛?A >http://www.javaworld.com.tw/jute/post/view?bid=10&id=53262&sty=1&tpg=1&age=0
Eclipse闄や簡鍙互闁嬬櫦Java涔嬪錛岄倓鏀彺浜嗚ū澶氳獮璦錛岀従鍦ㄥ厛浠嬬垂
C銆丆++鐨勯枊鐧肩挵澧冭ō瀹氾紝浠ュ緦鏈夋鏈冨啀浠嬬垂鍏跺畠鐨勩侲njoy it錛?
OS錛歐indows XP Professional SP1
浣跨敤鐗堟湰錛欵clipse 2.1.2
涓.棣栧厛瑕佷笅杓塁DT錛孍clipse 2.1.2浣跨敤鑰咃紝璜嬩笅杓夐欓爡錛?
CDT 1.2 Full for Windows R2.1.1 1.2.0 GA - Full - Windows銆?
Eclipse 2.1.3浣跨敤鑰呰珛涓嬭級錛欳DT 1.2.1銆?
Eclipse 3.0 M7浣跨敤鑰呰珛涓嬭級錛欳DT 2.0 M7銆?
Eclipse 3.0 M8浣跨敤鑰呰珛涓嬭級錛欳DT 2.0 M8銆?
Eclipse 3.0 M9浣跨敤鑰呰珛涓嬭級錛欳DT 2.0 M9銆?
涓嬭級綞插潃錛?/FONT>http://www.eclipse.org/cdt/
瀹夎錛氬皣瑙e綹緦鐨刦eatures銆乸lugins鏁村嬭硣鏂欏ぞ瑜囪=鍒癊clipse瀹夎璩囨枡
瑁★紝閲嶆柊闁嬪暉Eclipse鍗沖彲銆?
浜?涓嬭級鍙湪Windows涓婁嬌鐢ㄧ殑GNU C銆丆++綬ㄨ鍣紝閫欒!瑕佷笅杓夌殑鏄細MinGW銆?
Download闋侀潰寰堥暦鐨勪竴涓詫紝璜嬮伕鎿囬欏嬬増鏈細
MinGW bin MinGW-3.1.0-1.exe 14863 kb Sep 15, 2003 11:14
涓嬭級綞插潃錛?/FONT>http://www.mingw.org/download.shtml
瀹夎錛氬畨瑁濈洰閷勯伕C妲斤紝鐒跺緦鐙傞粸涓嬩竴姝?Next)灝辮浜嗐傚畨瑁濆畬寰岃礬寰戞槸閫?
妯?>C:\MinGW銆?
涓?鍏堝湪Command Line妯″紡涓嬫脯瑭︾法璀垏鍩瘋銆傚厛灝嘋:\MinGW\bin搴曚笅鐨?
mingw32-make.exe鏇村悕鐐簃ake.exe錛屽洜鐐哄緟鏈冨湪Eclipse浣跨敤鏅傚畠闋愯ō
鏈冩姄緋葷當瑁ake閫欏嬫獢鍚嶈屼笉鏄痬ingw32-make銆?
(璦伙細濡傛灉涓嶆洿鍚嶆垨鏄倓鏈夊叾浠杕ake紼嬪紡鏅傦紝涔熷彲浠ュ湪紼嶅緦鐨凟clipse璦畾
涓紝鍦╩ake targets view鐨勫湴鏂癸紝鏂板涓鍊媡ask鏅傦紝build command 鍙栨秷
use default , 浣跨敤 mingw32-make錛屾垨鍦╬roject properties->make project ->
灝噈ake 鏀圭偤 mingw32-make ) -- 鐢?B> snpshu 瑁滃厖銆?/FONT>
鍦ㄧ挵澧冭畩鏁歌!鍔犲叆涓嬪垪璦畾錛?
PATH 錛?C:\MinGW\bin; (濡傛灉緋葷當宸茬稉鏈夎鍏跺畠C/C++綬ㄨ鍣紝璜嬫妸C:\MinGW\bin鍔犲湪鏈鍓嶉潰銆?
LIBRARY_PATH 錛欳:\MinGW\lib
C_INCLUDE_PATH 錛欳:\MinGW\include
CPLUS_INCLUDE_PATH 錛欳:\MinGW\include\c++\3.2.3;C:\MinGW\include\c++\3.2.3\mingw32;
C:\MinGW\include\c++\3.2.3\backward;C:\MinGW\include
鍏堜嬌鐢ㄦ枃瀛楃法杓櫒綬ㄥ娓│鐢ㄧ殑鍘熷妾旓紝妾斿悕錛歮ain.cpp銆?
1
2
3
4
5
6
7
8#include <iostream>
using namespace std;
int main(void) {
cout << "Can You Feel My World錛? ;
return 0;
}
鍦–ommand Line涓嬬法璀寚浠わ細
1
C:\g++ main.cpp -O3 -o hello
(O3鐨凮鏄嫳鏂囧ぇ瀵?姝?)
綬ㄨ鎴愬姛寰岋細渚挎渻鐢㈢敓hello.exe鐨勫煼琛屾獢銆?
鍩瘋鐣潰濡備笅錛?
1
2
3
4
5
6
7
8
9
10Microsoft Windows XP [鐗堟湰 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\Sungo>cd\
C:\>g++ main.cpp -O3 -o hello
C:\>hello
Can You Feel My World錛?
C:\>
璦伙細-O3 鏃楁琛ㄧず鎺℃渶楂樼礆綬ㄨ鏈浣沖寲錛岀法璀熷害鏈鎱紝浣嗙敘鐢熺殑鍩瘋妾?
妾旀鏈冩渶灝忥紝鍩瘋閫熷害鏈冩渶蹇紱-o 鏃楁琛ㄧず灝囩法璀畬鐨?.exe閲嶆柊鏇村悕銆?
鈼庢椹熶竴.闁嬪暉Eclipse寰岋紝棣栧厛鍏堥枊鍟烠/C++灝堢敤瑕栨櫙銆?
Windows->Open Perspective->C/C++ Development
鈼庢椹熶簩.寤虹珛涓鍊婥++鐢ㄧ殑灝堟銆?
File-New->Project->C++->Standard Make C++ Project
(鎺ヤ笅渚嗙殑姝ラ璺熷緩绔嬩竴鑸殑Java灝堟涓妯o紝鐨嗘帯闋愯ō鍗沖彲)
鈼庢椹熶笁.鎶婃垜鍊戝墰鍓涘鐨刴ain.cpp import閫蹭締錛屽姞鍒板皥妗堣!銆?
File->Import->File System->鐎忚C:\main.cpp
鈼庢椹熷洓.寤虹珛涓鍊媘akefile銆?
File->New->File錛屾獢妗堝悕紼卞~錛歮akefile銆?涓嶉渶鎵撳壇妾斿悕)
makefile鍏у濡備笅錛?
1
2all:
g++ main.cpp -g -o run
娉ㄦ剰錛歮akefile綹帓瑕佷互Tab閸典綔綹帓錛屼笉鑳戒互絀烘牸4浣滅府鎺掞紝
鍚﹀墖Build鏈冩湁鍟忛銆?/FONT>
鈼庢椹熶簲.璦畾Make Targets銆?
Windows-Show View->Make Targets
鍦∕ake Targets瑕栫獥瑁℃寜婊戦紶鍙抽嵉錛孉dd Build Target
錛宯ame鎵擄細綬ㄨ銆侭uild Target鎵擄細all銆?
鈼庢椹熷叚.綬ㄨ銆?
鍦ㄥ墰鍓涘緩绔嬬殑Make Targets "綬ㄨ" 涓婇粸婊戦紶2涓嬶紝鍗蟲渻闁嬪綬ㄨ錛?
姝ゆ檪鎴戝戝彲浠ョ櫦鐝緃ello.exe宸茬稉鐢㈢敓鍦ㄦ垜鍊戝皥妗堜笅浜嗐傚彲鍦ㄥ簳涓?
C-Build瑕栫獥鐪嬪埌浠ヤ笅杓稿嚭緄愭灉錛?
1
2make -k all
g++ main.cpp -g -o run
鈼庢椹熶竷. *.exe鍩瘋鍓嶈ō瀹氥傚洜鐐哄湪Windows涓婻un錛屾墍浠ヨ鍏堜綔鍊嬭ō瀹?
錛岃珛闁嬪暉Project->Properties->C/C++ Make Project->Binary Parser闋侀潰銆?
Binary Parser涓嬫媺寮忛伕鍠紝灝嘐LF Parser鏀規垚PE Windows Parser銆?
鈼庢椹熷叓.鍩瘋銆?
Run->Run as->C Local Application銆?
鍦ㄥ簳涓婥onsloe瑕栫獥鐪嬪埌hello.exe鐨勫煼琛岀祼鏋溿?
璦伙細鐣跺師濮嬫獢鏈変慨鏀癸紝瑕侀噸鏂扮法璀檪錛屽彧瑕佹粦榧犻洐鎿婃垜鍊戝湪姝ラ浜?
鎵寤虹珛鐨凪ake Targets "綬ㄨ"錛屽嵆鍙疪ebuilding銆?
]]>
1. 鐢ㄩ澶勭悊鎸囦護#define 澹版槑涓涓父鏁幫紝鐢ㄤ互琛ㄦ槑1騫翠腑鏈夊灝戠錛堝拷鐣ラ棸騫撮棶棰橈級
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
鎴戝湪榪欐兂鐪嬪埌鍑犱歡浜嬫儏錛?
1). #define 璇硶鐨勫熀鏈煡璇嗭紙渚嬪錛氫笉鑳戒互鍒嗗彿緇撴潫錛屾嫭鍙風殑浣跨敤錛岀瓑絳夛級
2). 鎳傚緱棰勫鐞嗗櫒灝嗕負浣犺綆楀父鏁拌〃杈懼紡鐨勫鹼紝鍥犳錛岀洿鎺ュ啓鍑轟綘鏄浣曡綆椾竴騫翠腑鏈夊灝戠鑰屼笉鏄綆楀嚭瀹為檯鐨勫鹼紝鏄洿娓呮櫚鑰屾病鏈変唬浠風殑銆?
3). 鎰忚瘑鍒拌繖涓〃杈懼紡灝嗕嬌涓涓?6浣嶆満鐨勬暣鍨嬫暟婧㈠嚭-鍥犳瑕佺敤鍒伴暱鏁村瀷絎﹀彿L,鍛婅瘔緙栬瘧鍣ㄨ繖涓父鏁版槸鐨勯暱鏁村瀷鏁般?
4). 濡傛灉浣犲湪浣犵殑琛ㄨ揪寮忎腑鐢ㄥ埌UL錛堣〃紺烘棤絎﹀彿闀挎暣鍨嬶級錛岄偅涔堜綘鏈変簡涓涓ソ鐨勮搗鐐廣傝浣忥紝絎竴鍗拌薄寰堥噸瑕併?BR>
2. 鍐欎竴涓滄爣鍑嗏濆畯MIN錛岃繖涓畯杈撳叆涓や釜鍙傛暟騫惰繑鍥炶緝灝忕殑涓涓?BR>
#define MIN(A,B) ((A) <= (B) (A) : (B))
榪欎釜嫻嬭瘯鏄負涓嬮潰鐨勭洰鐨勮岃鐨勶細
1). 鏍囪瘑#define鍦ㄥ畯涓簲鐢ㄧ殑鍩烘湰鐭ヨ瘑銆傝繖鏄緢閲嶈鐨勶紝鍥犱負鐩村埌宓屽叆(inline)鎿嶄綔絎﹀彉涓烘爣鍑咰鐨勪竴閮ㄥ垎錛屽畯鏄柟渚夸駭鐢熷祵鍏ヤ唬鐮佺殑鍞竴鏂規硶錛屽浜庡祵鍏ュ紡緋葷粺鏉ヨ錛屼負浜嗚兘杈懼埌瑕佹眰鐨勬ц兘錛屽祵鍏ヤ唬鐮佺粡甯告槸蹇呴』鐨勬柟娉曘?
2). 涓夐噸鏉′歡鎿嶄綔絎︾殑鐭ヨ瘑銆傝繖涓搷浣滅瀛樺湪C璇█涓殑鍘熷洜鏄畠浣垮緱緙栬瘧鍣ㄨ兘浜х敓姣攊f-then-else鏇翠紭鍖栫殑浠g爜錛屼簡瑙h繖涓敤娉曟槸寰堥噸瑕佺殑銆?
3). 鎳傚緱鍦ㄥ畯涓皬蹇冨湴鎶婂弬鏁扮敤鎷彿鎷搗鏉?
4). 鎴戜篃鐢ㄨ繖涓棶棰樺紑濮嬭璁哄畯鐨勫壇浣滅敤錛屼緥濡傦細褰撲綘鍐欎笅闈㈢殑浠g爜鏃朵細鍙戠敓浠涔堜簨錛?
least = MIN(*p++, b);
3. 棰勫鐞嗗櫒鏍囪瘑#error鐨勭洰鐨勬槸浠涔堬紵
濡傛灉浣犱笉鐭ラ亾絳旀錛岃鐪嬪弬鑰冩枃鐚?銆傝繖闂瀵瑰尯鍒嗕竴涓甯哥殑浼欒鍜屼竴涓功鍛嗗瓙鏄緢鏈夌敤鐨勩傚彧鏈変功鍛嗗瓙鎵嶄細璇籆璇█璇炬湰鐨勯檮褰曞幓鎵懼嚭璞¤繖縐?
闂鐨勭瓟妗堛傚綋鐒跺鏋滀綘涓嶆槸鍦ㄦ壘涓涓功鍛嗗瓙錛岄偅涔堝簲璇曡呮渶濂藉笇鏈涜嚜宸變笉瑕佺煡閬撶瓟妗堛?BR>
姝誨驚鐜紙Infinite loops錛?BR>
4. 宓屽叆寮忕郴緇熶腑緇忓父瑕佺敤鍒版棤闄愬驚鐜紝浣犳庝箞鏍風敤C緙栧啓姝誨驚鐜憿錛?BR>
榪欎釜闂鐢ㄥ嚑涓В鍐蟲柟妗堛傛垜棣栭夌殑鏂規鏄細
while(1) { }
涓浜涚▼搴忓憳鏇村枩嬈㈠涓嬫柟妗堬細
for(;;) { }
榪欎釜瀹炵幇鏂瑰紡璁╂垜涓洪毦錛屽洜涓鴻繖涓娉曟病鏈夌‘鍒囪〃杈懼埌搴曟庝箞鍥炰簨銆傚鏋滀竴涓簲璇曡呯粰鍑鴻繖涓綔涓烘柟妗堬紝鎴戝皢鐢ㄨ繖涓綔涓轟竴涓満浼氬幓鎺㈢┒浠栦滑榪欐牱鍋氱殑
鍩烘湰鍘熺悊銆傚鏋滀粬浠殑鍩烘湰絳旀鏄細鈥滄垜琚暀鐫榪欐牱鍋氾紝浣嗕粠娌℃湁鎯沖埌榪囦負浠涔堛傗濊繖浼氱粰鎴戠暀涓嬩竴涓潖鍗拌薄銆?
絎笁涓柟妗堟槸鐢?goto
Loop:
...
goto Loop;
搴旇瘯鑰呭緇欏嚭涓婇潰鐨勬柟妗堬紝榪欒鏄庢垨鑰呬粬鏄竴涓眹緙栬璦紼嬪簭鍛橈紙榪欎篃璁告槸濂戒簨錛夋垨鑰呬粬鏄竴涓兂榪涘叆鏂伴鍩熺殑BASIC/FORTRAN紼嬪簭鍛樸?BR>
鏁版嵁澹版槑錛圖ata declarations錛?
5. 鐢ㄥ彉閲廰緇欏嚭涓嬮潰鐨勫畾涔?
a) 涓涓暣鍨嬫暟錛圓n integer錛?
b) 涓涓寚鍚戞暣鍨嬫暟鐨勬寚閽堬紙A pointer to an integer錛?
c) 涓涓寚鍚戞寚閽堢殑鐨勬寚閽堬紝瀹冩寚鍚戠殑鎸囬拡鏄寚鍚戜竴涓暣鍨嬫暟錛圓 pointer to a pointer to an integer錛?
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 錛?BR>
絳旀鏄細
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
浜轟滑緇忓父澹扮О榪欓噷鏈夊嚑涓棶棰樻槸閭g瑕佺炕涓涓嬩功鎵嶈兘鍥炵瓟鐨勯棶棰橈紝鎴戝悓鎰忚繖縐嶈娉曘傚綋鎴戝啓榪欑瘒鏂囩珷鏃訛紝涓轟簡紜畾璇硶鐨勬紜э紝鎴戠殑紜煡浜嗕竴涓嬩功銆?
浣嗘槸褰撴垜琚潰璇曠殑鏃跺欙紝鎴戞湡鏈涜闂埌榪欎釜闂錛堟垨鑰呯浉榪戠殑闂錛夈傚洜涓哄湪琚潰璇曠殑榪欐鏃墮棿閲岋紝鎴戠‘瀹氭垜鐭ラ亾榪欎釜闂鐨勭瓟妗堛傚簲璇曡呭鏋滀笉鐭ラ亾
鎵鏈夌殑絳旀錛堟垨鑷沖皯澶ч儴鍒嗙瓟妗堬級錛岄偅涔堜篃灝辨病鏈変負榪欐闈㈣瘯鍋氬噯澶囷紝濡傛灉璇ラ潰璇曡呮病鏈変負榪欐闈㈣瘯鍋氬噯澶囷紝閭d箞浠栧張鑳戒負浠涔堝嚭鍑嗗鍛紵
Static
6. 鍏抽敭瀛梥tatic鐨勪綔鐢ㄦ槸浠涔堬紵
榪欎釜綆鍗曠殑闂寰堝皯鏈変漢鑳藉洖絳斿畬鍏ㄣ傚湪C璇█涓紝鍏抽敭瀛梥tatic鏈変笁涓槑鏄劇殑浣滅敤錛?
1). 鍦ㄥ嚱鏁頒綋錛屼竴涓澹版槑涓洪潤鎬佺殑鍙橀噺鍦ㄨ繖涓鍑芥暟琚皟鐢ㄨ繃紼嬩腑緇存寔鍏跺間笉鍙樸?
2). 鍦ㄦā鍧楀唴錛堜絾鍦ㄥ嚱鏁頒綋澶栵級錛屼竴涓澹版槑涓洪潤鎬佺殑鍙橀噺鍙互琚ā鍧楀唴鎵鐢ㄥ嚱鏁拌闂紝浣嗕笉鑳借妯″潡澶栧叾瀹冨嚱鏁拌闂傚畠鏄竴涓湰鍦扮殑鍏ㄥ眬鍙橀噺銆?
3). 鍦ㄦā鍧楀唴錛屼竴涓澹版槑涓洪潤鎬佺殑鍑芥暟鍙彲琚繖涓妯″潡鍐呯殑鍏跺畠鍑芥暟璋冪敤銆傞偅灝辨槸錛岃繖涓嚱鏁拌闄愬埗鍦ㄥ0鏄庡畠鐨勬ā鍧楃殑鏈湴鑼冨洿鍐呬嬌鐢ㄣ?
澶у鏁板簲璇曡呰兘姝g‘鍥炵瓟絎竴閮ㄥ垎錛屼竴閮ㄥ垎鑳芥紜洖絳旂浜岄儴鍒嗭紝鍚屾槸寰堝皯鐨勪漢鑳芥噦寰楃涓夐儴鍒嗐傝繖鏄竴涓簲璇曡呯殑涓ラ噸鐨勭己鐐癸紝鍥犱負浠栨樉鐒朵笉鎳傚緱鏈湴鍖栨暟鎹拰浠g爜鑼冨洿鐨勫ソ澶勫拰閲嶈鎬с?BR>
Const
7錛庡叧閿瓧const鏄粈涔堝惈鎰忥紵
鎴戝彧瑕佷竴鍚埌琚潰璇曡呰錛氣渃onst鎰忓懗鐫甯告暟鈥濓紝鎴戝氨鐭ラ亾鎴戞鍦ㄥ拰涓涓笟浣欒呮墦浜ら亾銆傚幓騫碊an Saks宸茬粡鍦ㄤ粬鐨勬枃绔犻噷瀹屽叏姒傛嫭浜哻onst鐨勬墍鏈夌敤娉曪紝鍥犳ESP(璇戣咃細Embedded Systems Programming)鐨勬瘡涓浣嶈鑰呭簲璇ラ潪甯哥啛鎮塩onst鑳藉仛浠涔堝拰涓嶈兘鍋氫粈涔?濡傛灉浣犱粠娌℃湁璇誨埌閭g瘒鏂囩珷錛屽彧瑕佽兘璇村嚭const鎰忓懗鐫鈥滃彧璇燴濆氨鍙互浜嗐傚敖綆¤繖涓瓟妗堜笉鏄畬鍏ㄧ殑絳旀錛屼絾鎴戞帴鍙楀畠浣滀負涓涓紜殑絳旀銆傦紙濡傛灉浣犳兂鐭ラ亾鏇磋緇嗙殑絳旀錛屼粩緇嗚涓涓婼aks鐨勬枃绔犲惂銆傦級濡傛灉搴旇瘯鑰呰兘姝g‘鍥炵瓟榪欎釜闂錛屾垜灝嗛棶浠栦竴涓檮鍔犵殑闂錛氫笅闈㈢殑澹版槑閮芥槸浠涔堟剰鎬濓紵
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
鍓嶄袱涓殑浣滅敤鏄竴鏍鳳紝a鏄竴涓父鏁村瀷鏁般傜涓変釜鎰忓懗鐫a鏄竴涓寚鍚戝父鏁村瀷鏁扮殑鎸囬拡錛堜篃灝辨槸錛屾暣鍨嬫暟鏄笉鍙慨鏀圭殑錛屼絾鎸囬拡鍙互錛夈傜鍥涗釜鎰忔漚鏄竴涓寚鍚戞暣鍨嬫暟鐨勫父鎸囬拡錛堜篃灝辨槸璇達紝鎸囬拡鎸囧悜鐨勬暣鍨嬫暟鏄彲浠ヤ慨鏀圭殑錛屼絾鎸囬拡鏄笉鍙慨鏀圭殑錛夈傛渶鍚庝竴涓剰鍛崇潃a鏄竴涓寚鍚戝父鏁村瀷鏁扮殑甯告寚閽堬紙涔熷氨鏄錛屾寚閽堟寚鍚戠殑鏁村瀷鏁版槸涓嶅彲淇敼鐨勶紝鍚屾椂鎸囬拡涔熸槸涓嶅彲淇敼鐨勶級銆傚鏋滃簲璇曡呰兘姝g‘鍥炵瓟榪欎簺闂錛岄偅涔堜粬灝辯粰鎴戠暀涓嬩簡涓涓ソ鍗拌薄銆傞『甯︽彁涓鍙ワ紝涔熻浣犲彲鑳戒細闂紝鍗充嬌涓嶇敤鍏抽敭瀛梒onst錛屼篃榪樻槸鑳藉緢瀹規槗鍐欏嚭鍔熻兘姝g‘鐨勭▼搴忥紝閭d箞鎴戜負浠涔堣繕瑕佸姝ょ湅閲嶅叧閿瓧const鍛紵鎴戜篃濡備笅鐨勫嚑涓嬬悊鐢憋細
1). 鍏抽敭瀛梒onst鐨勪綔鐢ㄦ槸涓虹粰璇諱綘浠g爜鐨勪漢浼犺揪闈炲父鏈夌敤鐨勪俊鎭紝瀹為檯涓婏紝澹版槑涓涓弬鏁頒負甯擱噺鏄負浜嗗憡璇変簡鐢ㄦ埛榪欎釜鍙傛暟鐨勫簲鐢ㄧ洰鐨勩傚鏋滀綘鏇捐姳寰堝鏃墮棿娓呯悊鍏跺畠浜虹暀涓嬬殑鍨冨溇錛屼綘灝變細寰堝揩瀛︿細鎰熻阿榪欑偣澶氫綑鐨勪俊鎭傦紙褰撶劧錛屾噦寰楃敤const鐨勭▼搴忓憳寰堝皯浼氱暀涓嬬殑鍨冨溇璁╁埆浜烘潵娓呯悊鐨勩傦級
2). 閫氳繃緇欎紭鍖栧櫒涓浜涢檮鍔犵殑淇℃伅錛屼嬌鐢ㄥ叧閿瓧const涔熻鑳戒駭鐢熸洿绱у噾鐨勪唬鐮併?
3). 鍚堢悊鍦頒嬌鐢ㄥ叧閿瓧const鍙互浣跨紪璇戝櫒寰堣嚜鐒跺湴淇濇姢閭d簺涓嶅笇鏈涜鏀瑰彉鐨勫弬鏁幫紝闃叉鍏惰鏃犳剰鐨勪唬鐮佷慨鏀廣傜畝鑰岃█涔嬶紝榪欐牱鍙互鍑忓皯bug鐨勫嚭鐜般?BR>
Volatile
8. 鍏抽敭瀛梫olatile鏈変粈涔堝惈鎰?騫剁粰鍑轟笁涓笉鍚岀殑渚嬪瓙銆?BR>
涓涓畾涔変負volatile鐨勫彉閲忔槸璇磋繖鍙橀噺鍙兘浼氳鎰忔兂涓嶅埌鍦版敼鍙橈紝榪欐牱錛岀紪璇戝櫒灝變笉浼氬幓鍋囪榪欎釜鍙橀噺鐨勫間簡銆傜簿紜湴璇村氨鏄紝浼樺寲鍣ㄥ湪鐢ㄥ埌榪欎釜鍙橀噺鏃跺繀欏繪瘡嬈¢兘灝忓績鍦伴噸鏂拌鍙栬繖涓彉閲忕殑鍊鹼紝鑰屼笉鏄嬌鐢ㄤ繚瀛樺湪瀵勫瓨鍣ㄩ噷鐨勫浠姐備笅闈㈡槸volatile鍙橀噺鐨勫嚑涓緥瀛愶細
1). 騫惰璁懼鐨勭‖浠跺瘎瀛樺櫒錛堝錛氱姸鎬佸瘎瀛樺櫒錛?
2). 涓涓腑鏂湇鍔″瓙紼嬪簭涓細璁塊棶鍒扮殑闈炶嚜鍔ㄥ彉閲?Non-automatic variables)
3). 澶氱嚎紼嬪簲鐢ㄤ腑琚嚑涓換鍔″叡浜殑鍙橀噺
鍥炵瓟涓嶅嚭榪欎釜闂鐨勪漢鏄笉浼氳闆囦劍鐨勩傛垜璁や負榪欐槸鍖哄垎C紼嬪簭鍛樺拰宓屽叆寮忕郴緇熺▼搴忓憳鐨勬渶鍩烘湰鐨勯棶棰樸傚祵鍏ュ紡緋葷粺紼嬪簭鍛樼粡甯稿悓紜歡銆佷腑鏂丷TOS絳夌瓑鎵撲氦閬擄紝鎵鐢ㄨ繖浜涢兘瑕佹眰volatile鍙橀噺銆備笉鎳傚緱volatile鍐呭灝嗕細甯︽潵鐏鵑毦銆?
鍋囪琚潰璇曡呮紜湴鍥炵瓟浜嗚繖鏄棶棰橈紙鍡紝鎬鐤戣繖鍚︿細鏄繖鏍鳳級錛屾垜灝嗙◢寰繁絀朵竴涓嬶紝鐪嬩竴涓嬭繖瀹朵紮鏄笉鏄洿姝f噦寰梫olatile瀹屽叏鐨勯噸瑕佹с?
1). 涓涓弬鏁版棦鍙互鏄痗onst榪樺彲浠ユ槸volatile鍚楋紵瑙i噴涓轟粈涔堛?
2). 涓涓寚閽堝彲浠ユ槸volatile 鍚楋紵瑙i噴涓轟粈涔堛?
3). 涓嬮潰鐨勫嚱鏁版湁浠涔堥敊璇細
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
涓嬮潰鏄瓟妗堬細
1). 鏄殑銆備竴涓緥瀛愭槸鍙鐨勭姸鎬佸瘎瀛樺櫒銆傚畠鏄痸olatile鍥犱負瀹冨彲鑳借鎰忔兂涓嶅埌鍦版敼鍙樸傚畠鏄痗onst鍥犱負紼嬪簭涓嶅簲璇ヨ瘯鍥懼幓淇敼瀹冦?
2). 鏄殑銆傚敖綆¤繖騫朵笉寰堝父瑙併備竴涓緥瀛愭槸褰撲竴涓腑鏈嶅姟瀛愮▼搴忎慨璇ヤ竴涓寚鍚戜竴涓猙uffer鐨勬寚閽堟椂銆?
3). 榪欐浠g爜鐨勬湁涓伓浣滃墽銆傝繖孌典唬鐮佺殑鐩殑鏄敤鏉ヨ繑鎸囬拡*ptr鎸囧悜鍊肩殑騫蟲柟錛屼絾鏄紝鐢變簬*ptr鎸囧悜涓涓獀olatile鍨嬪弬鏁幫紝緙栬瘧鍣ㄥ皢浜х敓綾諱技涓嬮潰鐨勪唬鐮侊細
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
鐢變簬*ptr鐨勫煎彲鑳借鎰忔兂涓嶅埌鍦拌鍙橈紝鍥犳a鍜宐鍙兘鏄笉鍚岀殑銆傜粨鏋滐紝榪欐浠g爜鍙兘榪斾笉鏄綘鎵鏈熸湜鐨勫鉤鏂瑰鹼紒姝g‘鐨勪唬鐮佸涓嬶細
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
浣嶆搷浣滐紙Bit manipulation錛?BR>
9. 宓屽叆寮忕郴緇熸繪槸瑕佺敤鎴峰鍙橀噺鎴栧瘎瀛樺櫒榪涜浣嶆搷浣溿傜粰瀹氫竴涓暣鍨嬪彉閲廰錛屽啓涓ゆ浠g爜錛岀涓涓緗產鐨刡it 3錛岀浜屼釜娓呴櫎a 鐨刡it 3銆傚湪浠ヤ笂涓や釜鎿嶄綔涓紝瑕佷繚鎸佸叾瀹冧綅涓嶅彉銆?BR>
瀵硅繖涓棶棰樻湁涓夌鍩烘湰鐨勫弽搴?
1). 涓嶇煡閬撳浣曚笅鎵嬨傝琚潰鑰呬粠娌″仛榪囦換浣曞祵鍏ュ紡緋葷粺鐨勫伐浣溿?
2). 鐢╞it fields銆侭it fields鏄鎵斿埌C璇█姝昏鐨勪笢瑗匡紝瀹冧繚璇佷綘鐨勪唬鐮佸湪涓嶅悓緙栬瘧鍣ㄤ箣闂存槸涓嶅彲縐繪鐨勶紝鍚屾椂涔熶繚璇佷簡鐨勪綘鐨勪唬鐮佹槸涓嶅彲閲嶇敤鐨勩傛垜鏈榪戜笉騫哥湅鍒癐nfineon涓哄叾杈冨鏉傜殑閫氫俊鑺墖鍐欑殑椹卞姩紼嬪簭錛屽畠鐢ㄥ埌浜哹it fields鍥犳瀹屽叏瀵規垜鏃犵敤錛屽洜涓烘垜鐨勭紪璇戝櫒鐢ㄥ叾瀹冪殑鏂瑰紡鏉ュ疄鐜癰it fields鐨勩備粠閬撳痙璁詫細姘歌繙涓嶈璁╀竴涓潪宓屽叆寮忕殑瀹朵紮綺樺疄闄呯‖浠剁殑杈廣?
3). 鐢?#defines 鍜?bit masks 鎿嶄綔銆傝繖鏄竴涓湁鏋侀珮鍙Щ妞嶆х殑鏂規硶錛屾槸搴旇琚敤鍒扮殑鏂規硶銆傛渶浣崇殑瑙e喅鏂規濡備笅錛?
#define BIT3 (0x1<<3)
static int a;
void set_bit3(void)
{
a |= BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}
涓浜涗漢鍠滄涓鴻緗拰娓呴櫎鍊艱屽畾涔変竴涓帺鐮佸悓鏃跺畾涔変竴浜涜鏄庡父鏁幫紝榪欎篃鏄彲浠ユ帴鍙楃殑銆傛垜甯屾湜鐪嬪埌鍑犱釜瑕佺偣錛氳鏄庡父鏁般亅=鍜?amp;=~鎿嶄綔銆?BR>
璁塊棶鍥哄畾鐨勫唴瀛樹綅緗紙Accessing fixed memory locations錛?
10. 宓屽叆寮忕郴緇熺粡甯稿叿鏈夎姹傜▼搴忓憳鍘昏闂煇鐗瑰畾鐨勫唴瀛樹綅緗殑鐗圭偣銆傚湪鏌愬伐紼嬩腑錛岃姹傝緗竴緇濆鍦板潃涓?x67a9鐨勬暣鍨嬪彉閲忕殑鍊間負0xaa66銆傜紪璇戝櫒鏄竴涓函綺圭殑ANSI緙栬瘧鍣ㄣ傚啓浠g爜鍘誨畬鎴愯繖涓浠誨姟銆?BR>
榪欎竴闂嫻嬭瘯浣犳槸鍚︾煡閬撲負浜嗚闂竴緇濆鍦板潃鎶婁竴涓暣鍨嬫暟寮哄埗杞崲錛坱ypecast錛変負涓鎸囬拡鏄悎娉曠殑銆傝繖涓闂鐨勫疄鐜版柟寮忛殢鐫涓漢椋庢牸涓嶅悓鑰屼笉鍚屻傚吀鍨嬬殑綾諱技浠g爜濡備笅錛?
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55;
涓涓緝鏅︽訂鐨勬柟娉曟槸錛?
*(int * const)(0x67a9) = 0xaa55;
鍗充嬌浣犵殑鍝佸懗鏇存帴榪戠浜岀鏂規錛屼絾鎴戝緩璁綘鍦ㄩ潰璇曟椂浣跨敤絎竴縐嶆柟妗堛?BR>
涓柇錛圛nterrupts錛?
11. 涓柇鏄祵鍏ュ紡緋葷粺涓噸瑕佺殑緇勬垚閮ㄥ垎錛岃繖瀵艱嚧浜嗗緢澶氱紪璇戝紑鍙戝晢鎻愪緵涓縐嶆墿灞曗旇鏍囧噯C鏀寔涓柇銆傚叿浠h〃浜嬪疄鏄紝浜х敓浜嗕竴涓柊鐨勫叧閿瓧__interrupt銆備笅闈㈢殑浠g爜灝變嬌鐢ㄤ簡__interrupt鍏抽敭瀛楀幓瀹氫箟浜嗕竴涓腑鏂湇鍔″瓙紼嬪簭(ISR)錛岃璇勮涓涓嬭繖孌典唬鐮佺殑銆?BR>
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf(" Area = %f", area);
return area;
}
榪欎釜鍑芥暟鏈夊お澶氱殑閿欒浜嗭紝浠ヨ嚦璁╀漢涓嶇煡浠庝綍璇磋搗浜嗭細
1). ISR 涓嶈兘榪斿洖涓涓箋傚鏋滀綘涓嶆噦榪欎釜錛岄偅涔堜綘涓嶄細琚泧鐢ㄧ殑銆?
2). ISR 涓嶈兘浼犻掑弬鏁般傚鏋滀綘娌℃湁鐪嬪埌榪欎竴鐐癸紝浣犺闆囩敤鐨勬満浼氱瓑鍚岀涓欏廣?
3). 鍦ㄨ澶氱殑澶勭悊鍣?緙栬瘧鍣ㄤ腑錛屾誕鐐逛竴鑸兘鏄笉鍙噸鍏ョ殑銆傛湁浜涘鐞嗗櫒/緙栬瘧鍣ㄩ渶瑕佽棰濆鐨勫瘎瀛樺櫒鍏ユ爤錛屾湁浜涘鐞嗗櫒/緙栬瘧鍣ㄥ氨鏄笉鍏佽鍦↖SR涓仛嫻偣榪愮畻銆傛澶栵紝ISR搴旇鏄煭鑰屾湁鏁堢巼鐨勶紝鍦↖SR涓仛嫻偣榪愮畻鏄笉鏄庢櫤鐨勩?
4). 涓庣涓夌偣涓鑴夌浉鎵匡紝printf()緇忓父鏈夐噸鍏ュ拰鎬ц兘涓婄殑闂銆傚鏋滀綘涓㈡帀浜嗙涓夊拰絎洓鐐癸紝鎴戜笉浼氬お涓洪毦浣犵殑銆備笉鐢ㄨ錛屽鏋滀綘鑳藉緱鍒板悗涓ょ偣錛岄偅涔堜綘鐨勮闆囩敤鍓嶆櫙瓚婃潵瓚婂厜鏄庝簡銆?BR>
浠g爜渚嬪瓙錛圕ode examples錛?BR>12 . 涓嬮潰鐨勪唬鐮佽緭鍑烘槸浠涔堬紝涓轟粈涔堬紵
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) puts("> 6") : puts("<= 6");
}
榪欎釜闂嫻嬭瘯浣犳槸鍚︽噦寰桟璇█涓殑鏁存暟鑷姩杞崲鍘熷垯錛屾垜鍙戠幇鏈変簺寮鍙戣呮噦寰楁瀬灝戣繖浜涗笢瑗褲備笉綆″浣曪紝榪欐棤絎﹀彿鏁村瀷闂鐨勭瓟妗堟槸杈撳嚭鏄?gt;6鈥濄傚師鍥犳槸褰撹〃杈懼紡涓瓨鍦ㄦ湁絎﹀彿綾誨瀷鍜屾棤絎﹀彿綾誨瀷鏃舵墍鏈夌殑鎿嶄綔鏁伴兘鑷姩杞崲涓烘棤絎﹀彿綾誨瀷銆?鍥犳-20鍙樻垚浜嗕竴涓潪甯稿ぇ鐨勬鏁存暟錛屾墍浠ヨ琛ㄨ揪寮忚綆楀嚭鐨勭粨鏋滃ぇ浜?銆傝繖涓鐐瑰浜庡簲褰撻綣佺敤鍒版棤絎﹀彿鏁版嵁綾誨瀷鐨勫祵鍏ュ紡緋葷粺鏉ヨ鏄赴甯擱噸瑕佺殑銆傚鏋滀綘絳旈敊浜嗚繖涓棶棰橈紝浣犱篃灝卞埌浜嗗緱涓嶅埌榪欎喚宸ヤ綔鐨勮竟緙樸?BR>
13. 璇勪環涓嬮潰鐨勪唬鐮佺墖鏂細
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
/*1's complement of zero */
瀵逛簬涓涓猧nt鍨嬩笉鏄?6浣嶇殑澶勭悊鍣ㄤ負璇達紝涓婇潰鐨勪唬鐮佹槸涓嶆紜殑銆傚簲緙栧啓濡備笅錛?BR>
unsigned int compzero = ~0;
榪欎竴闂鐪熸鑳芥彮闇插嚭搴旇瘯鑰呮槸鍚︽噦寰楀鐞嗗櫒瀛楅暱鐨勯噸瑕佹с傚湪鎴戠殑緇忛獙閲岋紝濂界殑宓屽叆寮忕▼搴忓憳闈炲父鍑嗙‘鍦版槑鐧界‖浠剁殑緇嗚妭鍜屽畠鐨勫眬闄愶紝鐒惰孭C鏈虹▼搴忓線寰鎶婄‖浠朵綔涓轟竴涓棤娉曢伩鍏嶇殑鐑︽伡銆?
鍒頒簡榪欎釜闃舵錛屽簲璇曡呮垨鑰呭畬鍏ㄥ瀭澶翠撫姘斾簡鎴栬呬俊蹇冩弧婊″織鍦ㄥ繀寰椼傚鏋滄樉鐒跺簲璇曡呬笉鏄緢濂斤紝閭d箞榪欎釜嫻嬭瘯灝卞湪榪欓噷緇撴潫浜嗐備絾濡傛灉鏄劇劧搴旇瘯鑰呭仛寰椾笉閿欙紝閭d箞鎴戝氨鎵斿嚭涓嬮潰鐨勮拷鍔犻棶棰橈紝榪欎簺闂鏄瘮杈冮毦鐨勶紝鎴戞兂浠呬粎闈炲父浼樼鐨勫簲璇曡呰兘鍋氬緱涓嶉敊銆傛彁鍑鴻繖浜涢棶棰橈紝鎴戝笇鏈涙洿澶氱湅鍒板簲璇曡呭簲浠橀棶棰樼殑鏂規硶錛岃屼笉鏄瓟妗堛備笉綆″浣曪紝浣犲氨褰撴槸榪欎釜濞變箰鍚р?BR>
鍔ㄦ佸唴瀛樺垎閰嶏紙Dynamic memory allocation錛?BR>
14. 灝界涓嶅儚闈炲祵鍏ュ紡璁$畻鏈洪偅涔堝父瑙侊紝宓屽叆寮忕郴緇熻繕鏄湁浠庡爢錛坔eap錛変腑鍔ㄦ佸垎閰嶅唴瀛樼殑榪囩▼鐨勩傞偅涔堝祵鍏ュ紡緋葷粺涓紝鍔ㄦ佸垎閰嶅唴瀛樺彲鑳藉彂鐢熺殑闂鏄粈涔堬紵
榪欓噷錛屾垜鏈熸湜搴旇瘯鑰呰兘鎻愬埌鍐呭瓨紕庣墖錛岀鐗囨敹闆嗙殑闂錛屽彉閲忕殑鎸佽鏃墮棿絳夌瓑銆傝繖涓富棰樺凡緇忓湪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錛屽緱鍒頒簡涓涓悎娉曠殑鎸囬拡涔嬪悗錛屾垜鎵嶆兂鍒拌繖涓棶棰樸傝繖灝辨槸涓婇潰鐨勪唬鐮侊紝璇ヤ唬鐮佺殑杈撳嚭鏄淕ot a valid pointer鈥濄傛垜鐢ㄨ繖涓潵寮濮嬭璁鴻繖鏍風殑涓闂錛岀湅鐪嬭闈㈣瘯鑰呮槸鍚︽兂鍒板簱渚嬬▼榪欐牱鍋氭槸姝g‘銆傚緱鍒版紜殑絳旀鍥虹劧閲嶈錛屼絾瑙e喅闂鐨勬柟娉曞拰浣犲仛鍐沖畾鐨勫熀鏈師鐞嗘洿閲嶈浜涖?BR>
Typedef
15. Typedef 鍦–璇█涓綣佺敤浠ュ0鏄庝竴涓凡緇忓瓨鍦ㄧ殑鏁版嵁綾誨瀷鐨勫悓涔夊瓧銆備篃鍙互鐢ㄩ澶勭悊鍣ㄥ仛綾諱技鐨勪簨銆備緥濡傦紝鎬濊冧竴涓嬩笅闈㈢殑渚嬪瓙錛?
#define dPS struct s *
typedef struct s * tPS;
浠ヤ笂涓ょ鎯呭喌鐨勬剰鍥鵑兘鏄瀹氫箟dPS 鍜?tPS 浣滀負涓涓寚鍚戠粨鏋剆鎸囬拡銆傚摢縐嶆柟娉曟洿濂藉憿錛燂紙濡傛灉鏈夌殑璇濓級涓轟粈涔堬紵
榪欐槸涓涓潪甯稿井濡欑殑闂錛屼換浣曚漢絳斿榪欎釜闂錛堟褰撶殑鍘熷洜錛夋槸搴斿綋琚伃鍠滅殑銆傜瓟妗堟槸錛歵ypedef鏇村ソ銆傛濊冧笅闈㈢殑渚嬪瓙錛?
dPS p1,p2;
tPS p3,p4;
絎竴涓墿灞曚負
struct s * p1, p2;
涓婇潰鐨勪唬鐮佸畾涔塸1涓轟竴涓寚鍚戠粨鏋勭殑鎸囷紝p2涓轟竴涓疄闄呯殑緇撴瀯錛岃繖涔熻涓嶆槸浣犳兂瑕佺殑銆傜浜屼釜渚嬪瓙姝g‘鍦板畾涔変簡p3 鍜宲4 涓や釜鎸囬拡銆?BR>
鏅︽訂鐨勮娉?BR>
16. C璇█鍚屾剰涓浜涗護浜洪渿鎯婄殑緇撴瀯,涓嬮潰鐨勭粨鏋勬槸鍚堟硶鐨勫悧錛屽鏋滄槸瀹冨仛浜涗粈涔堬紵
int a = 5, b = 7, c;
c = a+++b;
榪欎釜闂灝嗗仛涓鴻繖涓祴楠岀殑涓涓剦蹇殑緇撳熬銆備笉綆′綘鐩鎬笉鐩鎬俊錛屼笂闈㈢殑渚嬪瓙鏄畬鍏ㄥ悎涔庤娉曠殑銆傞棶棰樻槸緙栬瘧鍣ㄥ浣曞鐞嗗畠錛熸按騫充笉楂樼殑緙栬瘧浣滆呭疄闄呬笂浼氫簤璁鴻繖涓棶棰橈紝鏍規嵁鏈澶勭悊鍘熷垯錛岀紪璇戝櫒搴斿綋鑳藉鐞嗗敖鍙兘鎵鏈夊悎娉曠殑鐢ㄦ硶銆傚洜姝わ紝涓婇潰鐨勪唬鐮佽澶勭悊鎴愶細
c = a++ + b;
鍥犳, 榪欐浠g爜鎸佽鍚巃 = 6, b = 7, c = 12銆?
濡傛灉浣犵煡閬撶瓟妗堬紝鎴栫寽鍑烘紜瓟妗堬紝鍋氬緱濂姐傚鏋滀綘涓嶇煡閬撶瓟妗堬紝鎴戜篃涓嶆妸榪欎釜褰撲綔闂銆傛垜鍙戠幇榪欎釜闂鐨勬渶澶уソ澶勬槸:榪欐槸涓涓叧浜庝唬鐮佺紪鍐欓鏍鹼紝浠g爜鐨勫彲璇繪э紝浠g爜鐨勫彲淇敼鎬х殑濂界殑璇濋
| English Version |
|
| 閲嶈鏃ユ湡 鎶ュ悕寮濮?/B> 11鏈?1鏃ユ槦鏈熶竴 鍏ュ洿璧?/B> 12鏈?2鏃ユ槦鏈熶竴 鎬誨喅璧?/B> 1鏈?0鏃ユ槦鏈熶簲 |
| 浠峰?5涓囧厓鐨?BR>楂樼鎶濂栧搧 |
| 鏃ユ湡 | 鏃墮棿 * | 鐘舵?/FONT> |
| 11鏈?1鏃ユ槦鏈熶竴 | 9:00 | 娉ㄥ唽寮濮?/FONT> |
| 12鏈?2鏃ユ槦鏈熶竴 | 9:00 | 娉ㄥ唽緇撴潫 |
| 12鏈?2鏃ユ槦鏈熶竴 | 12:00 | 璧勬牸璧涘紑濮?/FONT> |
| 12鏈?3鏃ユ槦鏈熶簩 | 12:00 | 璧勬牸璧涚粨鏉?/FONT> |
| 12鏈?9鏃ユ槦鏈熶竴 | 21:00 | 絎竴杞?500鍚嶅弬璧涜?/FONT> |
| 12鏈?2鏃ユ槦鏈熷洓 | 21:00 | 絎簩杞?250鍚嶅弬璧涜?/FONT> |
| 1鏈?0鏃ユ槦鏈熶簲 | 寰呭畾 | 鍐犲啗璧?50鍚嶅弬璧涜?/FONT> |
| * 涓婅堪鏃墮棿鐨嗕負鍖椾含鏃墮棿銆傚啝鍐涜禌鏃ユ湡鏈夊彲鑳藉彂鐢熷彉鍖栵紝璇鋒敞鎰忓眾鏃墮氱煡銆?/FONT> | ||
| 鍙傝禌鑰?/FONT> | 濂栧搧 |
| 絎?鍚?(鍏變環鍊?0,000浜烘皯甯? | 涓緇勯珮绔釜浜虹紪紼嬪伐浣滅珯 |
| 絎?鑷崇4鍚?(姣忎綅濂栧搧浠峰?0,000浜烘皯甯? | 涓鍙扮瑪璁版湰鐢佃剳錛?PDA鎵嬫満錛?浠ュ強涓嬈懼叏鏂頒釜浜洪殢韜惉 |
| 絎?鑷?0鍚?姣忎綅濂栧搧浠峰?,000浜烘皯甯? | 涓鍙版暟瀛楃浉鏈猴紝PDA鎵嬫満錛?浠ュ強涓嬈懼叏鏂頒釜浜洪殢韜惉 |
| 絎?1鑷?0鍚?姣忎綅濂栧搧浠峰?,000浜烘皯甯? | PDA鎵嬫満錛?浠ュ強涓嬈懼叏鏂頒釜浜洪殢韜惉 |
| 絎?1鑷?0鍚?(姣忎綅濂栧搧浠峰?,000浜烘皯甯? | 涓嬈懼叏鏂頒釜浜洪殢韜惉 |
I have noticed that some people seem to have problems with bitwise operators, so I decided to write this brief tutorial on how to use them.
Bits, what are they you may ask?
Well, simply put, bits are the individual ones and zeros that make up every thing we do with computers. All the data you use is stored in your computer using bits. A BYTE is made up of eight bits, a WORD is two BYTEs, or sixteen bits. And a DWORD is two WORDS, or thirty two bits.
0 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 || | | | || |+- bit 31 | | | bit 0 -+| | | | | | +-- BYTE 3 ---+--- BYTE 2 ---+--- BYTE 1 ---+-- BYTE 0 ---+ | | | +----------- WORD 1 --------+----------- WORD 0 ---------+ | | +--------------------------- DWORD -----------------------+
The beauty of having bitwise operators is that you can use a BYTE, WORD or DWORD as a small array or structure. Using bitwise operators you can check or set the values of individual bits or even a group of bits.
When working with bits, it is kind of hard to express every number using just ones and zeros, which is known as binary notation. To get around this we use hexadecimal (base 16) numbers.
As you may or may not know, it takes four bits to cover all the numbers from zero to fifteen, which also happens to be the range of a single digit hexadecimal number. This group of four bits, or half a BYTE, is called a nibble. As there are two nibbles in a BYTE, we can use two hexadecimal digits to show the value of one BYTE.
NIBBLE HEX VALUE ====== ========= 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 A 1011 B 1100 C 1101 D 1110 E 1111 F
So if we had one BYTE containing the letter 'r' (ASCII code 114) it would look like this:
0111 0010 binary 7 2 hexadecimal
We could write it as '0x72'
There are six bitwise operators. They are:
& The AND operator
| The OR operator
^ The XOR operator
~ The Ones Complement or Inversion operator
>> The Right Shift operator
<< The Left Shift operator.
The & (AND) operator compares two values, and returns a value that has its bits set if, and only if, the two values being compared both have their corresponding bits set. The bits are compared using the following table
1 & 1 == 1 1 & 0 == 0 0 & 1 == 0 0 & 0 == 0
An ideal use for this is to set up a mask to check the values of certain bits. Say we have a BYTE that contains some bit flags, and we want to check if bit four bit is set.
BYTE b = 50; if ( b & 0x10 ) cout << "Bit four is set" << endl; else cout << "Bit four is clear" << endl;
This would result in the following calculation
00110010 - b & 00010000 - & 0x10 ---------- 00010000 - result
So we see that bit four is set.
The | (OR) operator compares two values, and returns a value that has its bits set if one or the other values, or both, have their corresponding bits set. The bits are compared using the following table
1 | 1 == 1 1 | 0 == 1 0 | 1 == 1 0 | 0 == 0
An ideal use for this is to ensure that certain bits are set. Say we want to ensure that bit three of some value is set
BYTE b = 50; BYTE c = b | 0x04; cout << "c = " << c << endl;
This would result in the following calculation
00110010 - b | 00000100 - | 0x04 ---------- 00110110 - result
The ^ (XOR) operator compares two values, and returns a value that has its bits set if one or the other value has its corresponding bits set, but not both. The bits are compared using the following table
1 ^ 1 == 0 1 ^ 0 == 1 0 ^ 1 == 1 0 ^ 0 == 0
An ideal use for this is to toggle certain bits. Say we want toggle the bits three and four
BYTE b = 50; cout << "b = " << b << endl; b = b ^ 0x18; cout << "b = " << b << endl; b = b ^ 0x18; cout << "b = " << b << endl;
This would result in the following calculations
00110010 - b ^ 00011000 - ^ 0x18 ---------- 00101010 - result 00101010 - b
^ 00011000 - ^ 0x18 ---------- 00110010 - result
The ~ (Ones Complement or inversion) operator acts only on one value and it inverts it, turning all the ones int zeros, and all the zeros into ones. An ideal use of this would be to set certain bytes to zero, and ensuring all other bytes are set to one, regardless of the size of the data. Say we want to set all the bits to one except bits zero and one
BYTE b = ~0x03; cout << "b = " << b << endl; WORD w = ~0x03; cout << "w = " << w << endl;
This would result in the following calculations
00000011 - 0x03 11111100 - ~0x03 b 0000000000000011 - 0x03 1111111111111100 - ~0x03 w
Another ideal use, is to combine it with the & operator to ensure that certain bits are set to zero. Say we want to clear bit four
BYTE b = 50; cout << "b = " << b << endl; BYTE c = b & ~0x10; cout << "c = " << c << endl;
This would result in the following calculations
00110010 - b & 11101111 - ~0x10 ---------- 00100010 - result
The >> (Right shift) and << (left shift) operators move the bits the number of bit positions specified. The >> operator shifts the bits from the high bit to the low bit. The << operator shifts the bits from the low bit to the high bit. One use for these operators is to align the bits for whatever reason (check out the MAKEWPARAM, HIWORD, and LOWORD macros)
BYTE b = 12; cout << "b = " << b << endl; BYTE c = b << 2; cout << "c = " << c << endl; c = b >> 2; cout << "c = " << c << endl;
This would result in the following calculations
00001100 - b 00110000 - b << 2 00000011 - b >> 2
Another interesting thing that can be done using bits is to have bit fields. With bit fields you can set up minature structures within a BYTE, WORD or DWORD. Say, for example, we want to keep track of dates, but we want to use the least amount of memory as possible. We could declare our structure this way
struct date_struct { BYTE day : 5, // 1 to 31 month : 4, // 1 to 12 year : 14; // 0 to 9999 } date;
In this example, the day field takes up the lowest 5 bits, month the next four, and year the next 14 bits. So we can store the date structure in twenty three bits, which is contained in three BYTEs. The twenty fourth bit is ignored. If I had declared it using an integer for each field, the structure would have taken up 12 BYTEs.
|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0| | | | | +------ year -------------+ month + day --+
Now lets pick this declaration apart to see what we are doing.
First we will look at the data type we are using for the bit field structure. In this case we used a BYTE. A BYTE is 8 bits, and by using it, the compiler will allocate one BYTE for storage. If however, we use more than 8 bits in our structure, the compiler will allocate another BYTE, as many BYTEs as it takes to hold our structure. If we had used a WORD or DWORD, the compiler would have allocated a total of 32 bits to hold our structure.
Now lets look at how the various fields are declared. First we have the variable (day, month, and year), followed by a colon that separates the variable from the number of bits that it contains. Each bit field is separated by a comma, and the list is ended with a semicolon.
Now we get to the struct declaration. We put the bit fields into a struct like this so that we can use convention structure accessing notation to get at the structure members. Also, since we can not get the addresses of bit fields, we can now use the address of the structure.
date.day = 12; dateptr = &date; dateptr->year = 1852;
FindLowestAncestor(Struct TreeNode *pRoot, Struct TreeNode *pNode1, Struct TreeNode *pNode2)
{
if (pRoot==NULL)
return NULL;
if (pRoot==pNode1 && pRoot==pNode2)
return pRoot;
Struct TreeNode *pTemp;
if (pTemp = FindLowestAncestor(pRoot->pLeft,pNode1,pNode2))
return pTemp;
if (pTemp = FindLowestAncestor(pRoot->pRight,pNode1,pNode2))
return pTemp;
if (FindLowestAncestor(pRoot,pNode1,pNode1) && FindLowestAncestor(pRoot,pNo
de2,pNode2)) return pRoot;
return NULL;
}
娉細p1鏄寚鍚慶har綾誨瀷鐨勬寚閽堢殑鎸囬拡錛?BR> p2鏄寚鍚慶onst char綾誨瀷鐨勬寚閽堢殑鎸囬拡錛?BR> p3鏄寚鍚慶har綾誨瀷鐨刢onst鎸囬拡錛?BR> p4鏄寚鍚慶onst char綾誨瀷鐨刢onst鎸囬拡錛?BR> p5鏄寚鍚慶har綾誨瀷鐨勬寚閽堢殑const鎸囬拡錛?BR> p6鏄寚鍚慶onst char綾誨瀷鐨勬寚閽堢殑const鎸囬拡錛?BR> p7鏄寚鍚慶har綾誨瀷const鎸囬拡鐨刢onst鎸囬拡錛?BR> p8鏄寚鍚慶onst char綾誨瀷鐨刢onst鎸囬拡鐨刢onst鎸囬拡銆?BR>
鍘熸枃鍦板潃錛?A >http://www.codeproject.com/cpp/complex_declarations.asp
Yin Feilong
Address: Room 110 Building
Phone: (86-25) 8359-4465 +86135-8519-7909
E-mail: yinfeil@gmail.com Homepage: http://www.seman.cn
Objective:
C++ Software Design Engineer
Education:
B.E Department of Information Management,
GPA: Overall: 3.2/4.0
Academic Main Courses:
Development Tools of Management Information System
Management Information Systems and software Engineering
Information Analysis and Policy Making, Information Retrieval and Storage
Programming Languages (C), Data Structures, Database Systems
Computer Network, System Science and Techniques, Information Organization
Computer Abilities:
Certification:
National Computer Rank Examination Grade Three(NCRE-3)
Qualification of Computer and Software Technology Proficiency: Software Designer
Skills:
Expert: C/C++, Visual Foxpro, HTML, Asp, CSS
Intermediate: Rational Rose, SQL Server, XML, Java, Project 2003
Beginner: C#, Asp.net, Visual C++, Oracle
English Skills:
Have a good command of both spoken and written English. Past CET-4
Experiences:
Developer. Lily-Studio of
Designed and implemented the Community of Lily Alumni
Editor in chief of the magazine Network Guide
Lab Manager. Information Technology Lab. June 2004 鈥?Present
Supervisor of Network Application, Designed and implemented FTP銆?/SPAN>SMTP-based mail Server銆?/SPAN>VPN 銆?/SPAN>Web Server
Designed and implemented 2 websites of Department of Information Management and
Designed and implemented the platform of Tech-Learn Information
Translate some parts of Web-based Analysis for competitive.
Honors:
Football銆?/SPAN>Ping pong