51CTO專家門診:Boost程序庫的應(yīng)用探討
Boost被稱為“C++準(zhǔn)標(biāo)準(zhǔn)庫”,含有許多高質(zhì)量的工具,如正則表達(dá)式、字符串算法、智能指針、散列容器等,彌補(bǔ)了C++98標(biāo)準(zhǔn)庫的不足,可以構(gòu)建出工業(yè)級強(qiáng)度的構(gòu)件,代表了目前C++所能達(dá)到的最高技術(shù)高度。但Boost程序庫內(nèi)容博大精深,又使用了大量的高級編程技巧,結(jié)構(gòu)精致復(fù)雜,令不少程序員望而生畏。
本期門診特邀中央部委下屬軟件公司項(xiàng)目經(jīng)理羅劍鋒先生,針對Boost程序庫的應(yīng)用等問題給予解答,歡迎網(wǎng)友積極提問,與專家一起討論,,共同進(jìn)步!
專家著作:《Boost程序庫完全開發(fā)指南》
本期門診鏈接:http://doctor.51cto.com/develop-214.html
本期專家:
Q:CHO堯子
羅老師: 您好
關(guān)于C++,我一直使用VS.NET 2005 用C#語言開發(fā)程序.最近我想轉(zhuǎn)做C++程序的開發(fā).在VS.NET 2005新建項(xiàng)目的時(shí)候 有一個(gè)C++項(xiàng)目.因?yàn)閂S.NET 這個(gè)集成開發(fā)環(huán)境,是基于.NET Framework的嘛.我想問的是我用VS.NET 2005編譯出來的C++程序是不是還得須要.NET Framework才可以運(yùn)行呀!還要在網(wǎng)站后臺(tái)數(shù)據(jù)庫中,不是用MD5加密的,如何能轉(zhuǎn)化和破解!
A:羅劍鋒
不用這么客氣,我算不上是老師。
我沒有使用vs.net,一直使用vs2005里的vc8,C++不需要.netFramework,它可以直接編譯成原生二進(jìn)制代碼,無需運(yùn)行環(huán)境,你只要不使用微軟自己的那套托管C++就可以了。
另一個(gè)問題md5不太明白,md5已經(jīng)被攻克,但難度還是挺高的,具體的在網(wǎng)上查資料吧,我對破解沒有研究過,抱歉。
Q:leo0087
羅老師,您好!
我想知道C++與JAVA的區(qū)別和優(yōu)勢在哪里?
A:羅劍鋒
不用稱呼老師,直接叫我的網(wǎng)名chrono就可以了。
我對java不是特別熟悉,有說錯(cuò)的地方還請見諒。
java是運(yùn)行在jvm虛擬機(jī)上的,編譯為字節(jié)碼,而C++直接編譯成可執(zhí)行的二進(jìn)制程序,無需虛擬機(jī)。
java有垃圾回收機(jī)制,C++必須自己手動(dòng)管理內(nèi)存,但可以使用boost::shared_ptr、pool、ptr_container等庫來簡化這一工作。
java語言較C++有所簡化,不支持多重繼承和操作符重載,而C++則較龐大,有很多復(fù)雜的語法。但java后來也逐漸吸收了C++的很多特性,比如枚舉、模板等。
最重要的一個(gè)區(qū)別是java是一個(gè)工業(yè)標(biāo)準(zhǔn)而不是國際標(biāo)準(zhǔn),其命運(yùn)把持在sun/oracle手里,而C++和C一樣都是國際標(biāo)準(zhǔn),不受任何公司和個(gè)人的控制。
C++的優(yōu)勢是功能強(qiáng)大,運(yùn)行速度快,幾乎所有平臺(tái)都提供C/C++支持,可以編寫實(shí)現(xiàn)任意功能的程序。缺點(diǎn)是支持庫缺乏,沒有java那樣大量的應(yīng)用框架。但一旦掌握了C++,就一定會(huì)被它的強(qiáng)大功能和深刻的語言內(nèi)涵所吸引。
Q:孫空空
chrono 您好
如何安裝C++程序庫Boost,如何編譯和安裝C++程序庫Boost1.40,詳細(xì)步驟請指點(diǎn)一二。辛苦了! 如何安裝C++程序庫Boost
A:羅劍鋒
直接解壓縮就可以,無需特別的安裝,需要設(shè)定頭文件的搜索路徑。
大多數(shù)boost庫無需編譯即可使用,其他庫(如date_time、system)編譯可以使用bjam,也可以直接把源碼加入工程編譯,詳細(xì)的步驟可參考自帶文檔或者《Boost程序庫完全開發(fā)指南》。
Q:bingfeng
我使用BOOST中的path出現(xiàn)了以下問題:
“處未處理的異常:0xC0000005:讀取位置0x00000000時(shí)發(fā)生訪問沖突”
程序是一個(gè)win32控制臺(tái)程序:
#include<boost/filesystem/path.hpp>
#include<iostream>
usingnamespaceboost::filesystem;
usingnamespacestd;
intmain(void)
{
try
{
boost::filesystem::pathsave_path( "c:\\a\\ ");
}
catch(std::exception&e)
{
cerr< <e.what()< <endl;
}
return0;
}
異常時(shí)停止在boost::filesystem::pathsave_path( "c:\\a\\ ");
boost庫鏈接的是libboost_filesystem-vc80-mt.lib,“運(yùn)行時(shí)庫”是MDd。
請問如何解決,萬分感謝!
A:羅劍鋒
我這里測試沒有問題,使用的是mt方式,庫用的是嵌入工程編譯,boost1.43:
#define BOOST_SYSTEM_NO_LIB
#define BOOST_FILESYSTEM_NO_LIB
#include <boost/filesystem.hp>
可以試試catch system_error看看具體的錯(cuò)誤信息,或者調(diào)試程序代碼。
Q:zhang45xiang
李老師
您好,關(guān)于這期的“Boost程序庫的應(yīng)用探討” 真的不是很懂,前來捧場的!
關(guān)于c 我也讀過一點(diǎn),但是沒有頭緒,一看到那些代碼就暈! 看來這些語言不好學(xué)??!
A:羅劍鋒
學(xué)c暈可以改看python、ruby,比C/C++容易。
Q:rickyand
請問在VC2010中用UNICODE怎么樣能添加字符串變量啊?我用_T或者L后面跟的不是字符串常量啊?謝謝,這個(gè)問題困擾我好久了,為了這個(gè)問題我現(xiàn)在還一直使用VC6.0呵呵謝謝昂
A:羅劍鋒
我在開發(fā)中很少使用unicode,因?yàn)樽龅亩际呛艿讓拥臇|西。個(gè)人認(rèn)為應(yīng)該使用wchar_t,wstring等C++標(biāo)準(zhǔn)中寬字符類型,例如:
wstring ws = L"unicode";
wcout << ws << endl;
vc6已經(jīng)太老了,不支持很多現(xiàn)代C++特性,而vc2010還不太穩(wěn)定,可以試用vc8即vs2005。
Q:BZoooooo
關(guān)于C++的問題才接觸哈,現(xiàn)在正在學(xué)JAVA,這個(gè)慢慢來哈,來這學(xué)習(xí)樓主大大!
A:羅劍鋒
java語言本身較小,但外圍的庫和框架太多,c++則正好反了過來。
我個(gè)人還是喜歡c++,自由,不受sun/oracle的限制。
另外objective-c里也可以使用c++,結(jié)合boost開發(fā)mac/iphone程序功能非常強(qiáng)大。
Q:Bill_Hoo
Chrono晚上好:
我現(xiàn)在是大二下期,因?yàn)樽约禾貏e喜歡C++語言,也喜歡軟件工程,已經(jīng)決定用C++在軟件工程的路上踏實(shí)地走下去。
以下請教幾個(gè)問題:
1. 對于我的情況來說,boost庫在什么階段接觸比較合適?換句話說,現(xiàn)階段有必要接觸boost么?
2. boost庫與C++ STL是怎樣的關(guān)系呢?
3. 我本人對C++語言很著迷,雖然選定了語言,但是還沒有選定用這門語言從事哪個(gè)方向的開發(fā),看老師從事c++十余年,希望得到方向上的一些建議。
4. 在已經(jīng)熟悉C++主要語法和特性之后,進(jìn)階階段需要學(xué)習(xí)些什么?看些什么書?
5. 也聽說過一個(gè)好的軟件工程師要對系統(tǒng)底層的知識(shí)有所把握,這種把握到底指什么?希望有所針對。
最后感謝Chrono的無私幫助,謝謝^ ^
A:羅劍鋒
1. 學(xué)習(xí)boost首先要熟悉C++,特別是一些高級特性,比如名字空間、模板、異常,然后要熟悉STL和標(biāo)準(zhǔn)庫,它的現(xiàn)代C++編程風(fēng)格影響了現(xiàn)今的所有C++程序員。
如果對stl有基本的了解,就可以看boost了。其實(shí)boost并不是太難,而且很多組件的用法相當(dāng)簡單,能夠立即應(yīng)用于實(shí)際工作,建議看《boost程序庫完全開發(fā)指南》,我個(gè)人認(rèn)為它是面向初中級程序員的。
2. 在《boost程序庫完全開發(fā)指南》有詳細(xì)解答,簡單的說,boost是一個(gè)更好的STL,是STL的后繼者。
3. c++偏重于底層,缺少直接面向應(yīng)用的開發(fā)框架,但它可以做任何事情,范圍很廣,覺得目前在ios系統(tǒng)上結(jié)合objective-c++做iphone應(yīng)用很有錢途,笑。
4.《boost程序庫完全開發(fā)指南》附錄有推薦書目可參考,這里列兩個(gè)最重要的《設(shè)計(jì)模式》(gof,那些傻瓜、大話書不要看),《effective c++》。
5.系統(tǒng)底層跟具體的方向有關(guān),比如windows、嵌入式系統(tǒng)、unix,看你是哪個(gè)平臺(tái)下了。又或者是對C++的內(nèi)部模型有深入了解,比如內(nèi)存管理機(jī)制、對象模型等等。但這個(gè)見仁見智,不一定非要深入了解,隨著實(shí)踐的需要必然會(huì)有所了解,超前了解不一定有好處(個(gè)人愚見)。
Q:zhang_san_san
您好,羅老師:
對于Boost,我知之甚少。我想了解的是它在嵌入式領(lǐng)域的應(yīng)用。嵌入式系統(tǒng)一般不都是用C語言,或直接用匯編編寫,對于C++,還有標(biāo)識(shí)模板庫(STL)有沒有用到?
A:羅劍鋒
uclinux/ucos等os功能較弱,有的對C++支持不夠好,甚至根本不支持,這個(gè)時(shí)候就不能用stl和boost了。但有的嵌入式系統(tǒng)用的是 linux,可以支持c++,這樣就可以用stl和boost了,不過還要具體看系統(tǒng)手冊中關(guān)于C++編譯的說明,明確哪些支持哪些不支持。
Q:superpopb2b
既然是C++標(biāo)準(zhǔn)庫,有沒有集成到現(xiàn)在的主流C++編譯器的庫中,比如G++或者是VC++?還需不需要額外安裝呢?
此外,它什么時(shí)候可以繼承到庫中呢?
A:羅劍鋒
boost是"準(zhǔn)標(biāo)準(zhǔn)庫",實(shí)際上它還是一個(gè)第三方庫,因此沒有集成,以后也不會(huì)被集成。不過boost安裝很方便,集成與否意義不大。
Q:wawehi
不知道問啥問題, 我手上正好有你的這本boost指南(正版的), 支持你, 這本有點(diǎn)類似于手冊, 對boost不懂的可以拿出來翻翻, 希望能再出一本使用boost開發(fā)游戲服務(wù)器的指南, 各方面詳細(xì)說一些,然后將您的編程經(jīng)驗(yàn)傳承下來啊~~~~~~~~
支持你!!!
A:羅劍鋒
感謝支持。boost和stl一樣,提供的都是底層庫,開發(fā)服務(wù)器得用其他的架構(gòu)吧,我不是這個(gè)領(lǐng)域的不好說,希望以后能與你合作。
Q:yf213
Chrono,您好!
剛剛接觸boost庫,對于boost自帶的庫應(yīng)用起來沒有什么問題,但是對于mpi庫,編譯生成了lib以后,總是出現(xiàn)鏈接出錯(cuò),找不到mpi中的相關(guān)的符號!參照網(wǎng)上一些網(wǎng)友給出的安裝和編譯指導(dǎo)也沒能解決。這個(gè)問題讓我很困擾,希望能得到您的幫助!
謝謝!
A:羅劍鋒
我沒有專門研究過mpi庫,剛才看了一下,因?yàn)槲业闹饕ぷ髌脚_(tái)是win,所以不能編譯mpich、openmpi等外部庫,也就不能試驗(yàn)boost.mpi了,抱歉了。
建議可以采用嵌入工程編譯的方式,而不是動(dòng)態(tài)鏈接,這樣可能會(huì)減少一些麻煩,比如:
#define BOOST_MPI_NO_LIB
#include <libs/mpi/src/xxxx.cpp>
------------------------------------------
下期(201期)門診:萬兆銅纜的應(yīng)用與測試
① 預(yù)告: 當(dāng)前,萬兆銅纜已成為智能建筑與數(shù)據(jù)中心被廣泛關(guān)注和應(yīng)用的布線系統(tǒng)。而在網(wǎng)絡(luò)系統(tǒng)工程和布線的規(guī)劃、設(shè)計(jì)、施工,直至現(xiàn)場驗(yàn)收的整個(gè)生命周期中,布線測 試技術(shù)都至關(guān)重要。對于企業(yè)用戶和測試單位來說,在驗(yàn)收、檢測、維護(hù)、故障診斷等過程中,難免遇到各種各樣的棘手問題。
② 鏈接:http://doctor.51cto.com/develop-215.html