锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
1 銆?/span> linux 瀹夎濂藉悗宸茬粡瑁呭ソ浜?/span> cvs 錛屽彲鐢?/span> rpm -qa|grep cvs 鏌ョ湅銆?/span>
濡傛灉娌℃湁瀹夎浣犲彲浠ュ湪 Redhat 絎?/span> 2 寮犲厜鐩樹笂鎵懼埌錛屽彟澶栦綘涔熷彲浠ュ湪緗戜笂涓嬭澆鍒版渶鏂扮殑 rpm 鍖呫傚緢瀹規(guī)槗鎵撅紝鍏跺疄涓嶅瓨鍦ㄤ粈涔?/span> linux 鐗堟湰銆?/span>
2 銆佸垱寤?/span> cvs 浣跨敤鐨勭洰褰曪細(xì) mkdir /home/mycvstest
3 銆佸垱寤?/span> cvs 浣跨敤鐨勭敤鎴峰拰緇?/span>
groupadd cvs
useradd -g cvs -G cvs 鈥揹 /home/mycvstest cvs
passwd cvs
4 銆佷慨鏀?/span> mycvstest 鐨勭敤鎴鳳細(xì) chown -R cvs:cvs /home/mycvstest
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 chmod 755 /home/mycvstest
5 銆佸垏鎹㈢敤鎴鳳細(xì) su cvs
6 銆佸垱寤烘簮鐮佷粨搴擄細(xì) mkdir /home/mycvstest/drcls drclgw
7 銆佸垵濮嬪寲婧愮爜浠撳簱錛?/span> cvs -d /home/mycvstest/drcls init
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 cvs -d /home/mycvstest/drclgw init
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 聽聽聽chmod 755 /home/mycvstest/drcls drclgw
鍒濆鍖栧悗鍙互鍦ㄧ洰褰曚笅瑙佸埌鏂板鍔犵殑
CVSROOT
鐩綍錛?/span>
cvs
鎵鏈夌殑鎺у埗淇℃伅閮藉湪榪欎釜鐩綍閲屻?/span>
8 銆侀鍥炲埌 root 鐢ㄦ埛錛屽緩绔?/span> CVS 鏈嶅姟鍚姩鏂囦歡錛?/span> CVS 浣跨敤 xinetd 鏂瑰紡鍚姩銆?/span> 聽
vi /etc/xinetd.d/cvspserver
service cvspserver
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server= /usr/bin/cvs
server_args= -f --allow-root=/home/mycvstest/drcls
--allow-root=/home/mycvstest/drclgw pserver
log_on_failure += USERID
}
娉細(xì)綰㈣壊鐨勫弬鏁板緢閲嶈錛岀敱浜?/span> xinetd 鐨?/span> server_args 闀垮害闄愬埗 , 褰撲綘鎯寵繍琛屽緢澶氱殑鍗曚釜浠撳簱鐨勬椂鍊?/span> ( 灝辨槸鏈夊緢澶氫釜妯″潡鏃訛紝姣斿 drcrgw), 浣嗗湪 server_args 涓棤娉曡緭鍏ヨ繖涔堝鍗曚釜鐨勪粨搴擄紝 鍙互閲囧彇浠ヤ笅鏂瑰紡瑙e喅錛堢幇鍦ㄥ疄楠屽 90 涓婂氨鐢ㄧ殑榪欑鏂瑰紡錛夛細(xì)
#> vi cvspserver
service cvspserver
{
聽聽聽聽聽聽聽 disable = no
聽聽聽聽聽聽聽 socket_type = stream
聽聽聽聽聽聽聽 wait = no
聽聽聽聽聽聽聽 user = root
聽聽聽聽聽聽聽 server = /usr/bin/cvs.run
聽聽聽聽聽聽聽 server_args =""
}
緙栧啓 cvs.run 鑴氭湰
vi /cvsroot/cvs.run
#!/bin/bash
/usr/bin/cvs -f
--allow-root=/home/mycvstest/drcls
--allow-root= /home/mycvstest/drclgw
pserver
chmod a+x cvs.run
9 銆佸姞鍏?/span> cvs 鏈嶅姟錛?/span>
#>vi /etc/services
cvspserver 2401/tcp #pserver cvs service
cvspserver 2401/udp #pserver cvs service
10 銆佸惎鍔?/span> cvs 鏈嶅姟錛?/span>
#> service xinetd restart
11 銆佹鏌?/span> cvspserver 鏈嶅姟鏄惁宸茬粡鍚姩錛?/span>
#> netstat -l |grep cvspserver
搴旇鏈夊涓嬬粨鏋滐細(xì)
tcp 0 0 *:cvspserver *:* LISTEN
聽
浜屻佷嬌鐢ㄥ拰綆$悊
1 銆佸垱寤?/span> cvs 鐢ㄦ埛錛?/span>
cd /home/mycvstest/drcls/CVSROOT
htpasswd 鈥揷 passwd zhangcan (htpasswd
鍛戒護瑕佸畨瑁?/span>
apache
鍚庢墠鏈夛紝姝ゅ懡浠ゅ垱寤轟竴涓?/span>
passwd
鏂囦歡錛岄噷闈㈠唴瀹逛負(fù)鏂板緩
cvs
鐢ㄦ埛鐨勭敤鎴峰悕鍜屽瘑鐮?/span>
)
vi passwd ( 鍦ㄦ柊寤虹殑鐢ㄦ埛鍚庢墜宸ュ姞鍏ョ敤鎴峰睘浜庣殑緇?/span> cvs)
渚嬪錛?/span>
zhangcan:dgeagasdgasdr:cvs聽
钃濊壊瀛楃涓茶〃紺哄姞瀵嗗悗鐨勫瘑鐮併?/span>
2
銆佽祴浜堢敤鎴瘋鍐欐潈闄?/span>
鎵嬪伐鍦?/span> CVSROOT 鐩綍涓緩绔?/span> readers 鍜?/span> writers 鏂囦歡銆?/span> Readers 鏂囦歡涓殑鐢ㄦ埛鍙湁璇繪潈闄愶紝 writers 涓殑鐢ㄦ埛鍏鋒湁璇誨啓鏉冮檺錛屼竴琛屽彧鍐欎竴涓敤鎴峰悕銆?/span>
3 銆佺櫥褰?/span> cvs
鍦ㄥ鎴鋒満 Linux 涓嬮潰鐢ㄥ懡浠わ細(xì)
export CVSROOT=:pserver:zhangcan@192.168.100.197:/home/mycvstest/drcls
cvs login
4 銆佸悜婧愮爜浠撳簱涓鍏ユ簮鐮?/span>
棣栧厛榪涘叆浣犳湰鏈轟笂瀹夎婧愮爜鐨勭洰褰曪紝鐒跺悗浣跨敤浠ヤ笅鍛戒護錛?/span>
cvs import 鈥搈 鈥渢his is my soure code鈥?drcls NISEC test start
-m 琛ㄧず鍦?/span> cvs 鍘嗗彶鏂囦歡鏄劇ず鐨勬秷鎭紝 drclst 涓轟綘鎸囧畾鐨勬簮鐮佺洰褰曞悕錛?/span> NISEC 涓轟緵搴斿晢鏍囩錛?/span> test 涓哄彂琛屾爣絳撅紙榪欎袱欏瑰彲浠ヤ笉瑕侊級錛?/span> start 蹇呴』瑕併?/span>
5 銆?/span> checkout 鍑洪渶瑕佷慨鏀圭殑婧愪唬鐮?/span>
cvs co drcls聽 鍦ㄤ綘鐨勫綋鍓嶇洰褰曚笅浼?xì)鍙戠幇澶氫簡涓涓?/span> drcls 鐩綍錛岃淇敼鐨勬簮鐮侀兘鍦ㄩ噷闈?/span>
co
涓?/span>
checkout
鐨勭畝鍐?/span>
6 銆佹彁浜や慨鏀?/span>
鍋囪鍒氭墠瀵?/span> readme 鏂囦歡榪涜浜嗕慨鏀癸紝鐜板湪鎻愪氦
cvs commit 鈥搈 鈥渕odify a few of wrong words鈥?span style="mso-spacerun: yes">聽 readme
鍛戒護鎵ц鍚庝細(xì)鎻愮ず鐗堟湰宸茬粡鏀逛負(fù) 1.2 銆?/span>
7 銆?/span> checkout 鍑轟互鍓嶇殑鐗堟湰
濡傛灉鎯蟲鍑轟互鍓嶇殑鐗堟湰鍙互鐢ㄤ互涓嬪懡浠わ細(xì)
cvs co 鈥搑 1.1 drcls/readme 鎴栬?/span> cvs 鈥揇 yesterday drcls/readme
8 銆佸垹闄ゆ枃浠?/span>
鑻ユ兂浠庢簮鐮佷粨搴撲腑鍒犻櫎 readme 鏂囦歡錛岄鍏堝簲鎶婂鎴鋒満宸ヤ綔鐩綍涓殑 readme 鏂囦歡鍒犻櫎錛岀劧鍚庝嬌鐢?/span> cvs 鐨勫垹闄ゅ懡浠わ紝鏈鍚庢彁浜ゅ垹闄わ紝嫻佺▼濡備笅錛?/span>
rm readme
cvs rm readme
cvs commit 鈥搈 鈥?/span> 鐜板湪涓嶉渶瑕佽繖涓?/span> readme 鏂囦歡 鈥?span style="mso-spacerun: yes">聽 readme
濡傛灉緋葷粺綾諱技閿欒錛?/span> cannot remove file `INSTALL' which has a numeric sticky tag of `1.1'
鍙互鐢ㄥ懡浠?/span>
cvs update 鈥揂 readme
鍚庡啀鍒犻櫎鏂囦歡銆?/span>
浠ヤ笂涓虹伀灞卞摜鎻愪緵鐨?浠ヤ笅鏄垜娣誨姞鐨勯儴浠?
1.鍦╮eader鍜寃rites鏂囦歡涓坊鍔犱嬌鐢ㄧ敤鎴鋒椂瑕佹敞鎰?褰撳湪reader涓坊鍔犱簡鏌愪竴鍙鐢ㄦ埛鍚庡氨涓嶈鍦╳riters涓坊鍔犳鐢ㄦ埛,濡傛灉鍦ㄤ袱涓枃浠朵腑閮芥坊鍔犲悓涓鐢ㄦ埛鐨勮瘽,鍦ㄤ嬌鐢╟vs鏃?CVS鏈嶅姟鍣ㄤ細(xì)鎶婃鐢ㄦ埛褰撳仛鍙鐢ㄦ埛鐪嬪緟,褰撲嬌鐢ㄤ竴浜涘懡浠ゅimport鏃朵細(xì)浜х敓鏉冮檺闂,浠ヤ笅鏄痩inux鍏充簬姝ら棶棰樼殑璇存槑:
/* This command has the potential to modify the repository, so
聽 聽* we check if the user have permission to do that.
聽 聽*
聽 聽* (Only relevant for remote users -- local users can do
聽 聽* whatever normal Unix file permissions allow them to do.)
聽 聽*
聽 聽* The decision method:
聽 聽*
聽 聽*聽 聽 If $CVSROOT/CVSADMROOT_READERS exists and user is listed
聽 聽*聽 聽 in it, then read-only access for user.
聽 聽*
聽 聽*聽 聽 Or if $CVSROOT/CVSADMROOT_WRITERS exists and user NOT
聽 聽*聽 聽 listed in it, then also read-only access for user.
聽 聽*
聽 聽*聽 聽 Else read-write access for user.
聽 聽*/
娉?涔辯爜鏄敱浜庢垜鐨凩INUX涓嬩笉鏀寔涓枃鍝?鏄敞閲婁笉鐢ㄧ瀹?br />Demo.cpp:浠g爜濡備笅:
#include <string.h>
#include <iostream>
#include "Demo.h"
int main( int argc , char* argv[])
{
聽MemoryInf mymem;
聽DiskInf mydisk;
聽DbInf mydb;
聽Inital( argv[1]);
聽mydisk = GetDiskStat();
聽mymem = GetMemInf();
聽mydb = GetDbStat();
聽printf("disk total space:%d\n",mydisk.TotalSpace);
聽printf("disk FreeSpace space:%d\n",mydisk.FreeSpace);
聽printf("Memory TotalMem:%d\n",mymem.TotalMem);
聽printf("ValidMem:%d\n",mymem.ValidMem);
聽printf("VirtualMem:%d\n",mymem.VirtualMem);
聽printf("DbConnNum:%d\n",mydb.DbConnNum);
聽printf("DbStat:%d\n",mydb.DbStat);
聽printf("cpu:%d\n",GetCpuInf());
聽DesIceCom();
聽return 1;
}
5.緙栬瘧鏂囦歡鐢熸垚鍙墽琛岀▼搴?
鐢ㄤ互涓嬪懡浠?
$c++聽-lMyApp聽-o聽Demo聽Demo.cpp
璇存槑:-lMyApp鍙傛暟琛ㄧず,鐢ㄥ姩鎬侀摼鎺ュ簱libMyApp.so涓璧瘋繘琛岀紪璇?瀵逛簡libMyApp.so鏈濂芥斁鍦?usr/lib鐩綍涓嬪搱
濡備笉鍑烘剰澶栧垰浼?xì)鐢熸垚鍚嶄负Demo鐨勫彲鎵ц鏂囦歡
#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))
//ICE棰勭紪璇戣鍙?/p>
#ifdef _DEBUG
#pragma comment(lib, "iced.lib")
#pragma comment(lib, "iceutild.lib")
#else
#pragma comment(lib, "ice.lib")
#pragma comment(lib, "iceutil.lib")
#endif
typedef struct
{
聽聽聽 DWORD聽聽 dwUnknown1;
聽聽聽 ULONG聽聽 uKeMaximumIncrement;
聽聽聽 ULONG聽聽 uPageSize;
聽聽聽 ULONG聽聽 uMmNumberOfPhysicalPages;
聽聽聽 ULONG聽聽 uMmLowestPhysicalPage;
聽聽聽 ULONG聽聽 uMmHighestPhysicalPage;
聽聽聽 ULONG聽聽 uAllocationGranularity;
聽聽聽 PVOID聽聽 pLowestUserAddress;
聽聽聽 PVOID聽聽 pMmHighestUserAddress;
聽聽聽 ULONG聽聽 uKeActiveProcessors;
聽聽聽 BYTE聽聽聽 bKeNumberProcessors;
聽聽聽 BYTE聽聽聽 bUnknown2;
聽聽聽 WORD聽聽聽 wUnknown3;
} SYSTEM_BASIC_INFORMATION;
typedef struct
{
聽聽聽 LARGE_INTEGER聽聽 liIdleTime;
聽聽聽 DWORD聽聽聽聽聽聽聽聽聽聽 dwSpare[76];
} SYSTEM_PERFORMANCE_INFORMATION;
typedef struct
{
聽聽聽 LARGE_INTEGER liKeBootTime;
聽聽聽 LARGE_INTEGER liKeSystemTime;
聽聽聽 LARGE_INTEGER liExpTimeZoneBias;
聽聽聽 ULONG聽聽聽聽聽聽聽聽 uCurrentTimeZoneId;
聽聽聽 DWORD聽聽聽聽聽聽聽聽 dwReserved;
} SYSTEM_TIME_INFORMATION;
// ntdll!NtQuerySystemInformation (NT specific!)
//
// The function copies the system information of the
// specified type into a buffer
//
// NTSYSAPI
// NTSTATUS
// NTAPI
// NtQuerySystemInformation(
//聽聽聽 IN UINT SystemInformationClass,聽聽聽 // information type
//聽聽聽 OUT PVOID SystemInformation,聽聽聽聽聽聽 // pointer to buffer
//聽聽聽 IN ULONG SystemInformationLength,聽 // buffer size in bytes
//聽聽聽 OUT PULONG ReturnLength OPTIONAL聽聽 // pointer to a 32-bit
//聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // variable that receives
//聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // the number of bytes
//聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // written to the buffer
// );
typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);
PROCNTQSI NtQuerySystemInformation;
/*
聽 鍔熻兘:寰楀埌CPU浣跨敤鐘舵?br />聽 鍙傛暟:鏃?br />聽 榪斿洖鍊?鍐呭瓨鍗犵敤鐜?br />聽 浣滆?鐗電墰鏁f
*/
int GetCpuStat()
{
聽SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
聽聽聽 SYSTEM_TIME_INFORMATION聽聽聽聽聽聽聽 SysTimeInfo;
聽聽聽 SYSTEM_BASIC_INFORMATION聽聽聽聽聽聽 SysBaseInfo;
聽聽聽 double聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 dbIdleTime;
聽聽聽 double聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 dbSystemTime;
聽聽聽 LONG聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 status;
聽聽聽 LARGE_INTEGER聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 liOldIdleTime = {0,0};
聽聽聽 LARGE_INTEGER聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 liOldSystemTime = {0,0};
聽int UsageCpu = 0;
聽聽聽 NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(
聽聽GetModuleHandle("ntdll"),
聽聽"NtQuerySystemInformation"
聽聽);
聽
聽聽聽 if (!NtQuerySystemInformation)
聽聽聽聽聽聽聽 return 0;
聽
聽聽聽 status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);
聽聽聽 if (status != NO_ERROR)
聽聽聽聽聽聽聽 return 0;
聽聽聽聽
聽for( int t = 0 ; t < 2 ; t++ )
聽聽聽 {
聽聽status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);
聽聽聽聽聽聽聽 if (status!=NO_ERROR)
聽聽聽聽聽聽聽聽聽聽聽 return 0;
聽聽
聽聽聽聽聽聽聽 status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
聽聽聽聽聽聽聽 if (status != NO_ERROR)
聽聽聽聽聽聽聽聽聽聽聽 return 0;
聽聽
聽聽if (liOldIdleTime.QuadPart != 0)
聽聽{
聽聽聽聽聽聽聽聽聽聽聽 dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
聽聽聽聽聽聽聽聽聽聽聽 dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);
聽聽聽
聽聽聽聽聽聽聽聽聽聽聽 dbIdleTime = dbIdleTime / dbSystemTime;
聽聽聽
聽聽聽聽聽聽聽聽聽聽聽 dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors + 0.5;
聽聽聽UsageCpu = (int)dbIdleTime;
聽聽}
聽聽
聽聽聽聽聽聽聽 // store new CPU's idle and system time
聽聽聽聽聽聽聽 liOldIdleTime = SysPerfInfo.liIdleTime;
聽聽聽聽聽聽聽 liOldSystemTime = SysTimeInfo.liKeSystemTime;
聽聽
聽聽聽聽聽聽聽 // wait one second
聽聽聽聽聽聽聽 Sleep(500);
聽聽聽 }
聽return UsageCpu;
聽
}
/*
聽 鍔熻兘:寰楀埌鍐呭瓨浣跨敤鐘舵?br />聽 鍙傛暟:鏃?br />聽 榪斿洖鍊?鍐呭瓨淇℃伅緇撴瀯浣揫鍖呮嫭鎬葷殑鐗╃悊鍐呭瓨,榪樺彲浣跨敤鍐呭瓨,铏氭嫙鍐呭瓨,鍗曚綅涓篕]
聽 浣滆?鐗電墰鏁f
*/
MemoryInf MemorySta()
{
聽MemoryInf tmp;//鍦↖CE SLICE閲屽畾涔夌殑淇℃伅緇撴瀯浣?br />聽MEMORYSTATUS memStatus;
聽GlobalMemoryStatus(&memStatus);
聽DWORD tom=memStatus.dwTotalPhys/1024;
聽DWORD mem=memStatus.dwAvailPhys/1024;
聽DWORD res=memStatus.dwAvailVirtual/1024;
聽tmp.TotalMem = (int)tom;
聽tmp.ValidMem = (int)mem;
聽tmp.VirtualMem = (int)res;
聽return tmp;
}
/*
聽鍔熻兘:寰楀埌紜洏浣跨敤鎯呭喌
聽鍙傛暟:鏃?br />聽榪斿洖鍊?紜洏淇℃伅緇撴瀯浣?br />聽浣滆?鐗電墰鏁f
*/
DiskInf GetDiskSta()
{
聽ULARGE_INTEGER FreeAvailable,TotalNum,TotalFreeNum;
聽char p[3];
聽bool b_flag;
聽DiskInf tmp;//ICE SLICE閲屽畾涔夌殑紜洏淇℃伅緇撴瀯浣?br />聽tmp.TotalSpace = 0;
聽tmp.FreeSpace = 0;
聽//寰楀埌鏈夋晥鐨勯┍鍔ㄥ櫒鍚?鍗崇洏絎?
聽for( int drive = 1; drive <= 26; drive++ )
聽{
聽聽if( !_chdrive( drive ) )
聽聽{
聽聽聽memset( p , 0 , sizeof(p));
聽聽聽p[0] = drive + 'A' - 1;
聽聽聽p[1] = ':';
聽聽聽p[2] = '\0';
聽聽聽b_flag = GetDiskFreeSpaceEx( p ,&FreeAvailable,&TotalNum,&TotalFreeNum );
聽聽聽if( b_flag )
聽聽聽{
聽聽聽聽tmp.TotalSpace += (int)(TotalNum.QuadPart/(1024*1024));
聽聽聽聽tmp.FreeSpace += (int)(FreeAvailable.QuadPart/(1024*1024));
聽聽聽}
聽聽}
聽}
聽return tmp;
}
int main()
{
聽聽聽return 1;
}
涓嶇煡涓嶈錛?SPAN lang=EN>C++榪庢潵浜嗚嚜宸?SPAN lang=EN>20宀佺殑鐢熸棩銆?SPAN lang=EN>20騫存潵錛?SPAN lang=EN>C++浠庝竴涓疄楠屽璇█鎴愰暱涓鴻蔣浠朵駭涓氫竴嫻佷富瀵艱璦錛屽湪瀹為檯搴旂敤涓彇寰椾簡宸ㄥぇ鐨勬垚鍔燂紝鍚屾椂涔熷偓鐢熶簡澶ч噺涓烘妧鏈漢鍛樿崇啛鑳借鐨勭粡鍏告妧鏈憲浣滐紝姣斿Bjarne Stroustrup鐨勩?SPAN lang=EN>TC++PL銆嬪拰銆?SPAN lang=EN>D&E銆嬶紝Stan Lippman鐨勩?SPAN lang=EN>C++ Primer銆嬶紝Scott Meyers鐨勩?SPAN lang=EN>Effective C++銆嬶紝GoF鐨勩?SPAN lang=EN>Design Patterns銆嬶紝Andy Koenig鐨勩?SPAN lang=EN>Ruminations on C++銆嬶紝Herb Sutter鐨勩?SPAN lang=EN>Exceptional C++銆嬶紝Andrei Alexandrescu鐨勩?SPAN lang=EN>Modern C++ Design銆嬶紝Addison Wesley鐨勨?SPAN lang=EN>C++ in Depth鈥濈郴鍒楃瓑銆?SPAN lang=EN>C++棰嗗煙鐨勪竴浜涚粡鍏稿浘涔︿笉浣嗗浜?SPAN lang=EN>C++璇█鐨勫彂灞曡搗鍒頒簡宸ㄥぇ鐨勬帹鍔ㄤ綔鐢紝鑰屼笖瀵逛簬鍏朵粬鐩稿叧鎶鏈鍩熶篃璧峰埌浜嗘寚瀵煎拰淇冭繘浣滅敤銆備緥濡?SPAN lang=EN>Scott Meyers鐨勨?SPAN lang=EN>Effective緋誨垪鈥濓紝寮杈熶簡鎶鏈浘涔﹀啓浣滅殑鏂伴鏍鹼紝鑰屸?SPAN lang=EN>Design Patterns鈥濈殑褰卞搷錛屾洿鏄繙榪滆秴鍑?SPAN lang=EN>C++鐨勮寖鐣淬傝繖浜涚粡鍏哥殑濂戒功錛屽凡緇忔垚涓?SPAN lang=EN>C++杈夌厡鍘嗗彶鐨勪竴閮ㄥ垎鑰岃浜轟滑閾銆?SPAN lang=EN>
20騫村悗鐨勪粖澶╋紝杞歡浜т笟鐨勮妯″拰鐜宸茬粡鍙戠敓浜嗘繁鍒葷殑鍙樺寲銆傚浠婁紒涓氱駭搴旂敤鏁村悎涓庡紑鍙戠殑浠誨姟涓昏鐢?SPAN lang=EN>Java銆?SPAN lang=EN>C#銆?SPAN lang=EN>Visual Basic浠ュ強鍚勭鏂板瀷鍔ㄦ佽璦鏉ユ壙鎷咃紝鑰?SPAN lang=EN>C++鐨勫簲鐢ㄥ満鍚堜篃鏈夋墍鏀剁緝錛屼笉鍐嶆槸鍍?SPAN lang=EN>1990騫翠唬涓湡閭f牱浠庝笂鍒頒笅鍖呮墦澶╀笅錛岃屾槸鍛堢幇鍑洪矞鏄庣殑搴旂敤棰嗗煙鐗硅壊銆傜浉搴旂殑錛岃繎鏈熺殑C++鎶鏈浘涔︿篃鏇村姞娉ㄩ噸鍦ㄧ壒鑹查鍩熺殑鍙戞尌銆備笅闈㈡垜浠垎鍒粠鍑犱釜瑙掑害鏉ヤ簡瑙h繎鏈?SPAN lang=EN>C++鍥句功鐨勭儹鐐癸紝騫朵笖灞曟湜鏈潵涓騫翠腑C++鎶鏈浘涔︿腑鍊煎緱娉ㄦ剰鐨勯夐銆?SPAN lang=EN>
銆銆
緇忓吀钁椾綔鍏ㄩ潰緲繪柊
榪欎竴涓ゅ勾錛屼竴澶ф壒緇忓吀鎶鏈浘涔﹂兘緇忓巻浜嗕竴嬈℃洿鏂版崲浠o紝C++緇忓吀鍥句功鑷劧涔熶笉渚嬪銆傜涓涓璇寸殑灝辨槸Scott Meyers鐨勩?SPAN lang=EN>Effective C++銆嬨傝繖鏈功鍦?SPAN lang=EN>1991騫存帹鍑虹涓鐗堬紝1998騫存帹鍑虹浜岀増錛屽湪C++鎶鏈殑浼犳挱涓庢暀鑲叉柟闈㈠眳鍔熻嚦浼熴傚寘鎷垜鍦ㄥ唴鐨勫緢澶?SPAN lang=EN>C++寮鍙戣呴兘鏄氳繃闃呰榪欐湰涔﹁屽寰楀崌鍫傚叆瀹ょ殑闂ㄥ緞銆備粖騫達(dá)紝銆?SPAN lang=EN>Effective C++銆嬫帹鍑轟簡絎笁鐗堛傝繖涓鐗堝喅涓嶆槸絎簩鐗堢殑綆鍗曚慨璁紝鑰屾槸鏍規(guī)嵁鍏勾鏉?SPAN lang=EN>C++鎵鍙戠敓鐨勫法澶у彉鍖栬岃繘琛岀殑涓嬈″叏闈㈡敼鍐欙紝鍑犱箮鏄竴鏈叏鏂扮殑涔︺傚叾鍐呭娑電洊浜嗘棫鐗堢殑綺鵑珦錛屼篃浣撶幇浜嗚濡?SPAN lang=EN>Boost搴撱?SPAN lang=EN>TR1鏍囧噯絳?SPAN lang=EN>C++棰嗗煙鏈鏂版垚鏋溿傚鏋滆榪欐湰涔︾殑鍐呭鍙戠敓浜嗛噸澶х殑鍙樺寲錛岄偅涔堝彲浠ヨ涓嶅彉鐨勬槸榪欐湰涔︾殑鍦頒綅鈥斺斿畠浠嶇劧鏄瘡涓弗鑲冪殑C++寮鍙戣呴兘搴斿綋鍙嶅闃呰棰嗘?zhèn)熺殑閲嶈浣滃搧銆?SPAN lang=EN>
鍙︿竴鏈炕鏂扮殑钁椾綔鏄?SPAN lang=EN>Stan Lippman鐨勩?SPAN lang=EN>C++ Primer銆嬬鍥涚増銆傝繖鏈功鐨勫巻鍙插湴浣嶆棤闇璧樿█錛岃縿浠婁負(fù)姝粛鐒舵槸瀵?SPAN lang=EN>C++浠嬬粛鏈鍏ㄩ潰鐨勪竴鏈憲浣溿傜鍥涚増榪涜浜嗗ぇ騫呭害鐨勫垹淇紝綃囧箙鍑忓皯榪?SPAN lang=EN>300欏碉紝鑰屽唴瀹逛篃澶у箙淇敼錛屼互鍙嶆槧C++榪戝勾鏉ョ殑鍙樺寲銆傚浜庡笇鏈涚郴緇熷涔?SPAN lang=EN>C++鐨勬柊鎵嬶紝鎴栬呭笇鏈涙嫢鏈変竴鏈墜鍐屼互澶囨煡鐨勮佹墜鏉ヨ錛岃繖鏈功鐨勫湴浣嶆槸涓嶅彲鍙栦唬鐨勩?SPAN lang=EN>
鏈変紶璦璇?SPAN lang=EN>GoF鎵撶畻緲繪柊鈥?SPAN lang=EN>Design Patterns鈥濄傝涔︾涓鐗堜簬1995騫村垵鐗堬紝姝ゅ悗鍗佸勾錛岃璁℃ā寮忛鍩熺殑鐞嗚鎺㈣鍜屽疄璺靛熀鏈笂浠嶇劧鍥寸粫榪欐湰涔︿腑鐨勮鐐瑰拰鍐呭榪涜錛屽皯鏈夌獊鐮淬傚凡緇忔湁涓嶅皯寮鍙戣呭浜庤繖縐嶆儏鍐佃〃紺轟簡涓嶆弧錛岃涓哄垵鐗堜腑鐨勪竴浜涜鐐瑰凡緇忚繃鏃訛紝鐢氳嚦瀵圭幇鍦ㄧ殑涓浜涙妧鏈簲鐢ㄦ瀯鎴愭濇兂涓婄殑緹佺粖銆備絾鏄涔﹀疄鍦ㄥ0鍚嶅お鐩涳紝鐪熸鐨勭獊鐮存亹鎬曞彧鑳界敱GoF鑷繁瀹屾垚錛屽洜姝ゆ湰涔︽柊鐗堝鏋滄帹鍑猴紝蹇呭皢鏄妧鏈晫鍐呯殑涓妗╁ぇ浜嬨備笉榪囦紶璦浜︾О錛?SPAN lang=EN>GoF瀵逛簬鏂扮増鈥?SPAN lang=EN>Design Patterns鈥濇槸鍚︾戶緇嬌鐢?SPAN lang=EN>C++浣滀負(fù)紺鴻寖璇█瀛樺湪鍒嗘銆備笉綆℃庢牱錛岀浉淇″箍澶ц鑰呬細(xì)瀵硅繖鏈功鎶辨湁楂樺害鐨勫叧娉ㄣ?SPAN lang=EN>
鏂伴攼浣充綔鍓戣蛋鍋忛攱
榪戝勾鏉ワ紝涓鎵?SPAN lang=EN>C++鎶鏈柊閿愬礇璧鳳紝緇欐垜浠甫鏉ヤ簡涓鎵逛護浜鴻崇洰涓鏂扮殑C++濂戒功銆傚湪鎶鏈笂錛岃繖鎵瑰浘涔﹀亸閲嶄簬C++妯℃澘椋庢牸鐨勫閥濡欒繍鐢紝瀵屼簬鏅鴻叮鑰屽瀹炶返鐨勫叧娉ㄧ暐鏄句笉瓚熾傝繖綾誨浘涔︿互2001騫?SPAN lang=EN>Andrei Alexandrescu鐨勩?SPAN lang=EN>Modern C++ Design銆嬩負(fù)寮绔紝涔嬪悗鍙堟湁銆?SPAN lang=EN>Boost Graphic Library銆嬶紝銆?SPAN lang=EN>C++ Template Metap- rogramming銆嬬瓑銆傝繖浜涗功涓搴︿互鍏舵柊棰栫殑鎬濇兂鍜屽濡欑殑鎶宸у惛寮曚簡澶у鐨勭洰鍏夛紝浣嗙敱浜庣己涔忓疄璺電殑鏀拺錛岄愭笎瑜幓鍏夌幆銆傝繖涓ゅ勾錛岃繖綾婚鏉愰愭笎緙╁噺銆傚嵆浣垮儚Andrei Alexandrescu閭f牱鐨勬ā鏉挎妧鏈鎵嶏紝鏈榪戜笌Herb Sutter鍚堜綔鐨勩?SPAN lang=EN>C++ Coding Standard銆嬩篃騫舵病鏈夎繃澶氬湴鐐妯℃澘鎶宸э紝鑰屾槸涓涓煩鍦板C++緙栫爜鐨勭粡楠屽仛浜嗚創(chuàng)榪戝疄璺電殑鎬葷粨銆傝繖鏈功涓?SPAN lang=EN>Steve McConnell鐨勭粡鍏歌憲浣溿?SPAN lang=EN>Code Complete II銆嬬浉閰嶅悎錛屽簲鎴愪負(fù)姣忎竴浣?SPAN lang=EN>C++寮鍙戣呭繀璇葷殑鍩烘湰钁椾綔錛屽皢甯姪璇昏呭瀹氬潥瀹炵殑緙栫爜鍜屽井瑙傝璁℃妧鏈熀紜銆?SPAN lang=EN>
Boost鏄?SPAN lang=EN>C++紺劇兢灝戒漢鐨嗙煡鐨勨滃噯鏍囧噯搴撯濓紝鍏朵腑澶ч噺鐨勭粍浠跺凡緇忓熀鏈垚鐔熷茍鍙緵搴旂敤銆傛渶榪?SPAN lang=EN>Bjorn Karlsson鎾板啓鐨勩?SPAN lang=EN>Beyond C++ Standard Library: An Introduction to Boost銆嬫槸甯傞潰涓婄涓鏈叏闈粙緇?SPAN lang=EN>Boost鐨勮憲浣溿傚浜庨偅浜涘媷浜庡悆铻冭煿鐨?SPAN lang=EN>C++鍏堥攱寮鍙戣呮潵璇達(dá)紝榪欐湰涔︽棤鐤戞槸鍊煎緱涓璇葷殑銆備笉榪囧湪C++紺劇兢錛屽Boost搴撹繕瀛樺湪浜夎銆傚ぇ閮ㄥ垎C++瀹炶返鑰呮瘮杈冧繚瀹堬紝榪欐湰涔﹀浠栦滑鐨勫惛寮曞姏鎭愭曞皢鎵撴姌鎵c?SPAN lang=EN>
Stephen Dewhurst鏄繎騫存潵姣旇緝媧昏穬鐨勬柊閿愪綔瀹訛紝浠栫殑涓ゆ湰涔︺?SPAN lang=EN>C++ Gotchas銆嬪拰銆?SPAN lang=EN>C++ Common Knowledge銆嬶紝鍗曠嫭鏉ョ湅閮芥槸鍊煎緱涓璇葷殑濂戒功錛屽彲鎯滅幇鍦ㄤ笉鏄?SPAN lang=EN>1995騫達(dá)紝鑰屾槸2005騫達(dá)紝Scott Meyers銆?SPAN lang=EN>Herb Sutter鐓岀厡宸ㄨ憲宸茬劧鍗辨ヤ節(jié)浜旓紝Dewhurst鍙ソ鑷徆鏂芥墜鐣ユ參銆備笉榪囨垜浠笇鏈涗粬鑳藉鍐嶆帴鍐嶅帀錛屾壘鍒板垱鏂扮偣錛岀獊鐮村墠浜恒?SPAN lang=EN>
鐩告瘮涔嬩笅錛屼腑鏂囩増鍗沖皢闂笘鐨勩?SPAN lang=EN>Imperfect C++銆嬪氨姣旇緝鏈夋柊鎰忥紝寰堝煎緱涓璇伙紝浠ヨ嚦浜?SPAN lang=EN>Bjarne Stroustrup閮界浉褰撹禐璧忋傝繖浣?SPAN lang=EN>C++涔嬬埗琛ㄧず錛屽鏋滀笉鏄洜涓鴻涔﹀お鍘氾紝浠栦竴瀹氫細(xì)灝嗗叾綰沖叆钁楀悕鐨勨?SPAN lang=EN>C++ in Depth鈥濈郴鍒椼傝繖鍦ㄤ簨瀹炰笂鑲畾浜嗘湰涔︾殑楂樿川閲忋傛垜涓漢璁や負(fù)錛岃繖鏈功鏄竴騫存潵鍑虹増鐨勬渶鍊煎緱綺捐鐨?SPAN lang=EN>C++钁椾綔錛屽叾涓浜庝笉灝戝疄璺典腑緇忓父閬囧埌鐨勯毦棰樿繘琛屼簡娣卞叆鐨勫垎鏋愶紝緇欏嚭浜嗗疄瀹炲湪鍦ㄧ殑瑙e喅鏂規(guī)銆備綔鑰?SPAN lang=EN>Matt Wilson鍑熸涔︿互鍙婂叾緋誨垪妯℃澘紼嬪簭搴撳礇璧蜂負(fù)C++紺劇兢涓紩浜烘敞鐩殑鏂版槦錛屽疄鍦ㄥ彲鍠滃彲璐恒?SPAN lang=EN>
銆銆
鍏抽敭棰嗗煙鏈熷緟浣充綔
鏈潵C++灝嗕富瑕佸湪緋葷粺綰у鏉傚簲鐢ㄧ▼搴忋侀珮鎬ц兘銆佸疄鏃朵腑闂翠歡鍙婂祵鍏ュ紡棰嗗煙鏂藉睍錛屽悓鏃訛紝闅忕潃澶氭牳CPU鐨勭殑鏅強鍜岀綉緇滃畨鍏ㄩ噸瑕佹х殑絀哄墠鎻愬崌錛屽湪騫跺彂紼嬪簭璁捐鍜屽畨鍏ㄧ▼搴忚璁℃柟闈紝C++涔熷皢鑾峰緱鏂扮殑搴旂敤絀洪棿銆傚洜姝わ紝鍦ㄨ繖浜涘叿浣撻鍩熺殑C++钁椾綔鏇村煎緱鍏蟲敞銆?SPAN lang=EN>
1996騫達(dá)紝John Lakos鍑虹増浜嗐?SPAN lang=EN>Large Scale C++銆嬩竴涔︼紝璇ヤ功涓?鈥?SPAN lang=EN>C++ In Depth鈥濈郴鍒椾腑鐨勩?SPAN lang=EN>Applied C++銆嬩竴鏍鳳紝鏄?SPAN lang=EN>C++钁椾綔涓瀬灝戞暟瀹炴垬?gòu)z句匠浣滐紝鍏朵腑瀛楀瓧鍙ュ彞閮芥潵鑷簬浣滆呬赴瀵岀殑瀹為檯欏圭洰緇忛獙錛屽浜庝竴綰跨殑C++寮鍙戣呮潵璇存槸鐗瑰埆鍊煎緱鍜鍤間綋鍛崇殑濂戒功銆傚彲鎯滆繖鏈功鍦ㄥ浗鍐呬竴鐩存病鏈夊緱鍒板簲鏈夌殑閲嶈錛岃繖鍙兘璺熸湰涔︿腑璇戞湰鍑虹増鏃墮棿榪囨櫄錛屼笖緲昏瘧璐ㄩ噺涓嶄匠鏈夊叧銆傚ソ娑堟伅鏄紝John Lakos鍗沖皢鍦?SPAN lang=EN>2006騫存帹鍑哄叾鏂頒綔銆?SPAN lang=EN>Scalable C++銆嬨傛垜鏈漢灝嗘涔﹁涓烘湭鏉ヤ竴騫翠腑C++棰嗗煙鏈浠や漢鏈熷緟鐨勪綔鍝併傝繖涓鏂歸潰鏄嚭浜庢垜瀵逛簬浣滆呯殑楂樺害淇′換錛屽彟涓鏂歸潰鏄敱浜庤涔﹂鏉愮殑鏋佺閲嶈鎬с傝涔﹀壇鏍囬涓衡滃熀浜庣粍浠剁殑杞歡寮鍙戔濓紝鑰屸滅粍浠跺寲鈥濊繖涓涓婚錛屾槸C++鍗佸嚑騫存潵鐨勪竴鍧楀績鐥呫傚湪鏈潵錛屾棤璁?SPAN lang=EN>C++搴旂敤鍦ㄤ綍縐嶅満鍚堬紝鈥滅粍浠跺寲鈥濇槸蹇呬笉鍙皯鐨勫熀鏈姹傘傝?SPAN lang=EN>COM鎶鏈櫧鐒跺湪緇勪歡鍖栨柟闈㈡瘮杈冩垚鐔燂紝浣嗘槸涓嶅叿鏈夊彲縐繪鎬э紝鑰屼笖瀵逛簬鏃犻』璺ㄨ璦鐨?SPAN lang=EN>C++寮鍙戦」鐩潵璇磋繃浜庡鏉傘傚洜姝わ紝C++紺劇兢闇瑕佽嚜宸辨帰璁ㄧ粡嫻庨傜敤鐨勭粍浠跺寲瀹炵敤鏂規(guī)銆?SPAN lang=EN>John Lakos鏈漢浠庝簨澶у瀷澶嶆潅搴旂敤杞歡寮鍙戝騫達(dá)紝鍦ㄨ繖鏂歸潰鐨勭粡楠屾棤浜鴻兘鏁岋紝鐢變粬鏉ュ榪欎釜涓婚榪涜娣卞叆鍓栨瀽錛屽茍涓旂粰鍑哄疄闄呰В鍐蟲柟妗堬紝姣棤鐤戦棶鏄啀鍚堥備笉榪囩殑浜嗐傝櫧鐒惰繖鏈功榪樺湪鍐欎綔榪囩▼涓紝浣嗘槸鎴戜滑鏈夌悊鐢卞鍏舵姳鏈夊厖鍒嗕俊蹇冦傚湪姝ゆ垜涔熷懠鍚佹湰涔︿腑鏂囩増鏈潵鐨勫嚭鐗堣呰鐪熷寰呮涔︾殑緲昏瘧鍒朵綔錛屼笉瑕侀噸韞堛?SPAN lang=EN>Large Scale C++銆嬬殑瑕嗚緳銆?SPAN lang=EN>
璇村埌COM錛岃嚜浠?SPAN lang=EN>.NET鎺ㄥ嚭錛?SPAN lang=EN>COM鐨勪功鍑犱箮涓澶滀箣闂寸粷浜嗙錛屽嚑涔庢棤浜哄啀鍕囦簬鐐掕繖紕楀喎楗備絾榪欐鍑虹増鐣岀殑鑼跺疄鍦ㄥ噳寰楀揩浜嗕簺錛屼簨瀹炰笂鐩村埌浠婂ぉ錛?SPAN lang=EN>COM寮鍙戜粛鐒舵槸Windows騫沖彴涓婂簲鐢ㄥ紑鍙戠殑涓涓噸瑕佹柟鍚戙傜壒鍒槸鍦ㄥ墠涓ゅ勾寰蔣Windows鏍稿績鍚?SPAN lang=EN>.NET鍏ㄩ潰杞瀷鐨勫乏鍊懼啋闄╀富涔夌殑灝濊瘯浠ュけ璐ュ憡緇堝悗錛屽湪鍙鐨勬湭鏉ワ紝Windows鎿嶄綔緋葷粺灝嗙戶緇瀯寤哄湪C/C++鍜?SPAN lang=EN>COM鐨勫熀紜涔嬩笂鈥斺旇繖灝辯‘淇濅簡COM鍦?SPAN lang=EN>Windows騫沖彴涓婄殑閲嶈鍦頒綅灝嗚嚦灝戝歡緇埌2011騫翠箣鍚庛傚洜姝わ紝COM銆?SPAN lang=EN>ATL鍜?SPAN lang=EN>WTL寮鍙戞妧鏈湪鏈潵鍑犲勾閮借繕鏄鍏鋒剰涔夌殑鍑虹増棰樻潗銆傜壒鍒槸榪戝勾鏉?SPAN lang=EN>ATL/WTL鐨勫彂灞曚箣蹇紝鐩告瘮涔嬩笅錛屾妧鏈嚭鐗堝湪榪欐柟闈㈠嚭鐜頒簡涓涓┖鐧界偣銆傛澶栵紝寮婧愮殑Mozilla欏圭洰鎻愪緵浜嗕竴涓彲縐繪鍒版墍鏈変富嫻佸鉤鍙扮殑COM瀹炵幇錛岃繖瀵逛簬C++寮鍙戣呮潵璇存槸寰堝叿鏈夊惛寮曞姏鐨勶紝鍗翠竴鐩存病鏈夊嚭鐗堣祫婧愮殑鍏蟲敞錛屼護浜洪仐鎲俱?SPAN lang=EN>
C++榪戝勾鏉ョ殑涓涓簲鐢ㄧ儹鐐規(guī)槸澶嶆潅緗戠粶搴旂敤鐨勫紑鍙戯紝ACE鍦ㄨ繖鏂歸潰宸茬粡鎴愪負(fù)瓚婃潵瓚婃祦琛岀殑閫夋嫨錛岃?SPAN lang=EN>ICE浣滀負(fù)鐩墠鍙敤鐨勬渶鍏堣繘鐨勯珮鎬ц兘涓棿浠朵駭鍝侊紝宕涜搗鐨勫娍澶村緢鐚涖傝繖涓ゆ柟闈㈢洰鍓嶉兘鏈変竴浜涘ソ涔︼紝鐗瑰埆鏄渶榪戝嚭鐗堢殑銆?SPAN lang=EN>ACE Programmer鈥?SPAN lang=EN>s Guide銆嬶紝瀵逛簬ACE緙栫▼鍏ラ棬寰堟湁濂藉銆傝?SPAN lang=EN>ICE 1.3鐗堢殑鎵嬪唽鏃╁凡鐢遍┈緇磋揪鍏堢敓璇戞垚涓枃錛屽彲鍦ㄧ綉涓婅嚜鐢辮幏寰椼備笉榪囧潶鐜囧湴璇達(dá)紝榪欐柟闈㈢殑鍥句功榪樿繙榪滀笉澶燂紝ACE鍘熶綔鑰?SPAN lang=EN>Doug Schmidt鎵钁楃殑涓ゅ嵎鏈?SPAN lang=EN>C++ Network Programming銆嬪彲璇繪у拰瀹炵敤鎬т笉瓚籌紝鑰?SPAN lang=EN>ICE鎵嬪唽娣卞害鍜屽箍搴﹂兘鏄句笉澶燂紝鎴戜滑鏈熸湜榪欐柟闈㈣兘鏈夋洿濂界殑钁椾綔鍑虹幇銆?SPAN lang=EN>
闅忕潃澶氭牳CPU鐨勬櫘鍙婏紝騫跺彂紼嬪簭璁捐灝嗘垚涓?SPAN lang=EN>C++鎶鏈笂鐨勪竴涓柊鐑偣銆傝繖鏂歸潰鐩墠鐨勫ソ涔﹀嚑涔庢病鏈夛紝涓嶇煡閬撹繖涓法澶х殑絀虹櫧灝嗙敱浣曟柟紲炲湥鏉ュ~琛ャ?SPAN lang=EN>
鍚屾牱錛岀綉緇滃畨鍏ㄩ噸瑕佹х殑絀哄墠鎻愬崌瀵?SPAN lang=EN>C++寮鍙戞彁鍑轟簡寰堝鏂扮殑鍏蜂綋瑕佹眰錛屽緢澶?SPAN lang=EN>C++鑰佹墜闈復(fù)涓涓滃啀鏁欒偛鈥濈殑闂銆傝繖鏂歸潰Microsoft Press鐨勩?SPAN lang=EN>Writing Safe Code銆嬶紝O鈥?SPAN lang=EN>Reilly鐨勩?SPAN lang=EN>Secure Programming Cookbook for C and C++銆嬶紝浠ュ強鏈榪?SPAN lang=EN>Pearson鍑虹増鐨勩?SPAN lang=EN>Secure Coding in C and C++銆嬮兘鏄笉閿欑殑鍙傝冦備笉榪囨垜鍙戠幇鐩墠C++寮鍙戣呭茍鏈櫘閬嶉噸瑙嗚繖涓棶棰樸備篃璁哥鐞嗗眰榪橀渶瑕佹洿鍔犫滆娣嬫穻鐨勬暀璁濇潵鍒烘縺涓涓嬶紝鎵嶄細(xì)鏈夐潻鏂扮殑鍔ㄥ姏銆?SPAN lang=EN>
鍦ㄥ祵鍏ュ紡鏂歸潰錛岀敱浜庡簲鐢ㄥ鏉傚害鐨勯愭笎鎻愬崌鍜?SPAN lang=EN>Symbian OS/Windows CE絳夐潰鍚戞秷璐圭殑楂樼駭宓屽叆寮忔搷浣滅郴緇熺殑騫挎硾搴旂敤錛岀粰C++鎻愪緵浜嗕竴涓箍闃旂殑鍙戞尌絀洪棿銆傚彲鎯滃湪榪欐柟闈紝鐪熸鍫О緇忓吀鐨勫ソ涔﹁繕鏄嚖姣涢簾瑙掞紝鐪嬫潵榪橀渶瑕佹椂闂村拰緇忛獙鐨勭Н娣(wěn)銆備笉榪囨湁涓鏈功鐗瑰埆鍊煎緱涓鎻愶紝鍖楄埅鍑虹増紺懼幓騫村紩榪涚殑銆婂祵鍏ュ紡緋葷粺鐨勫井妯″潡鍖栬璁°嬭鍥介檯宓屽叆寮忓紑鍙戦鍩熷叕鎺ㄤ負(fù)鏁板勾鏉ュ勾搴︽渶閲嶈鐨勫祵鍏ュ紡杞歡寮鍙戞妧鏈憲浣滐紝鍏朵腑鍚湁涓浜涙剰涔夋繁榪滅殑鍒涙柊鎬濇兂錛岄潪宓屽叆寮忓紑鍙戣呬篃鏈夊繀瑕佷簡瑙f涔︾殑澶ц嚧鎬濇兂銆?SPAN lang=EN>
銆銆
鎬葷粨
紼嬪簭璁捐璇█鏁頒互鍗冭錛岃兘澶熷箍涓烘祦浼犵殑涓嶈繃鍑犲崄縐嶏紝鑰岃兘澶熼鍏?SPAN lang=EN>20騫寸殑鏇存槸灞堟寚鍙暟銆?SPAN lang=EN>Fortran宸茬粡闂笘50騫達(dá)紝浠嶇劧鏄瀛﹁綆楅閫夛紝C璇█杈夌厡30騫達(dá)紝鑷充粖鑰佸綋鐩婂.銆?SPAN lang=EN>C++欏哄埄鍦板害榪囦簡鑷繁鐨?SPAN lang=EN>20宀佺敓鏃ワ紝鐩鎬俊灞炰簬瀹冪殑鏃ュ瓙榪樺緢闀垮緢闀褲備綔涓?SPAN lang=EN>C++寮鍙戣咃紝鎴戜滑涔熷笇鏈涚湅鍒頒紭縐鐨?SPAN lang=EN>C++鎶鏈浘涔︿笉鏂秾鐜般傚巻鍙茶瘉鏄庯紝C++棰嗗煙鍐呯殑鎶鏈垱鏂幫紝涓嶄絾瀵逛簬C++寮鍙戝叿鏈夐噸澶ф剰涔夛紝鑰屼笖瀵逛簬鏁翠釜杞歡寮鍙戞妧鏈兘鍏鋒湁閲嶅ぇ鎰忎箟銆傛垜浠湁鐞嗙敱鐩鎬俊錛屽湪涓嬩竴涓崄騫撮噷錛屼互楂樻按騫?SPAN lang=EN>C++鎶鏈笓瀹跺拰浣滃涓轟唬琛ㄧ殑C++鎶鏈ぞ緹よ兘澶熺戶緇負(fù)杞歡鎶鏈仛鍑虹獊鍑虹殑璐$尞銆?/FONT>
|
|
| 鍦ㄦ墍鏈夌殑棰勫鐞嗘寚浠や腑錛?Pragma 鎸囦護鍙兘鏄渶澶嶆潅鐨勪簡錛屽畠鐨勪綔鐢ㄦ槸璁懼畾緙栬瘧鍣ㄧ殑鐘舵佹垨鑰呮槸鎸囩ず緙栬瘧鍣ㄥ畬鎴愪竴浜涚壒瀹氱殑鍔ㄤ綔銆?pragma鎸囦護瀵規(guī)瘡涓紪璇戝櫒緇欏嚭浜嗕竴涓柟娉?鍦ㄤ繚鎸佷笌C鍜孋 ++璇█瀹屽叏鍏煎鐨勬儏鍐典笅,緇欏嚭涓繪満鎴栨搷浣滅郴緇熶笓鏈夌殑鐗瑰緛銆備緷鎹畾涔?緙栬瘧鎸囩ず鏄満鍣ㄦ垨鎿嶄綔緋葷粺涓撴湁鐨?涓斿浜庢瘡涓紪璇戝櫒閮芥槸涓嶅悓鐨勩? 鍏舵牸寮忎竴鑸負(fù): #Pragma Para 鍏朵腑Para 涓哄弬鏁幫紝涓嬮潰鏉ョ湅涓浜涘父鐢ㄧ殑鍙傛暟銆? 浼犵粺鐨勫埌鍑?DLL 鍑芥暟鐨勬柟娉曟槸浣跨敤妯″潡瀹氫箟鏂囦歡 (.def)錛孷isual C++ 鎻愪緵浜嗘洿綆媧佹柟渚跨殑鏂規(guī)硶錛岄偅灝辨槸鈥淿_declspec()鈥濆叧閿瓧鍚庨潰璺熲渄llexport鈥濓紝鍛婅瘔榪炴帴鍘昏瀵煎嚭榪欎釜鍑芥暟錛屼緥濡傦細(xì) 鎶娾淿_declspec(dllexport)鈥濇斁鍦ㄥ嚱鏁板0鏄庣殑鏈鍓嶉潰錛岃繛鎺ョ敓鎴愮殑 DLL 灝變細(xì)瀵煎嚭鍑芥暟鈥淿MyExportFunction@4鈥濄?/P>
涓婇潰鐨勫鍑哄嚱鏁扮殑鍚嶇О涔熻涓嶆槸鎴戠殑甯屾湜鐨勶紝鎴戜滑甯屾湜瀵煎嚭鐨勬槸鍘熺増鐨勨淢yExportFunction鈥濄傝繕濂斤紝VC 鎻愪緵浜嗕竴涓澶勭悊鎸囩ず絎︹?pragma鈥濇潵鎸囧畾榪炴帴閫夐」 (涓嶄粎浠呮槸榪欎竴涓姛鑳斤紝榪樻湁寰堝鎸囩ず鍔熻兘) 錛屽涓嬶細(xì) 榪欎笅灝卞ぉ濡備漢鎰夸簡錛氾級銆傚鏋滀綘鎯蟲寚瀹氬鍑虹殑欏哄簭錛屾垨鑰呭彧灝嗗嚱鏁板鍑轟負(fù)搴忓彿錛屾病鏈?Entryname錛岃繖涓澶勭悊鎸囩ず絎?(紜垏鍦拌鏄繛鎺ュ櫒) 閮借兘澶熷疄鐜幫紝鐪嬬湅 MSDN 鐨勮娉曡鏄庯細(xì) @ordinal 鎸囧畾欏哄簭錛汵ONAME 鎸囧畾鍙皢鍑芥暟瀵煎嚭涓哄簭鍙鳳紱DATA 鍏抽敭瀛楁寚瀹氬鍑洪」涓烘暟鎹」銆?/P> |
銆銆TCP/IP鏄痩nternet涓婂箍娉涗嬌鐢ㄧ殑涓縐嶅崗璁紝鍙敤浜庡紓縐嶆満涔嬮棿鐨勪簰鑱斻俆CP/IP鍗忚鏈韓鏄潪甯稿鏉傜殑錛岀劧鑰屽湪緗戠粶緙栫▼涓紝紼嬪簭鍛樹笉蹇呰冭檻TCP/IP鐨勫疄鐜扮粏鑺傦紝鍙渶鍒╃敤鍗忚鐨勭綉緇滅紪紼嬫帴鍙ocket錛堜害縐板鎺ュ瓧錛夊嵆鍙傚湪 Windows 涓紝緗戠粶緙栫▼鎺ュ彛鏄?Windows Socket顤勫畠鍖呭惈鏍囧噯鐨凚erkley Sockets鐨勫姛鑳借皟鐢ㄧ殑闆嗗悎錛屼互鍙婁負(fù) Windows 鎵鍋氱殑涓浜涙墿灞曘俆CP/IP鍗忚鐨勫簲鐢ㄤ竴鑸噰鐢ㄥ鎴鳳紡鏈嶅姟鍣ㄦā寮忥紝闈㈠悜榪炴帴鐨勫簲鐢ㄨ皟鐢ㄥ鍥撅紤鎵紺恒?BR>
銆銆澶氱嚎紼嬬紪紼嬪父甯歌繕瑕佽冭檻綰跨▼闂寸殑閫氫俊銆傜嚎紼嬮棿鐨勯氫俊鍙互閲囩敤鍏ㄥ眬鍙橀噺銆佹寚閽堝弬鏁板拰鏂囦歡鏄犲皠絳夋柟寮忋傛湰鏂囬噰鐢ㄦ寚閽堝弬鏁版柟寮忋傚湪璋冪敤AfxBeginThread錛堬級鍑芥暟鏃訛紝閫氳繃浼犻掓寚閽堝弬鏁扮殑鏂瑰紡鍦ㄤ富綰跨▼涓庤緟鍔╃嚎紼嬮棿閫氫俊銆?BR>
銆銆鍦ㄧ數(shù)鍘傚拰鐢電珯涓紝涓轟簡淇濊瘉瀹夊叏宸ヤ綔錛屼繚鎶ょ郴緇熷繀涓嶅彲灝戙備繚鎶ょ郴緇熺殑鐢墊簮渚涘簲閫氬父浣跨敤涓ょ鏂瑰紡銆備竴鑸儏鍐典笅錛屼嬌鐢ㄤ氦嫻佺數(shù)緋葷粺瀵逛繚鎶ょ郴緇熻繘琛屼緵鐢?shù)锛涘綋浜箒鐢?shù)緋葷粺鍑虹幇鏁呴殰鏃額杽绔嬪嵆浣跨敤鍚庡鐨勮搫鐢墊睜緋葷粺瀵逛繚鎶ょ郴緇熻繘琛屼緵鐢點備負(fù)浜嗗钃勭數(shù)姹犵郴緇熻繘琛岀洃鎺у拰綆$悊錛屼互淇濊瘉钃勭數(shù)姹犲湪鍏抽敭鏃跺埢鑳芥甯稿伐浣滐紝璁捐浜嗗湪Windows NT鐜涓嬪叿鏈夎繙紼嬮氳鍔熻兘鍜屽姩鎬佷漢鏈虹晫闈㈢殑鏅鴻兘钃勭數(shù)姹犺繙紼嬬洃鎺х郴緇?銆傝緋葷粺鐢辮搫鐢墊睜鏅鴻兘綆$悊銆佸厖鐢墊満鎺у埗銆佹瘝綰跨粷緙樺湪綰挎嫻嬨佸0鍏夋姤璀︺佺郴緇熺粍鎬併佽繙紼嬮氫俊絳夊瓙緋葷粺緇勬垚錛屽疄鐜板钃勭數(shù)姹狅紡鍏呯數(shù)鏈烘櫤鑳藉寲榪滅▼綆$悊鍜屾帶鍒訛紝瀵規(guī)暣涓郴緇熺殑榪愯鐘舵佽繘琛屽疄鏃剁洃鎺э紝鍏鋒湁澶氬獟浣撴姤璀︺佷簨浠跺鐞嗐佸姩鎬佹暟鎹簱銆佽秼鍔跨敾闈㈠拰鍔ㄦ佺敾闈㈡樉紺恒佹搷浣滄彁鍓嶆彁閱掔瓑鍔熻兘銆傜郴緇熸鍥懼鍥?鎵紺恒傚湪榪滅▼閫氫俊妯″潡涓紝榪滅▼鐩戞帶鏈洪渶鎶婄洃鎺у鎴風(fēng)殑鎿嶄綔鍛戒護鍙婃椂浼犵粰鏈湴鏈猴紝鏈湴鏈烘牴鎹懡浠ゆ帶鍒跺厖鐢墊満錛屼嬌涔嬫寜鐓т竴瀹氱殑鏂瑰紡宸ヤ綔錛岃屾湰鍦版満闇瀹氭椂鍚戣繙紼嬬洃鎺ф満鍙嶉瀹炴椂鐨勫厖鐢墊満鐘舵佷俊鎭傚畠浠箣闂寸殑閫氫俊鏄熀浜嶵CP/IP鐨勫箍鍩熺綉閫氫俊錛岃屼笖錛屾垜浠紩榪涗簡澶氱嚎紼嬫満鍒朵互淇濊瘉緋葷粺鍏鋒湁鑹ソ鐨勫疄鏃舵с?BR> char 杞崲涓?string 鍨?BR> char* str = "char 杞崲涓?string 鍨?;
SendData.strSql = str;
//SendData.strSql 涓簊td::string鍨?/P>
棣栧厛錛岃澶у璇籌CE涓枃鎵嬪唽涓殑Slice璇█涓绔犮?榪欎竴閮ㄥ垎闄や簡model錛堟ā鍧楋級錛屽湪 ICE 1.3涓枃鎵嬪唽涓兘鏈夋弿榪?
鍚湁Slice 瀹氫箟鐨勬枃浠跺繀欏諱互.ice 鎵╁睍鍚嶇粨灝撅紝渚嬪錛?Clock.ice灝辨槸涓涓湁鏁堢殑鏂囦歡鍚嶃傜紪璇戝櫒鎷掔粷鎺ュ彈鍏朵粬鎵╁睍鍚嶃?
Slice 鏀寔#ifndef銆?define銆?endif錛屼互鍙?include 棰勫鐞嗘寚浠ゃ傚畠浠殑浣跨敤鏂瑰紡鏈変弗鏍肩殑闄愬埗錛氫綘鍙兘鎶?ifndef銆?define錛屼互鍙?endif 鎸囦護鐢ㄤ簬鍒涘緩鍙屽寘鎷紙double-include錛夊潡銆備緥濡傦細(xì)
#ifndef _CLOCK_ICE #define _CLOCK_ICE // #include 鏂囦歡 here... //瀹氫箟 here... #endif _CLOCK_ICE
鎴戜滑寮虹儓寤鴻浣犲湪鎵鏈夌殑Slice 瀹氫箟涓嬌鐢ㄥ弻鍖呮嫭錛坉ouble-include錛夊潡錛堟墍涓婏級錛岄槻姝㈠嬈″寘鎷悓涓鏂囦歡銆?
#include 鎸囦護鍙兘鍑虹幇鍦⊿lice 婧愭枃浠剁殑寮澶達(dá)紝涔熷氨鏄錛屽畠浠繀欏誨嚭鐜板湪鍏朵粬鎵鏈塖lice 瀹氫箟鐨勫墠闈€傛澶栵紝鍦ㄤ嬌鐢?include 鎸囦護鏃訛紝鍙厑璁鎬嬌鐢?lt;> 璇硶鏉ユ寚瀹氭枃浠跺悕錛屼笉鑳戒嬌鐢?"銆備緥濡傦細(xì)
#include <File1.ice> // OK #include "File2.ice" // 涓嶆敮鎸?
浣犱笉鑳芥妸榪欎簺棰勫鐞嗘寚浠ょ敤浜庡叾浠栫洰鐨勶紝涔熶笉鑳戒嬌鐢ㄥ叾浠栫殑C++ 棰勫鐞嗘寚浠?錛堟瘮濡傜敤\ 瀛楃鏉ヨ繛鎺ヨ銆乼oken 綺樿創(chuàng)錛屼互鍙婂畯灞曞紑錛岀瓑絳夛級銆?
鍦⊿lice 瀹氫箟閲岋紝鏃㈠彲浠ヤ嬌鐢– 鐨勩佷篃鍙互浣跨敤C++ 鐨勬敞閲婇鏍鹼細(xì)
Slice 鍏抽敭瀛楀繀欏誨皬鍐欍備緥濡傦紝 class 鍜宒ictionary 閮芥槸鍏抽敭瀛楋紝蹇呴』鎸夌収鎵紺烘柟寮忔嫾鍐欍傝繖涓鍒欐湁涓や釜渚嬪錛歄bject 鍜孡ocalObject 涔熸槸鍏抽敭瀛楋紝蹇呴』鎸夌収鎵紺烘柟寮忚棣栧瓧姣嶅ぇ鍐欍?
鏍囪瘑絎︿互涓涓瓧姣嶈搗澶達(dá)紝鍚庨潰鍙互璺熶換鎰忔暟鐩殑瀛楁瘝鎴栨暟瀛椼係lice 鏍囪瘑絎﹁闄愬埗鍦ˋSCII 瀛楃鑼冨洿鍐咃紝涓嶈兘鍖呭惈闈炶嫳璇瓧姣嶏紝涓嶤++ 鏍囪瘑絎︿笉鍚岋紝 Slice 鏍囪瘑絎︿笉鑳芥湁涓嬪垝綰褲傝繖縐嶉檺鍒跺垵鐪嬩笂鍘繪樉寰楀緢鑻涘埢錛屼絾鍗存槸蹇呰鐨勶細(xì)淇濈暀涓嬪垝綰匡紝鍚勭璇█鏄犲皠灝辮幏寰椾簡涓涓悕瀛楃┖闂達(dá)紝涓嶄細(xì)涓庡悎娉曠殑Slice 鏍囪瘑絎﹀彂鐢熷啿紿併備簬鏄紝榪欎釜鍚嶅瓧絀洪棿鍙敤浜庡瓨鏀句粠Slice 鏍囪瘑絎︽淳鐢熺殑鍘熺敓璇█鏍囪瘑絎︼紝鑰屼笉鐢ㄦ媴蹇冨叾浠栧悎娉曠殑Slice 鏍囪瘑絎︿細(xì)紕板閥涓庝箣鐩稿悓錛屼粠鑰屽彂鐢熷啿紿?銆?
鏍囪瘑絎︼紙鍙橀噺鍚嶇瓑絳夛級鏄ぇ灝忓啓涓嶆晱鎰熺殑錛屼絾澶у皬鍐欑殑鎷煎啓鏂瑰紡蹇呴』淇濇寔涓鑷達(dá)紙鐪嬩簡鍚庨潰鐨勮瘽錛屽啀鐞嗚В涓涓嬶級銆備緥濡傦紝鍦ㄤ竴涓綔鐢ㄥ煙鍐咃紝 TimeOfDay 鍜孴IMEOFDAY 琚涓烘槸鍚屼竴涓爣璇嗙銆備絾鏄紝Slice 瑕佹眰浣犱繚鎸佸ぇ灝忓啓鐨勪竴鑷存с傚湪浣犲紩鍏ヤ簡涓涓爣璇嗙涔嬪悗錛屼綘蹇呴』濮嬬粓涓鑷村湴鎷煎啓瀹冪殑澶у啓鍜屽皬鍐欏瓧姣嶏紱鍚﹀垯錛岀紪璇戝櫒灝變細(xì)灝嗗叾瑙嗕負(fù)闈炴硶鑰屽姞浠ユ嫆緇濄傝繖鏉¤鍒欎箣鎵浠ュ瓨鍦紝鏄璁㏒lice 鏃㈣兘鏄犲皠鍒板拷鐣ユ爣璇嗙澶у皬鍐欑殑璇█錛屽張鑳芥槧灝勫埌鎶婂ぇ灝忓啓涓嶅悓鐨勬爣璇嗙褰撲綔涓嶅悓鏍囪瘑絎︾殑璇█銆傦紙鍙互榪欐牱鐞嗚В錛屽彉閲忓悕鍖哄垎澶у皬鍐欙紝騫朵笖涓嶅彲浠ユ槸鐩稿悓鐨勫崟璇嶏級
鏄叧閿瓧鐨勬爣璇嗙:浣犲彲浠ュ畾涔夊湪涓縐嶆垨澶氱瀹炵幇璇█涓槸鍏抽敭瀛楃殑Slice 鏍囪瘑絎︺備緥濡傦紝switch鏄畬鍏ㄥ悎娉曠殑Slice鏍囪瘑絎︼紝浣嗕篃鏄疌++鍜孞ava鐨勫叧閿瓧銆傝璦鏄犲皠瀹氫箟浜嗕竴浜涜鍒欐潵澶勭悊榪欐牱鐨勬爣璇嗙銆傝瑙e喅榪欎釜闂錛岄氬父瑕佺敤涓涓墠緙鏉ヤ嬌鏄犲皠鍚庣殑鏍囪瘑絎︿笉鍐嶆槸鍏抽敭瀛椼備緥濡傦紝 Slice 鏍囪瘑絎witch 琚槧灝勫埌C++ 鐨刜cpp_switch 錛屼互鍙奐ava 鐨刜switch銆傚鍏抽敭瀛楄繘琛屽鐞嗙殑瑙勫垯鍙兘浼?xì)漶旂敓闅句互闃呰潥勬簮鐮併傚儚native銆乼hrow錛屾垨export 榪欐牱鐨勬爣璇嗙浼?xì)涓嶤++ 鎴朖ava錛堟垨涓よ咃級鐨勫叧閿瓧鍙戠敓鍐茬獊銆備負(fù)浜嗚浣犲拰鍒漢鐢熸椿寰楁洿杞繪澗涓鐐癸紝浣犲簲璇ラ伩鍏嶄嬌鐢ㄦ槸瀹炵幇璇█鐨勫叧閿瓧鐨凷lice 鏍囪瘑絎︺傝璁頒綇錛屼互鍚嶪ce 鍙兘浼?xì)澧炲姞闄++ 鍜孞ava 浠ュ鐨勮璦鏄犲皠銆傚敖綆℃湡鏈涗綘鎬葷粨鍑烘墍鏈夋祦琛岀殑緙栫▼璇█鐨勬墍鏈夊叧閿瓧騫朵笉鍚堢悊錛屼綘鑷沖皯搴旇灝介噺閬垮厤浣跨敤甯哥敤鐨勫叧閿瓧銆備嬌鐢ㄥ儚self銆乮mport錛屼互鍙妛hile 榪欐牱鐨勬爣璇嗙鑲畾涓嶆槸濂戒富鎰忋?
杞箟鐨勬爣璇嗙:鍦ㄥ叧閿瓧鐨勫墠闈㈠姞涓婁竴涓弽鏂滅嚎錛屼綘鍙互鎶奡lice 鍏抽敭瀛楃敤浣滄爣璇嗙錛屼緥濡?
struct dictionary { // 閿欒!
// ...
};
struct \dictionary { // OK
// ...
};
鍙嶆枩綰夸細(xì)鏀瑰彉鍏抽敭瀛楅氬父鐨勫惈涔夛紱鍦ㄥ墠闈㈢殑渚嬪瓙涓紝 \dictionary 琚綋浣滄爣璇嗙dictionary銆傝漿涔夋満鍒朵箣鎵浠ュ瓨鍦紝鏄璁╂垜浠湪浠ュ悗鑳藉鍦⊿lice 涓鍔犲叧閿瓧錛屽悓鏃跺敖閲忓噺灝戝宸叉湁瑙勮寖鐨勫獎鍝嶏細(xì)濡傛灉鏌愪釜宸茬粡瀛樺湪鐨勮鑼冪宸т嬌鐢ㄤ簡鏂板紩鍏ョ殑鍏抽敭瀛楋紝浣犲彧闇鍦ㄦ柊鍏抽敭瀛楀墠鍔犱笂鍙嶆枩綰匡紝灝辮兘澶熶慨姝h瑙勮寖銆傛敞鎰忥紝浠庨鏍間笂璇達(dá)紝浣犲簲璇ラ伩鍏嶇敤Slice 鍏抽敭瀛楀仛鏍囪瘑絎︼紙鍗充嬌鍙嶆枩綰胯漿涔夊厑璁鎬綘榪欎箞鍋氾級銆?
淇濈暀鐨勬爣璇嗙:Slice 涓篒ce 瀹炵幇淇濈暀浜嗘爣璇嗙Ice 鍙婁互Ice 錛堜換浣曞ぇ灝忓啓鏂瑰紡錛夎搗澶寸殑鎵鏈夋爣璇嗙銆備緥濡傦紝濡傛灉浣犺瘯鍥懼畾涔変竴涓悕涓篒cecream 鐨勭被鍨嬶紝 Slice 緙栬瘧鍣ㄤ細(xì)鍙戝嚭閿欒璀﹀憡3銆備互涓嬮潰浠諱綍涓縐嶅悗緙緇撳熬鐨凷lice 鏍囪瘑絎︿篃鏄繚鐣欑殑錛欻elper銆丠older銆丳rx錛屼互鍙奝tr銆侸ava 鍜孋++ 璇█鏄犲皠浣跨敤浜嗚繖浜涘悗緙錛屼繚鐣欏畠浠槸涓轟簡闃叉鍦ㄧ敓鎴愮殑浠g爜涓彂鐢熷啿紿併?
錛堟敞錛欼CE 1.3鐨勪腑鏂囨墜鍐屼笂娌℃湁鈥滄ā鍧椻濊繖涓閮ㄥ垎錛夋ā鍧楁潵緇勭粐涓緇勭浉鍏崇殑璇彞鏄負(fù)浜嗚В鍐沖悕瀛楀啿紿併傛ā鍧楀彲浠ュ寘鍚墍鏈夊悎娉曠殑Slice璇彞鍜屽瓙妯″潡銆備綘鍙互鐢ㄤ竴浜涗笉甯哥敤鐨勮瘝鏉ョ粰鏈澶栧眰鐨勬ā鍧楀懡鍚嶏紝姣斿鍏徃鍚嶃佷駭鍝佸悕絳夌瓑銆?
module ZeroC {
module Client {
// Definitions here...
};
module Server {
// Definitions here...
};
};
Slice瑕佹眰鎵鏈夌殑瀹氫箟閮芥槸妯″潡鐨勪竴閮ㄥ垎錛屾瘮濡傦紝涓嬮潰鐨勮鍙ュ氨鏄潪娉曠殑銆?
interface I { // 閿欒:鍏ㄥ眬絀洪棿涓彧鍙互鏈夋ā鍧?
// ...
};
澶氫釜鏂囦歡鍙互鍏變韓鍚屼竴涓ā鍧楋紝姣斿錛?
module ZeroC {
// Definitions here...
};
//鍙︿竴涓枃浠朵腑 :
module ZeroC { // OK, reopened module
// More definitions here...
};
鎶婁竴涓ぇ鐨勬ā鍧楁斁鍒板嚑涓枃浠朵腑鍘誨彲浠ユ柟渚跨紪璇戯紙浣犲彧闇閲嶆柊緙栬瘧琚慨鏀圭殑鏂囦歡錛岃屾病鏈夊繀瑕佺紪璇戞暣涓ā鍧楋級銆?
妯″潡灝嗘槧灝勭殑璇█涓殑鐩稿簲緇撴瀯錛屾瘮濡?C++, C#, 鍜?Visual Basic, Slice鐨刴odules琚槧灝勪負(fù)namespaces錛沯ava涓鏄犲皠涓簆ackage.
闄や簡灝戞暟涓庣壒瀹氱殑紼嬪簭璇█鐩稿叧鐨勮皟鐢ㄤ箣澶栵紝ice鐨勭粷澶ч儴鍒咥PI錛堝簲鐢ㄧ▼搴忔帴鍙o級閮芥槸鐢⊿lice鏉ュ畾涔夌殑 銆傝繖鏍峰仛鐨勫ソ澶勬槸鍙互鐢ㄤ竴涓狪CE API瀹氫箟鏂囦歡鏉ユ敮鎸佹墍鏈夌殑紼嬪簭璇█銆?
![]() |
娉ㄦ剰 |
|---|---|
| 涓轟簡淇濊瘉浠g爜鐨勭畝媧侊紝浠ュ悗鏂囩珷涓彁鍙婄殑Slice瀹氫箟娌℃湁鍐欏嚭鍖呭惈鐨勬ā鍧楋紝浣犺鍋囧畾璇ヨ鍙ユ槸鍦ㄤ竴涓ā鍧椾腑銆? |
鏋氫婦:enum Fruit { Apple, Pear, Orange };
榪欎釜瀹氫箟寮曞叆浜嗕竴縐嶅悕涓篎ruit 鐨勭被鍨嬶紝榪欐槸涓縐嶆嫢鏈夎嚜宸辨潈鍒╃殑鏂扮被鍨嬨傚叧浜庢庢牱鎶婇『搴忓鹼紙ordinal values錛夎祴緇欐灇涓劇鐨勯棶棰橈紝 Slice 娌℃湁浣滃嚭瀹氫箟銆備緥濡傦紝浣犱笉鑳藉亣瀹氾紝鍦ㄥ悇縐嶅疄鐜拌璦涓紝鏋氫婦絎range 鐨勫奸兘鏄?銆係lice 淇濊瘉鏋氫婦絎︾殑欏哄簭鍊間細(xì)浠庡乏鑷沖彸閫掑錛屾墍浠ュ湪鎵鏈夊疄鐜拌璦涓紝Apple 閮芥瘮Pear 瑕佸皬銆備笌C++ 涓嶅悓錛?Slice 涓嶅厑璁鎬綘鎺у埗鏋氫婦絎︾殑欏哄簭鍊鹼紙鍥犱負(fù)璁稿瀹炵幇璇█涓嶆敮鎸佽繖縐嶇壒鎬э級錛?
enum Fruit { Apple = 0, Pear = 7, Orange = 2 }; // 鍑洪敊
鍦ㄥ疄璺典腑錛屽彧瑕佷綘涓嶅湪鍦板潃絀洪棿涔嬮棿浼犻佹灇涓劇鐨勯『搴忓鹼紝浣犲氨涓嶇敤綆℃灇涓劇浣跨敤鐨勫兼槸澶氬皯銆備緥濡傦紝鍙戦佸? 緇欐湇鍔″櫒鏉ヨ〃紺篈pple 鍙兘浼?xì)閫犳垚闂錛屽洜涓烘湇鍔″櫒鍙兘娌℃湁鐢? 琛ㄧずApple銆傜浉鍙嶏紝浣犲簲璇ュ氨鍙戦佸糀pple 鏈韓銆傚鏋滃湪鎺ユ敹鏂圭殑鍦板潃絀洪棿涓紝 Apple 鏄敤鍙﹀鐨勯『搴忓艱〃紺虹殑錛?Ice run time 浼?xì)閫傚綋鍦扮炕璇戣繖涓箋?
涓庡湪C++ 閲屼竴鏍鳳紝 Slice 鏋氫婦絎︿篃浼?xì)杩涘叆鍥淳l曞畠鐨勫悕瀛楃┖闂達(dá)紝鎵浠ヤ笅闈㈢殑瀹氫箟鏄潪娉曠殑錛?
enum Fruit { Apple, Pear, Orange };
enum ComputerBrands { Apple, IBM, Sun, HP }; // Apple宸茬粡琚畾涔?
Slice 涓嶅厑璁稿畾涔夌┖鐨勬灇涓俱?
緇撴瀯
Slice 鏀寔鍚湁涓涓垨澶氫釜鏈夊悕縐扮殑鎴愬憳鐨勭粨鏋勶紝榪欎簺鎴愬憳鍙互鍏鋒湁浠繪剰綾誨瀷錛屽寘鎷敤鎴峰畾涔夌殑澶嶆潅綾誨瀷銆備緥濡傦細(xì)struct TimeOfDay {
short hour; // 0 - 23
short minute; // 0 - 59
short second; // 0 - 59
};
涓庡湪 C++ 閲屼竴鏍鳳紝榪欎釜瀹氫箟寮曞叆浜嗕竴縐嶅彨浣淭imeOfDay 鐨勬柊綾誨瀷銆傜粨鏋勫畾涔変細(xì)褰㈡垚鍚嶅瓧絀洪棿錛屾墍浠ョ粨鏋勬垚鍛樼殑鍚嶅瓧鍙渶鍦ㄥ洿緇曞畠浠殑緇撴瀯閲屾槸鍞竴鐨勩傚湪緇撴瀯鍐呴儴錛屽彧鑳藉嚭鐜版暟鎹垚鍛樺畾涔夛紝榪欎簺瀹氫箟蹇呴』浣跨敤鏈夊悕瀛楃殑綾誨瀷銆備緥濡傦紝浣犱笉鍙兘鍦ㄧ粨鏋勫唴瀹氫箟緇撴瀯錛?struct TwoPoints {
struct Point { //閿欒!
short x;
short y;
};
Point coord1;
Point coord2;
};
榪欎釜瑙勫垯澶т綋涓婇傜敤浜嶴lice錛氱被鍨嬪畾涔変笉鑳藉祵濂楋紙闄や簡妯″潡鏀寔宓屽錛夈傚叾鍘熷洜鏄紝瀵逛簬鏌愪簺鐩爣璇█鑰岃█錛屽祵濂楃殑綾誨瀷瀹氫箟鍙兘浼?xì)闅句互瀹炵帋图岃屼笖錛屽嵆浣胯兘澶熷疄鐜幫紝涔熶細(xì)鏋佸ぇ鍦頒嬌浣滅敤鍩熻В鏋愯鍒欏鏉傚寲銆傚浜庡儚Slice 榪欐牱鐨勮鑼冭璦鑰岃█錛屽祵濂楃殑綾誨瀷瀹氫箟騫舵棤蹇呰鈥斺斾綘鎬昏兘浠ヤ笅闈㈢殑鏂瑰紡緙栧啓涓婇潰鐨勫畾涔夛紙榪欑鏂瑰紡鍦ㄩ鏍間笂涔熸洿鍔犳暣媧侊級錛?struct Point {
short x;
short y;
};
struct TwoPoints { // Legal (and cleaner!)
Point coord1;
Point coord2;
}
搴忓垪
搴忓垪鏄彉闀跨殑鍏冪礌鍚戦噺錛?
sequence<Fruit> FruitPlatter;搴忓垪鍙互鏄┖鐨勨斺斾篃灝辨槸璇達(dá)紝瀹冨彲浠ヤ笉鍖呭惈鍏冪礌錛涘畠涔熷彲浠ユ寔鏈変換鎰忔暟閲忕殑鍏冪礌錛岀洿鍒拌揪鍒頒綘鐨勫鉤鍙扮殑鍐呭瓨闄愬埗銆? 搴忓垪鍖呭惈鐨勫厓绱犺嚜韜篃鍙互鏄簭鍒椼傝繖縐嶈璁′嬌寰椾綘鑳藉鍒涘緩鍒楄〃鐨勫垪琛細(xì)
sequence<FruitPlatter> FruitBanquet;
搴忓垪鍙敤浜庢瀯寤鴻澶氱collection錛屾瘮濡傚悜閲忋佸垪琛ㄣ侀槦鍒椼侀泦鍚堛佸寘錛坆ag錛夛紝鎴栨槸鏍?wèi)锛垕啤搴忔槸鍚﹂噸瑕佽鐢卞簲鐢ㄥ啗_畾錛涘鏋滄棤瑙嗘搴忥紝搴忓垪鍏呭綋鐨勫氨鏄泦鍚堝拰鍖咃級銆?
搴忓垪鐨勪竴縐嶇壒鍒殑鐢ㄦ硶宸茬粡鎴愪簡鎯敤鎵嬫硶錛屽嵆鐢ㄥ簭鍒楁潵琛ㄧず鍙夌殑鍊箋備緥濡傦紝鎴戜滑鍙兘鎷ユ湁涓涓狿art 緇撴瀯錛岀敤浜庤褰曞皬姹借濺鐨勯浂浠剁殑璇︾粏璧勬枡銆傝繖涓粨鏋勫彲浠ヨ褰曡繖鏍風(fēng)殑璧勬枡錛氶浂浠跺悕縐般佹弿榪般侀噸閲忋佷環(huán)鏍鹼紝浠ュ強鍏朵粬璇︾粏璧勬枡銆?澶囦歡閫氬父閮芥湁搴忓垪鍙鳳紝鎴戜滑鐢ㄤ竴涓猯ong 鍊艱〃紺恒備絾鏈変簺闆朵歡錛屾瘮濡傚父鐢ㄧ殑铻轟笣閽夛紝甯稿父娌℃湁搴忓垪鍙鳳紝閭d箞鎴戜滑鍦ㄨ灪涓濋拤鐨勫簭鍒楀彿瀛楁閲岃鏀捐繘浠涔堝唴瀹癸紵瑕佸鐞嗚繖縐嶆儏鍐碉紝鏈夎繖鏍蜂竴浜涢夋嫨錛?
鐢ㄤ竴涓爣璁板鹼紝姣斿闆訛紝鏉ユ寚紺衡滄病鏈夊簭鍒楀彿鈥濈殑鎯呭喌銆?
榪欑鏂規(guī)硶鏄彲琛岀殑錛屽彧瑕佺‘瀹炴湁鏍囪鍊煎彲鐢ㄣ傚敖綆$湅璧鋒潵涓嶅ぇ鍙兘鏈変漢鎶婇浂鐢ㄤ綔闆朵歡鐨勫簭鍒楀彿錛岃繖騫墮潪鏄笉鍙兘鐨勩傝屼笖錛屽浜庡叾浠栫殑鍊鹼紝姣斿娓╁害鍊鹼紝鍦ㄥ叾綾誨瀷鐨勮寖鍥翠腑鐨勬墍鏈夊奸兘鍙兘鏄悎娉曠殑錛屽洜鑰屾病鏈夋爣璁板煎彲鐢ㄣ?
鎶婂簭鍒楀彿鐨勭被鍨嬩粠long 鍙樻垚string銆?
涓茶嚜宸辨湁鍐呭緩鐨勬爣璁板鹼紝涔熷氨鏄┖涓詫紝鎵浠ユ垜浠彲浠ョ敤絀轟覆鏉ユ寚紺?鈥滄病鏈夊簭鍒楀彿鈥濈殑鎯呭喌銆傝繖涔熸槸鍙鐨勶紝浣嗗嵈浼?xì)璁╁ぇ澶氭曨C漢鎰熷埌涓嶅揩錛氭垜浠笉搴旇涓轟簡寰楀埌涓涓爣璁板鹼紝鑰屾妸鏌愮浜嬬墿鑷劧鐨勬暟鎹被鍨嬪彉鎴恠tring
澧炲姞涓涓寚紺虹鏉ユ寚紺哄簭鍒楀彿鐨勫唴瀹規(guī)槸鍚︽湁鏁?
struct Part {
string name;
string description;
// ...
bool serialIsValid; // true if part has serial number
long serialNumber;
};
瀵逛簬澶у鏁頒漢鑰岃█錛岃繖涔熻浜鴻鍘岋紝鑰屼笖鏈緇堣偗瀹氫細(xì)璁╀綘閬囧埌楹葷儲錛氳繜鏃╀細(xì)鏈夌▼搴忓憳蹇樿鍦ㄤ嬌鐢ㄥ簭鍒楀彿涔嬪墠媯鏌ュ畠鏄惁鏈夋晥錛屼粠鑰屽甫鏉ョ伨闅炬х殑鍚庢灉銆?
鐢ㄥ簭鍒楁潵寤虹珛鍙夊瓧孌?
榪欑鎶鏈嬌鐢ㄤ簡涓嬮潰鐨勬儻鐢ㄦ墜娉曪細(xì)
sequence<long> SerialOpt;
struct Part {
string name;
string description;
// ...
SerialOpt serialNumber; // optional: zero or one element
};
鎸夌収鎯緥錛?Opt 鍚庣紑琛ㄧず榪欎釜搴忓垪鏄敤鏉ュ緩绔嬪彲閫夊肩殑銆傚鏋滃簭鍒楁槸絀虹殑錛屽兼樉鐒跺氨涓嶅湪閭i噷錛涘鏋滃畠鍚湁涓涓厓绱狅紝榪欎釜鍏冪礌灝辨槸閭d釜鍊箋傝繖縐嶆柟妗堟槑鏄劇殑緙虹偣鏄紝鏈変漢鍙兘浼?xì)鎶婁笉姝竴涓厓绱犳斁鍏ュ簭鍒椼備負(fù)鍙夊煎鍔犱竴涓笓鐢ㄧ殑Slice 鎴愬垎鍙互綰犳榪欎釜闂銆備絾鍙夊煎茍闈為偅涔堝父鐢紝涓嶅煎緱涓哄畠澧炲姞涓縐嶄笓闂ㄧ殑璇█鐗規(guī)э紙鎴戜滑灝嗙湅鍒幫紝浣犺繕鍙互鐢ㄧ被灞傛鏉ュ緩绔嬪彲閫夊瓧孌碉級銆?
璇嶅吀
璇嶅吀鏄粠閿被鍨嬪埌鍊肩被鍨嬬殑鏄犲皠銆備緥濡傦細(xì)
struct Employee {
long number;
string firstName;
string lastName;
};
dictionary<long, Employee> EmployeeMap;
榪欎釜瀹氫箟鍒涘緩涓縐嶅彨浣淓mployeeMap 鐨勮瘝鍏革紝鎶婇泧鍛樺彿鏄犲皠鍒板惈鏈夐泧鍛樿緇嗚祫鏂欑殑緇撴瀯銆備綘鍙互鑷鍐沖畾閿被鍨嬶紙鍦ㄨ繖涓緥瀛愪腑鏄痩ong 綾誨瀷鐨勯泧鍛樺彿錛夋槸鍚︽槸鍊肩被鍨嬶紙鍦ㄨ繖涓緥瀛愪腑鏄疎mployee 緇撴瀯錛夌殑涓閮ㄥ垎鈥斺斿氨Slice 鑰岃█錛屼綘鏃犻渶璁╅敭鎴愪負(fù)鍊肩殑涓閮ㄥ垎銆?
璇嶅吀鍙敤浜庡疄鐜扮█鐤忔暟緇勶紝鎴栨槸鍏鋒湁闈炴暣鏁伴敭綾誨瀷鐨勪換浣曠敤浜庢煡鎵劇殑鏁版嵁緇撴瀯銆傚敖綆″惈鏈夐敭錛嶅煎鐨勭粨鏋勭殑搴忓垪鍙敤浜庡垱寤哄悓鏍風(fēng)殑浜嬬墿錛岃瘝鍏歌鏇翠負(fù)閫傚疁錛?
璇嶅吀鏄庣‘鍦拌〃杈句簡璁捐鑰呯殑鎰忓浘錛屼篃灝辨槸錛屾彁渚涗粠鍊肩殑鍩燂紙domain錛夊埌鍊肩殑鑼冨洿錛坮ange錛夌殑鏄犲皠錛堝惈鏈夐敭錛嶅煎鐨勭粨鏋勭殑搴忓垪娌℃湁濡傛鏄庣‘鍦拌〃杈懼悓鏍風(fēng)殑鎰忓浘錛夈?
鍦ㄧ紪紼嬭璦涓綰э紝搴忓垪琚疄鐜版垚鍚戦噺錛堜篃鍙兘鏄垪琛級錛屼篃灝辨槸璇達(dá)紝搴忓垪涓嶅ぇ閫傜敤浜庡唴瀹圭█鐤忕殑鍩燂紝鑰屼笖瑕佸畾浣嶅叿鏈夌壒瀹氬肩殑鍏冪礌錛岄渶瑕佽繘琛岀嚎鎬ф煡鎵俱傝岃瘝鍏歌瀹炵幇鎴愭敮鎸侀珮鏁堟煡鎵劇殑鏁版嵁緇撴瀯錛堥氬父鏄搱甯岃〃鎴栫孩榛戞爲(wèi)錛夛紝鍏跺鉤鍧囨煡鎵炬椂闂存槸O(log n)錛屾垨鑰呮洿濂姐傝瘝鍏哥殑閿被鍨嬫棤闇涓烘暣鍨嬨備緥濡傦紝鎴戜滑鍙互鐢ㄤ笅闈㈢殑瀹氫箟鏉ョ炕璇戜竴鍛ㄦ瘡涓澶╃殑鍚嶇О錛?
dictionary<string, string> WeekdaysEnglishToGerman;
鏈嶅姟鍣ㄥ疄鐜板彲浠ョ敤閿紞鍊煎Monday鈥揗ontag銆乀uesday鈥揇ienstag錛岀瓑絳夛紝瀵硅繖涓槧灝勮〃榪涜鍒濆鍖栥?
璇嶅吀鐨勫肩被鍨嬪彲浠ユ槸鐢ㄦ埛瀹氫箟鐨勪換浣曠被鍨嬨備絾璇嶅吀鐨勯敭綾誨瀷鍙兘鏄互涓嬬被鍨嬩箣涓錛?
鏁村瀷錛坆yte銆乻hort銆乮nt銆乴ong銆乥ool錛屼互鍙婃灇涓劇被鍨嬶級
string
鍏冪礌綾誨瀷涓烘暣鍨嬫垨string 鐨勫簭鍒?
鏁版嵁鎴愬憳鐨勭被鍨嬪彧鏈夋暣鍨嬫垨string 鐨勭粨鏋?
澶嶆潅鐨勫祵濂楃被鍨嬶紝姣斿宓屽鐨勭粨鏋勬垨璇嶅吀錛屼互鍙婃誕鐐圭被鍨嬶紙float鍜宒ouble錛夛紝涓嶈兘鐢ㄤ綔閿被鍨嬨備箣鎵浠ヤ笉鍏佽浣跨敤澶嶆潅鐨勫祵濂楃被鍨嬶紝鏄洜涓鴻繖浼?xì)鋴设瘝鍏哥殑璇a鏄犲皠澶嶆潅鍖栵紱涓嶅厑璁鎬嬌鐢ㄦ誕鐐圭被鍨嬶紝鏄洜涓烘誕鐐瑰煎湪璺ㄨ秺鏈哄櫒鐣岀嚎鏃訛紝鍏惰〃紺轟細(xì)鍙戠敓鍙樺寲錛屾湁鍙兘瀵艱嚧鎴愰棶棰樼殑鐩哥瓑璇箟銆?
甯擱噺瀹氫箟涓庣洿鎺ラ噺
Slice 鍏佽浣犲畾涔夊父閲忋傚父閲忓畾涔夌殑綾誨瀷蹇呴』鏄互涓嬬被鍨嬩腑鐨勪竴縐嶏細(xì)
鏁村瀷錛坆ool銆乥yte銆乻hort銆乮nt銆乴ong錛屾垨鏋氫婦綾誨瀷錛?
float 鎴杁ouble
string
涓嬮潰鏈変竴浜涗緥瀛愶細(xì)
const bool AppendByDefault = true;
const byte LowerNibble = 0x0f;
const string Advice = "Don't Panic!";
const short TheAnswer = 42;
const double PI = 3.1416;
enum Fruit { Apple, Pear, Orange };
const Fruit FavoriteFruit = Pear;
鐩存帴閲忥紙literals錛夌殑璇硶涓嶤++ 鍜孞ava 鐨勪竴鏍鳳紙鏈変竴浜涘皬鐨勪緥澶栵級錛?
甯冨皵甯擱噺鍙兘鐢ㄥ叧閿瓧false鍜宼rue鍒濆鍖栵紙浣犱笉鑳界敤0鍜?鏉ヨ〃紺篺alse鍜宼rue錛夈?
鍜孋++ 涓鏍鳳紝浣犲彲浠ョ敤鍗佽繘鍒躲佸叓榪涘埗錛屾垨鍗佸叚榪涘埗鏂瑰紡鏉ユ寚瀹氭暣鏁扮洿鎺ラ噺銆備緥濡傦細(xì)
const byte TheAnswer = 42; const byte TheAnswerInOctal = 052; const byte TheAnswerInHex = 0x2A; // or 0x2a
![]() |
娉ㄦ剰 |
|---|---|
| 濡傛灉浣犳妸byte 瑙i噴鎴愭暟瀛椼佽屼笉鏄綅妯″紡錛屼綘鍦ㄤ笉鍚岀殑璇█閲屽彲鑳戒細(xì)寰楀埌涓嶅悓鐨勭粨鏋溿備緥濡傦紝鍦–++ 閲岋紝 byte 鏄犲皠鍒癱har錛屽彇鍐充簬鐩爣騫沖彴錛?char 鍙兘鏄湁絎﹀彿鐨勶紝涔熷彲鑳芥槸鏃犵鍙風(fēng)殑銆?/TD> |
![]() |
娉ㄦ剰 |
|---|---|
鐢ㄤ簬鎸囩ず闀垮父閲忓拰鏃犵鍙峰父閲忕殑鍚庣紑錛圕++ 浣跨敤鐨刲銆丩銆乽銆乁錛夋槸闈炴硶鐨勶細(xì) const long Wrong = 0u; // Syntax error const long WrongToo = 1000000L; // Syntax error |
鏁存暟鐩存帴閲忕殑鍊煎繀欏昏惤鍦ㄥ叾甯擱噺綾誨瀷鐨勮寖鍥村唴錛屽惁鍒欑紪璇戝櫒灝變細(xì)鍙戝嚭璇婃柇娑堟伅銆?
嫻偣鐩存帴閲忎嬌鐢ㄧ殑鏄疌++璇硶錛岄櫎浜嗕綘涓嶈兘鐢╨鎴朙鍚庣紑鏉ヨ〃紺烘墿灞曠殑嫻偣甯擱噺錛涗絾鏄紝 f 鍜孎 鏄悎娉曠殑錛堜絾浼?xì)琚拷鐣ュQ夈備笅闈㈡槸涓浜涗緥瀛愶細(xì)
const float P1 = -3.14f; // Integer & fraction, with suffix const float P2 = +3.1e-3; // Integer, fraction, and exponent const float P3 = .1; // Fraction part only const float P4 = 1.; // Integer part only const float P5 = .9E5; // Fraction part and exponent const float P6 = 5e2; // Integer part and exponent
嫻偣鐩存帴閲忓繀欏昏惤鍦ㄥ叾甯擱噺綾誨瀷錛坒loat 鎴杁ouble錛夌殑鑼冨洿鍐咃紱鍚﹀垯緙栬瘧鍣ㄤ細(xì)鍙戝嚭璇婃柇璀﹀憡銆?
涓茬洿鎺ラ噺鏀寔涓嶤++ 鐩稿悓鐨勮漿涔夊簭鍒椼備笅闈㈡槸涓浜涗緥瀛愶細(xì)
const string AnOrdinaryString = "Hello World!"; const string DoubleQuote = "\""; const string TwoSingleQuotes = "'\'"; // ' and \' are OK const string Newline = "\n"; const string CarriageReturn = "\r"; const string HorizontalTab = "\t"; const string VerticalTab = "\v"; const string FormFeed = "\f"; const string Alert = "\a"; const string Backspace = "\b"; const string QuestionMark = "\?"; const string Backslash = "\\"; 70 Slice 璇█ const string OctalEscape = "\007"; // Same as \a const string HexEscape = "\x07"; // Ditto const string UniversalCharName = "\u03A9"; // Greek Omega 鍜屽湪 C++ 閲屼竴鏍鳳紝鐩擱偦鐨勪覆鐩存帴閲忎細(xì)榪炴帴璧鋒潵錛? const string MSG1 = "Hello World!"; const string MSG2 = "Hello" " " "World!"; // Same message /* * Escape sequences are processed before concatenation, * so the string below contains two characters, * '\xa' and 'c'. */ const string S = "\xa" "c";
![]() |
娉ㄦ剰 |
|---|---|
Slice 娌℃湁null 涓茬殑姒傚康 const string nullString = 0; // Illegal!null 涓插湪Slice 閲屾牴鏈笉瀛樺湪錛屽洜姝わ紝鍦↖ce 騫沖彴鐨勪換浣曞湴鏂瑰畠閮戒笉鑳界敤浣滃悎娉曠殑涓插箋傝繖涓鍐沖畾鐨勫師鍥犳槸錛?null 涓插湪璁稿緙栫▼璇█閲屼笉瀛樺湪 |
榪欎竴鑺傚ぇ閮ㄥ垎鍐呭鏁寸悊鑷狪CE涓枃鎵嬪唽錛屽湪榪欓噷鎴戠壒鍒劅璋㈤┈緇磋揪鍚屽織鐨勭炕璇戠粰鎴戜滑鐨勫涔?fàn)甯︽潵浜嗘柟渚裤?
璇繪湇鍔$浠g爜
鏂囦歡server.cpp.
#include <Ice/Ice.h>
#include "../print.h"
using namespace std;
using namespace Demo;
//鎯緥錛岀敤鍚庣紑I 琛ㄧず榪欎釜綾誨疄鐜頒竴涓帴鍙?
class PrinterI : public Printer {
public:
virtual void printString(const string& s, const Ice::Current&);
};
/*
鎵撳紑print.h錛岀湅鐪婸rinterI鐖剁被鐨勫畾涔?
namespace Demo {
class Printer : virtual public Ice::Object {
public:
//綰櫄鍑芥暟錛屼笉鑳藉疄渚嬪寲
virtual void printString(const std::string&,
//絎簩涓弬鏁版湁緙虹渷鍊鹼紝瀹炵幇涓彲浠ヤ笉浣跨敤
const Ice::Current&= Ice::Current()) = 0;
};
};
*/
void PrinterI::printString(const string& s, const Ice::Current&)
{
cout << s << endl;
}
int main(int argc, char* argv[])
{
//紼嬪簭鐨勯鍑烘椂鐨勭姸鎬侊紝灝辨槸鍚︽垚鍔熸墽琛?
int status = 0;
//鏉ュ寘鍚獻ce run time 鐨勪富鍙ユ焺 (main handle)
Ice::CommunicatorPtr ic;
try {
//鍒濆鍖朓ce run time 錛坅rgc鍜宎rgv鏄痳un time鍛戒護鍙傛暟錛?
//灝辮繖涓緥瀛愯岃█錛屾湇鍔″櫒涓嶉渶瑕佷換浣曞懡浠よ鍙傛暟錛夈?
//initialize 榪斿洖涓涓寚鍚慖ce::Communicator瀵硅薄鐨勬櫤鑳芥寚閽堬紝
//榪欎釜鎸囬拡鏄疘ce run time 鐨勪富鍙ユ焺銆?
ic = Ice::initialize(argc, argv);
//璋冪敤Communicator 瀹炰緥涓婄殑createObjectAdapterWithEndpoints錛?
//鍒涘緩涓涓璞¢傞厤鍣?姣斿錛氱綉鍗″氨鏄竴縐嶉傞厤鍣?銆?
//鍙傛暟鏄?SimplePrinterAdapter" 錛堥傞厤鍣ㄧ殑鍚嶅瓧錛?
//鍜?default -p 10000"(鐢ㄧ己鐪佸崗璁紙TCP/IP錛?渚﹀惉绔彛10000 鐨勮姹傘?
//鏄劇劧錛屽湪搴旂敤涓‖緙栫爜瀵硅薄鏍囪瘑鍜岀鍙e彿錛屾槸涓縐嶇碂緋曠殑鍋氭硶錛?
//浣嗗畠鐩墠寰堟湁鏁堬紱鎴戜滑灝嗗湪浠ュ悗鐪嬪埌鍦ㄦ灦鏋勪笂鏇村姞鍚堢悊鐨勫仛娉曘?
Ice::ObjectAdapterPtr adapter
= ic->createObjectAdapterWithEndpoints(
"SimplePrinterAdapter", "default -p 10000");
//鏈嶅姟鍣ㄧrun time 宸茬粡鍒濆鍖?瀹炰緥鍖栦竴涓狿rinterI 瀵硅薄錛?
//涓烘垜浠殑Printer 鎺ュ彛鍒涘緩涓涓猻ervant錛坰erv 鏈嶅姟錛?ant浜?鑳屼竴涓嬪崟璇嶏級銆?
Ice::ObjectPtr object = new PrinterI;
//鎴戜滑璋冪敤閫傞厤鍣ㄧ殑add錛屽憡璇夊畠鏈変簡涓涓柊鐨剆ervant 錛?
//浼犵粰add 鐨勫弬鏁版槸鍒氭墠瀹炰緥鍖栫殑servant錛屽啀鍔犱笂涓涓爣璇嗙銆?
//鍦ㄨ繖閲岋紝"SimplePrinter" 涓叉槸servant 鐨勫悕瀛?
//錛堝鏋滄垜浠湁澶氫釜鎵撳嵃鏈猴紝姣忎釜鎵撳嵃鏈洪兘鍙互鏈変笉鍚岀殑鍚嶅瓧錛?
//鏇存紜殑璇存硶鏄紝閮芥湁涓嶅悓鐨勫璞℃爣璇嗭級銆?
adapter->add(object,
Ice::stringToIdentity("SimplePrinter"));
//璋冪敤閫傞厤鍣ㄧ殑activate 鏂規(guī)硶嬋媧婚傞厤鍣?
//錛堥傞厤鍣ㄤ竴寮濮嬫槸鍦ㄦ殏鍋滐紙holding錛夌姸鎬佸垱寤虹殑錛?
//榪欑鍋氭硶鍦ㄤ笅闈㈣繖鏍風(fēng)殑鎯呭喌涓嬪緢鏈夌敤錛?
//鎴戜滑鏈夊涓猻ervant錛屽畠浠叡浜悓涓涓傞厤鍣紝
//鑰屽湪鎵鏈塻ervant瀹炰緥鍖栦箣鍓嶆垜浠笉鎯沖鐞嗚姹傦級銆?
//涓鏃﹂傞厤鍣ㄨ嬋媧伙紝鏈嶅姟鍣ㄥ氨浼?xì)寮濮嬪鐞嗘潵鑷鎴風(fēng)殑璇鋒眰銆?
adapter->activate();
//鏈鍚庯紝鎴戜滑璋冪敤waitForShutdown銆?
//榪欎釜鏂規(guī)硶鎸傝搗鍙戝嚭璋冪敤鐨勭嚎紼嬬洿鍒版湇鍔″櫒瀹炵幇緇堟
//鈥斺旀垨鑰呮槸閫氳繃鍙戝嚭涓涓皟鐢ㄥ叧闂璻un time錛?
ic->waitForShutdown();
}
catch (const Ice::Exception& e) {
cerr << e << endl;
status = 1;
} catch (const char* msg) {
cerr << msg << endl;
status = 1;
}
if (ic) {
try {
//蹇呴』璋冪敤Communicator::destroy緇撴潫Ice run time銆?
//destroy 浼?xì)绛夊緟鋼Q浣曡繕鍦ㄨ繍琛岀殑鎿嶄綔璋冪敤瀹屾垚銆?
//姝ゅ錛?destroy 榪樹細(xì)紜繚浠諱綍榪樻湭瀹屾垚鐨勭嚎紼嬮兘寰椾互姹囧悎錛坖oined錛夛紝
//騫舵敹鍥炰竴浜涙搷浣滅郴緇熻祫婧愶紝姣斿鏂囦歡鎻忚堪絎﹀拰鍐呭瓨銆?
//鍐充笉瑕佽浣犵殑main 鍑芥暟涓嶈皟鐢╠estroy 灝辯粓姝?
//鍚﹀垯錛屽悗鏋滄棤娉曟兂璞°?
ic->destroy();
} catch (const Ice::Exception& e) {
cerr << e << endl;
status = 1;
}
}
return status;
}
娉ㄦ剰錛屽敖綆′互涓婄殑浠g爜涓嶇畻灝戯紝浣嗗畠浠鎵鏈夌殑鏈嶅姟鍣ㄩ兘鏄竴鏍風(fēng)殑銆備綘鍙互鎶婅繖浜涗唬鐮佹斁鍦ㄤ竴涓緟鍔╃被閲岋紝鐒跺悗灝辨棤闇鍐嶄負(fù)瀹冭垂蹇冧簡錛圛ce 鎻愪緵浜嗚繖鏍風(fēng)殑杈呭姪綾伙紝鍙綔Ice::Application錛屽弬瑙?10.3.1 鑺傦級 銆傚氨瀹為檯鐨勫簲鐢ㄤ唬鐮佽岃█錛屾湇鍔″櫒鍙湁鍑犺浠g爜錛氬叚琛屼唬鐮佸畾涔塒rinterI 綾伙紝鍐嶅姞涓婁笁2 琛屼唬鐮佸疄渚嬪寲涓涓狿rinterI 瀵硅薄錛屽茍鍚戝璞¢傞厤鍣ㄦ敞鍐屽畠銆?
璇誨鎴風(fēng)浠g爜
鏂囦歡client.cpp.
#include <Ice/Ice.h>
#include "..\print.h"
using namespace std;
using namespace Demo;
int main(int argc, char* argv[])
{
int status = 0;
Ice::CommunicatorPtr ic;
try {
ic = Ice::initialize(argc, argv);
//stringToProxy 榪斿洖鐨勪唬鐞嗭紙Proxy錛夌被鍨嬫槸Ice::ObjectPrx錛?
//榪欑綾誨瀷浣嶄簬鎺ュ彛鍜岀被鐨勭戶鎵挎爲(wèi)鐨勬牴閮紙鎺ュ彛鐨勫熀綾伙級銆?
Ice::ObjectPrx base
=ic->stringToProxy( "SimplePrinter:default -p 10000");
//浣嗚瀹為檯瑕佷笌鎴戜滑鐨勬墦鍗版満浜よ皥錛?
//鎴戜滑闇瑕佺殑鏄疨rinter 鎺ュ彛銆佷笉鏄疧bject 鎺ュ彛鐨勪唬鐞嗐?
//涓烘錛岄渶瑕佽皟鐢≒rinterPrx::checkedCast 榪涜鍚戜笅杞崲錛堝悜涓嬭漿鍨嬶級銆?
//榪欎釜鏂規(guī)硶浼?xì)鍙戦佷竴鏉℃秷鎭粰鏈嶅姟鍣紝
//璇㈤棶鈥滆繖鏄疨rinter 鎺ュ彛鐨勪唬鐞嗗悧錛熲?
//濡傛灉鍥炵瓟鈥滄槸鈥濓紝灝變細(xì)榪斿洖Printer 鐨勪竴涓唬鐞嗭紱
//濡傛灉浠g悊浠h〃鐨勬槸鍏朵粬綾誨瀷鐨勬帴鍙o紝榪斿洖涓涓┖浠g悊
PrinterPrx printer = PrinterPrx::checkedCast(base);
//嫻嬭瘯鍚戜笅杞瀷鏄惁鎴愬姛錛岃嫢涓嶆垚鍔燂紝灝辨姏鍑哄嚭閿欐秷鎭茍緇堟瀹㈡埛銆?
if (!printer) throw "Invalid proxy";
//鐜板湪錛屾垜浠湪鎴戜滑鐨勫湴鍧絀洪棿閲屾湁浜嗕竴涓縺媧葷殑浠g悊錛?
//鍙互璋冪敤printString 鏂規(guī)硶錛?
//鎶婁韓瑾夊凡涔呯殑 "Hello World!" 涓蹭紶緇欏畠銆?
//鏈嶅姟鍣ㄤ細(xì)鍦ㄥ畠鐨勭粓绔笂鎵撳嵃榪欎釜涓層?
printer->printString("Hello World!");
}
catch (const Ice::Exception& ex) {
cerr << ex << endl;
status = 1;
} catch (const char* msg) {
cerr << msg << endl;
status = 1;
}
if (ic)
ic->destroy();
return status;
}
濡傛灉鍑虹幇浠諱綍閿欒錛屽鎴蜂細(xì)鎵撳嵃涓鏉″嚭閿欐秷鎭備緥濡傦紝濡傛灉鎴戜滑娌℃湁鍏堝惎鍔ㄦ湇鍔″櫒灝辮繍琛屽鎴鳳紝鎴戜滑浼?xì)寰楀垘图?xì)
Network.cpp:471: Ice::ConnectFailedException: connect failed: Connection refused
(鐢變簬windows涓嬬殑鍛戒護琛岀獥鍙e湪鍑洪敊鍚庝細(xì)涓闂氨娑堝け錛屼笉榪囨垜浠彲浠ュ湪client.cpp鐨刴ain鍑芥暟鐨剅eturn status;涔嬪墠鍔犱笂system("PAUSE");鐒跺悗鍐嶅湪VS2003.net涓妸client璁劇疆涓哄惎鍔ㄩ」鐩紝閲嶆柊緙栬瘧錛岃繍琛屻侽K錛屽彲浠ョ湅鍒扮粨鏋滀簡銆?