xinyupan 2011-04-19
Boost被称为“C++准标准库”,含有许多高质量的工具,如正则表达式、字符串算法、智能指针、散列容器等,弥补了C++98标准库的不足,可以构建出工业级强度的构件,代表了目前C++所能达到的最高技术高度。但Boost程序库内容博大精深,又使用了大量的高级编程技巧,结构精致复杂,令不少程序员望而生畏。
本期门诊特邀中央部委下属软件公司项目经理罗剑锋先生,针对Boost程序库的应用等问题给予解答,欢迎网友积极提问,与专家一起讨论,,共同进步!
专家著作:《Boost程序库完全开发指南》
本期专家:
罗剑锋
Q:CHO尧子
罗老师: 您好
关于C++,我一直使用VS.NET 2005 用C#语言开发程序.最近我想转做C++程序的开发.在VS.NET 2005新建项目的时候 有一个C++项目.因为VS.NET 这个集成开发环境,是基于.NET Framework的嘛.我想问的是我用VS.NET 2005编译出来的C++程序是不是还得须要.NET Framework才可以运行呀!还要在网站后台数据库中,不是用MD5加密的,如何能转化和破解!
A:罗剑锋
不用这么客气,我算不上是老师。
我没有使用vs.net,一直使用vs2005里的vc8,C++不需要.netFramework,它可以直接编译成原生二进制代码,无需运行环境,你只要不使用微软自己的那套托管C++就可以了。
另一个问题md5不太明白,md5已经被攻克,但难度还是挺高的,具体的在网上查资料吧,我对破解没有研究过,抱歉。
Q:leo0087
罗老师,您好!
我想知道C++与JAVA的区别和优势在哪里?
A:罗剑锋
不用称呼老师,直接叫我的网名chrono就可以了。
我对java不是特别熟悉,有说错的地方还请见谅。
java是运行在jvm虚拟机上的,编译为字节码,而C++直接编译成可执行的二进制程序,无需虚拟机。
java有垃圾回收机制,C++必须自己手动管理内存,但可以使用boost::shared_ptr、pool、ptr_container等库来简化这一工作。
java语言较C++有所简化,不支持多重继承和操作符重载,而C++则较庞大,有很多复杂的语法。但java后来也逐渐吸收了C++的很多特性,比如枚举、模板等。
最重要的一个区别是java是一个工业标准而不是国际标准,其命运把持在sun/oracle手里,而C++和C一样都是国际标准,不受任何公司和个人的控制。
C++的优势是功能强大,运行速度快,几乎所有平台都提供C/C++支持,可以编写实现任意功能的程序。缺点是支持库缺乏,没有java那样大量的应用框架。但一旦掌握了C++,就一定会被它的强大功能和深刻的语言内涵所吸引。
Q:孙空空
chrono 您好
如何安装C++程序库Boost,如何编译和安装C++程序库Boost1.40,详细步骤请指点一二。辛苦了! 如何安装C++程序库Boost
A:罗剑锋
直接解压缩就可以,无需特别的安装,需要设定头文件的搜索路径。
大多数boost库无需编译即可使用,其他库(如date_time、system)编译可以使用bjam,也可以直接把源码加入工程编译,详细的步骤可参考自带文档或者《Boost程序库完全开发指南》。
Q:bingfeng
我使用BOOST中的path出现了以下问题:
“处未处理的异常:0xC0000005:读取位置0x00000000时发生访问冲突”
程序是一个win32控制台程序:
#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;
}
异常时停止在boost::filesystem::pathsave_path( "c:\\a\\ ");
boost库链接的是libboost_filesystem-vc80-mt.lib,“运行时库”是MDd。
请问如何解决,万分感谢!
A:罗剑锋
我这里测试没有问题,使用的是mt方式,库用的是嵌入工程编译,boost1.43:
#define BOOST_SYSTEM_NO_LIB
#define BOOST_FILESYSTEM_NO_LIB
#include <boost/filesystem.hp>
可以试试catch system_error看看具体的错误信息,或者调试程序代码。
Q:zhang45xiang
李老师
您好,关于这期的“Boost程序库的应用探讨” 真的不是很懂,前来捧场的!
关于c 我也读过一点,但是没有头绪,一看到那些代码就晕! 看来这些语言不好学啊!
A:罗剑锋
学c晕可以改看python、ruby,比C/C++容易。
Q:rickyand
请问在VC2010中用UNICODE怎么样能添加字符串变量啊?我用_T或者L后面跟的不是字符串常量啊?谢谢,这个问题困扰我好久了,为了这个问题我现在还一直使用VC6.0呵呵谢谢昂
A:罗剑锋
我在开发中很少使用unicode,因为做的都是很底层的东西。个人认为应该使用wchar_t,wstring等C++标准中宽字符类型,例如:
wstring ws = L"unicode";
wcout << ws << endl;
vc6已经太老了,不支持很多现代C++特性,而vc2010还不太稳定,可以试用vc8即vs2005。
Q:BZoooooo
关于C++的问题才接触哈,现在正在学JAVA,这个慢慢来哈,来这学习楼主大大!
A:罗剑锋
java语言本身较小,但外围的库和框架太多,c++则正好反了过来。
我个人还是喜欢c++,自由,不受sun/oracle的限制。
另外objective-c里也可以使用c++,结合boost开发mac/iphone程序功能非常强大。
Q:Bill_Hoo
Chrono晚上好:
我现在是大二下期,因为自己特别喜欢C++语言,也喜欢软件工程,已经决定用C++在软件工程的路上踏实地走下去。
以下请教几个问题:
1. 对于我的情况来说,boost库在什么阶段接触比较合适?换句话说,现阶段有必要接触boost么?
2. boost库与C++ STL是怎样的关系呢?
3. 我本人对C++语言很着迷,虽然选定了语言,但是还没有选定用这门语言从事哪个方向的开发,看老师从事c++十余年,希望得到方向上的一些建议。
4. 在已经熟悉C++主要语法和特性之后,进阶阶段需要学习些什么?看些什么书?
5. 也听说过一个好的软件工程师要对系统底层的知识有所把握,这种把握到底指什么?希望有所针对。
最后感谢Chrono的无私帮助,谢谢^ ^
A:罗剑锋
1. 学习boost首先要熟悉C++,特别是一些高级特性,比如名字空间、模板、异常,然后要熟悉STL和标准库,它的现代C++编程风格影响了现今的所有C++程序员。
如果对stl有基本的了解,就可以看boost了。其实boost并不是太难,而且很多组件的用法相当简单,能够立即应用于实际工作,建议看《boost程序库完全开发指南》,我个人认为它是面向初中级程序员的。
2. 在《boost程序库完全开发指南》有详细解答,简单的说,boost是一个更好的STL,是STL的后继者。
3. c++偏重于底层,缺少直接面向应用的开发框架,但它可以做任何事情,范围很广,觉得目前在ios系统上结合objective-c++做iphone应用很有钱途,笑。
4.《boost程序库完全开发指南》附录有推荐书目可参考,这里列两个最重要的《设计模式》(gof,那些傻瓜、大话书不要看),《effective c++》。
5.系统底层跟具体的方向有关,比如windows、嵌入式系统、unix,看你是哪个平台下了。又或者是对C++的内部模型有深入了解,比如内存管理机制、对象模型等等。但这个见仁见智,不一定非要深入了解,随着实践的需要必然会有所了解,超前了解不一定有好处(个人愚见)。
Q:zhang_san_san
您好,罗老师:
对于Boost,我知之甚少。我想了解的是它在嵌入式领域的应用。嵌入式系统一般不都是用C语言,或直接用汇编编写,对于C++,还有标识模板库(STL)有没有用到?
A:罗剑锋
uclinux/ucos等os功能较弱,有的对C++支持不够好,甚至根本不支持,这个时候就不能用stl和boost了。但有的嵌入式系统用的是 linux,可以支持c++,这样就可以用stl和boost了,不过还要具体看系统手册中关于C++编译的说明,明确哪些支持哪些不支持。
Q:superpopb2b
既然是C++标准库,有没有集成到现在的主流C++编译器的库中,比如G++或者是VC++?还需不需要额外安装呢?
此外,它什么时候可以继承到库中呢?
A:罗剑锋
boost是"准标准库",实际上它还是一个第三方库,因此没有集成,以后也不会被集成。不过boost安装很方便,集成与否意义不大。
Q:wawehi
不知道问啥问题, 我手上正好有你的这本boost指南(正版的), 支持你, 这本有点类似于手册, 对boost不懂的可以拿出来翻翻, 希望能再出一本使用boost开发游戏服务器的指南, 各方面详细说一些,然后将您的编程经验传承下来啊~~~~~~~~
支持你!!!
A:罗剑锋
感谢支持。boost和stl一样,提供的都是底层库,开发服务器得用其他的架构吧,我不是这个领域的不好说,希望以后能与你合作。
Q:yf213
Chrono,您好!
刚刚接触boost库,对于boost自带的库应用起来没有什么问题,但是对于mpi库,编译生成了lib以后,总是出现链接出错,找不到mpi中的相关的符号!参照网上一些网友给出的安装和编译指导也没能解决。这个问题让我很困扰,希望能得到您的帮助!
谢谢!
A:罗剑锋
我没有专门研究过mpi库,刚才看了一下,因为我的主要工作平台是win,所以不能编译mpich、openmpi等外部库,也就不能试验boost.mpi了,抱歉了。
建议可以采用嵌入工程编译的方式,而不是动态链接,这样可能会减少一些麻烦,比如:
#define BOOST_MPI_NO_LIB
#include <libs/mpi/src/xxxx.cpp>