C++资源之不完全导引

2023-05-16

C++资源之不完全导引
作者:曾毅 陶文 文章来源:csdn 点击数:<script language="javascript" src="/Article/GetHits.asp?ArticleID=385" type="text/javascript"> </script> 1229 更新时间:2004-12-14

C++资源之不完全导引 []

 

撰文/ 曾毅 陶文

 

最后更新:2004611

 

声明:

.本文20045月首发于《CSDN开发高手》,版权归该杂志与《程序员》杂志社所有。杂志限于篇幅部分内容有所删节,此处版本为相对完整版本。

.本文为介绍性文章,会随笔者学习C++语言不断更新。

 

前言

无数次听到“我要开始学习C++!”的呐喊,无数次听到“C++太复杂了,我真的学不会”的无奈。Stan Lippman先生曾在《C++ Primer》一书中指出“C++是最为难学的高级程序设计语言之一”,人们常将“之一”去掉以表达自己对C++的敬畏。诚然,C++程序设计语言对于学习者的确有很多难以逾越的鸿沟,体系结构的庞大,应接不暇并不断扩充的特性……除此之外,参考资料之多与冗杂使它的学习者望而却步,欲求深入者苦不堪言。希望这一份不完全导引能够成为您C++学习之路上的引路灯。

撰写本文的初衷并不打算带领大家体验古老的C++历史,如果你想了解C++的历史与其前期发展中诸多技术的演变,你应当去参考Bjarne的《The Design and Evolution of C++》。当然也不打算给大家一个无所不包的宝典(并非不想:其一是因水平有限,其二无奈C++之博大精深),所给出的仅仅是一些我们认为对于想学习C++的广大读者来说最重要并且触手可及的开发与学习资源。

本文介绍并分析了一些编译器,开发环境,库,少量的书籍以及参考网站,并且尽可能尝试着给出一个利用这些资源的导引,望对如同我们一样的初学者能够有所裨益。

编译器

C++之外的任何语言中,编译器都从来没有受到过如此之重视。因为C++是一门相当复杂的语言,所以编译器也难于构建。直到最近我们才开始能够使用上完全符合C++标准的编译器(哦,你可能会责怪那些编译器厂商不能尽早的提供符合标准的编译器,这只能怪他们各自维系着自身的一套别人不愿接受的标准)。什么?你说这无关紧要?哦,不,你所需要的是和标准化C++高度兼容的编译环境。长远来看,只有这样的编译器对C++开发人员来说才是最有意义的工具,尤其是对于程序设计语言的学习者。一至性让代码具备可移植性,并让一门语言及其库的应用更为广泛。嗯,是的,我们这里只打算介绍一些公认的优秀编译器。

Borland C++

这个是Borland C++ BuilderBorland C++ Builder X这两种开发环境的后台编译器。(哦,我之所以将之分为两种开发环境你应当能明白为什么,正如Delphi7Delphi8的转变,是革命性的两代。)Borland C++由老牌开发工具厂商Borland倾力打造。该公司的编译器素以速度快,空间效率高著称,Borland C++ 系列编译器秉承了这个传统,属于非常优质的编译器。标准化方面早在5.5版本的编译器中对标准化C++的兼容就达到了92.73%。目前最新版本是Borland C++ Builder X中的6.0版本,官方称100%符合ANSI/ISOC++标准以及C99标准。嗯这正是我前面所指的“完全符合C++标准的编译器”。

Visual C++

这个正是我们熟知的Visual Studio Visual Studio.net 2002, 2003以及2005 Whidbey中带的C++编译器。由Microsoft公司研制。在Visual Studio 6.0中,因为编译器有太多地方不能与后来出现的C++标准相吻合而饱受批评(想想你在使用STL的时候编译时报出的那些令人厌恶的errorwarning吧)。VC++6.0对标准化C++的兼容只有83.43%。但是随着C++编译器设计大师Stanley Lippman以及诸多C++社群达人的加盟,在Visual Studio.NET 2003中,Visual C++编译器已经成为一个非常成熟可靠的C++编译器了。Dr.Dobb's Journal的评测显示Visual C++7.1对标准C++的兼容性高达98.22%,一度成为CBX之前兼容性最好的编译器。结合强大的Visual Studio.NET开发环境,是一个非常不错的选择。至于Whidbey时代的Visual C++,似乎微软所最关注的是C++/CLI……我们不想评论微软下一代的C++编译器对标准化兼容如何,但他确实越来越适合.NET (其实你和我的感觉可能是一样的,微软不应当把标准C++这块肥肉丢给Borland,然而微软可能并不这样认为)

 

GNU C++

著名的开源C++编译器。是类Unix操作系统下编写C++程序的首选。特点是有非常好的移植性,你可以在非常广泛的平台上使用它,同时也是编写跨平台,嵌入式程序很好的选择。另外在符合标准这个方面一直都非常好,GCC3.3大概能够达到96.15%。但是由于其跨平台的特性,在代码尺寸速度等优化上略微差一点。

基于GNU C++的编译器有很多,比如:

l          Mingwhttp://www.mingw.org/

GCC的一个Windows的移植版本(Dev-C++的后台)

l          Cygwinhttp://sources.redhat.com/cygwin/

GCC的另外一个Windows移植版本是Cygwin的一部分,CygwinWindows下的一个Unix仿真环境。严格的说是模拟GNU的环境,这也就是"Gnu's Not Unix"要表达的意思,噢,扯远了,这并不是我们在这里关心的实质内容。 

l          Djgpphttp://www.delorie.com/djgpp/

这是GCCDOS移植版本。

l          RSXNThttp://www.mathematik.uni-bielefeld.de/~rainer/

这是GCCDOSWindows移植版本。

 

Intel C++

著名CPU制造厂商Intel出品的编译器,Special Design for Intel x86!对于Intel x86结构的CPU经过特别的优化。在有些应用情况下,特别是数值计算等高性能应用,仅仅采用Intel的编译器编译就能大幅度的提高性能。

 

Digital Mars C++

网络上提供免费下载,Zortech/Symantec C++的继承者,其前身在当年惨烈的C++四国战中也是主角之一。

 

开发环境

开发环境对于程序员的作用不言而喻。选择自己朝夕相处的环境也不是容易的事情,特别是在IDE如此丰富的情况下。下面就是我们推荐的一些常见的C++开发环境,并没有包括一些小型的,罕见的IDE。其中任何一款都是功能丰富,可以用作日常开发使用的。对于不同层面的开发者,请参见内文关于适用对象的描述。

 

Visual Studio 6.0

这个虽然是Microsoft公司的老版本的开发环境,但是鉴于其后继版本Visual Studio.NET的庞大身躯,以及初学者并不那么高的功能要求,所以推荐这个开发环境给C++的初学者,供其学习C++的最基本的部分,比如C的那部分子集,当然你别指望他能够支持最新的C99标准。在日常的开发中,仍然有很多公司使用这个经典稳定的环境,比如笔者就看曾亲见有些公司将其编译器替换为GCC做手机开发之用。

 

Visual Studio.NET 2003

作为Microsoft公司官方正式发布的最新版本开发环境,其中有太多激动人心的功能。结合其最新的C++编译器。对于机器配置比较好的开发人员来说,使用这个开发环境将能满足其大部分的要求。这里不打算单独说Visual Studio Whidbey,虽然Visual Studio .NET 2005 - Whidbey社区预览版已经推出,但暂不是很稳定,读者可以亲身去体验。

Borland C++ Builder 6

这个并不是BorlandC++开发环境的最新版本。选择它的原因是它不是用Java写的IDE,速度比较快。它有一个很完善的GUI窗体设计器,和Delphi共用一个VCL。由于这些特点,比较适合初学者上手。但是由于其GUI的中心位置,可能不利于对于C++语言的学习。而且其为了支持VCL这个Object Pascal写的库也对C++进行了一些私有的扩充。使得人们有一个不得不接受的事实:“Borland C++ Builder 6的高手几乎都是Delphi高手”。

 

Borland C++ Builder X

正如前文所述,虽然版本号上和前面那个IDE非常相象,但是其实它们是完全不同的两个集成开发环境。C++Builder更多的是一个和Delphi同步的C++版本的开发环境,C++BuilderX则是完全从C++的角度思考得出的一个功能丰富的IDE。其最大的特点是跨平台,跨编译器,多种Framework的集成,并且有一个WxWindows为基础的GUI设计器。尤其是采用了纯C++来重写了整个Framework,摒弃了以前令人无奈的版本。对于C++的开发来说,从编译器,到库,到功能集成都是非常理想的。可以预见,Borland C++ Builder X 2.0很值得C++爱好者期待。唯一令人难堪之处是作为一个C++的开发工具,其IDE是用Java写的,在配置不够理想的机器上请慎重考虑再安装。

 

Emacs + GCC

前面讲的大部分是Windows环境下的集成开发环境。Linux上的开发者更倾向于使用Emacs来编辑C++的文件,用Makefile来命令GCC做编译。虽然看上去比较松散,但是这些东西综合起来还是一个开0发环境。如果你能够娴熟的使用这样的环境写程序,你的水平应该足够指导我们来写这篇陋文了。

 

Dev C++

GCC是一个很好的编译器。在Windows上的C++编译器一直和标准有着一段距离的时候,GCC就是一个让Windows下开发者流口水的编译器。Dev-C++就是能够让GCC跑在Windows下的工具,作为集成开发环境,还提供了同专业IDE相媲美的语法高亮,代码提示,调试等功能。由于使用Delphi开发,占用内存少,速度很快,比较适合轻量级的学习和使用。

 

Eclipse + CDT

Eclipse可是近来大名鼎鼎的开发工具。最新一期的Jolt大奖就颁给了这个杰出的神物。说其神奇是因为,它本身是用Java写的,但是拥有比一般Java写的程序快得多的速度。而且因为其基于插件组装一切的原则,使得能够有CDT这样的插件把Eclipse变成一个C/C++的开发环境。如果你一直用EclipseJava的程序,不妨用它体验一下C++开发的乐趣。

 

工具

C++的辅助工具繁多,我们分门别类的为大家作介绍:

文档类

Doxygen

参考站点:http://www.doxygen.org

    Doxygen是一种适合C风格语言(如C++CIDLJava甚至包括C#PHP)的、开放源码的、基于命令行的文档产生器。

C++2HTML

参考站点:http://www.bedaux.net/cpp2html/

C++代码变成语法高亮的HTML

CodeColorizer

参考站点:http://www.chami.com/colorizer/

    它能把好几种语言的源代码着色为HTML

Doc-O-Matic

参考站点:http://www.doc-o-matic.com/

Doc-O_Matic为你的C/C++C++.netDelphi/Pascal, VB.NETC#Java程序或者组件产生准确的文档。Doc-O-Matic使用源代码中的符号和注释以及外部的文档文件创建与流行的文档样式一致的文档。

DocVizor

参考站点:http://www.ucancode.net/Products/DocBuilder/Features.htm

DocVizor满足了面向对象软件开发者的基本要求——它让我们能够看到C++工程中的类层次结构。DocVizor快速地产生完整可供打印的类层次结构图,包括从第三方库中来的那些类,除此之外DocVizor还能从类信息中产生HTML文件。

SourcePublisher C++

参考站点:http://www.scitools.com/sourcepublisher_c.html

给源代码产生提供快速直观的HTML报表,包括代码,类层次结构,调用和被调用树,包含和被包含树。支持多种操作系统。

Understand

参考站点:http://www.scitools.com/ucpp.html

分析任何规模的C或者C++工程,帮助我们更好的理解以及编写文档。

代码类

CC-Rider

参考站点:http://www.cc-rider.com

CC-Rider是用于C/C++程序强大的代码可视化工具,通过交互式浏览、编辑及自动文件来促进程序的维持和发展。

CodeInspect

参考站点:http://www.yokasoft.com/

一种新的C/C++代码分析工具。它检查我们的源代码找出非标准的,可能的,以及普通的错误代码。

CodeWizard

参考站点:http://www.parasoft.com

先进的C/C++源代码分析工具,使用超过500个编码规范自动化地标明危险的,但是编译器不能检查到的代码结构。

C++ Validation Test Suites

参考站点:http://www.plumhall.com/suites.html

一组用于测试编译器和库对于标准吻合程度的代码库。

CppRefactory

参考站点:http://cpptool.sourceforge.net/

         CPPRefactory是一个使得开发者能够重构他们的C++代码的程序。目的是使得C++代码的重构能够尽可能的有效率和简单。

Lzz

参考站点:http://www.lazycplusplus.com/

         Lzz是一个自动化许多C++编程中的体力活的工具。它能够节省我们许多事件并且使得编码更加有乐趣。给出一系列的声明,Lzz会给我们创建头文件和源文件。

QA C++ Generation 2000

参考站点:http://www.programmingresearch.com/solutions/qacpp.htm

它关注面向对象的C++源代码,对有关于设计,效率,可靠性,可维护性的部分提出警告信息。

s-mail project - Java to C++DOL

参考站点:http://sadlocha.strefa.pl/s-mail/ja2dol.html

Java源代码翻译为相应的C++源代码的命令行工具。

SNIP from Cleanscape Software International

参考站点:http://www.cleanscape.net/stdprod/snip/index.html

一个填平编码和设计之间沟壑的易于使用的C++开发工具,节省大量编辑和调试的事件,它还使得开发者能够指定设计模式作为对象模型,自动从对象模型中产生C++的类。

SourceStyler C++

参考站点:http://www.ochresoftware.com/

C/C++源代码提供完整的格式化和排版控制的工具。提供多于75个的格式化选项以及完全支持ANSI C++

 

编译类

Compilercache

参考站点:http://www.erikyyy.de/compilercache/

Compilercache是一个对你的CC++编译器的封装脚本。每次我们进行编译,封装脚本,把编译的结果放入缓存,一旦编译相同的东西,结果将从缓存中取出而不是再次编译。

Ccache

参考站点:http://ccache.samba.org/

Ccache是一个编译器缓存。它使用起来就像C/C++编译器的缓存预处理器,编译速度通常能提高普通编译过程的5~10倍。

Cmm (C++ with MultiMethods)

参考站点:http://www.op59.net/cmm/cmm-0.28/users.html

         这是一种C++语言的扩展。读入Cmm源代码输出C++的源代码,功能是对C++语言添加了对multimethod的支持。

The Frost Project

参考站点:http://frost.flewid.de/

Forst使得你能够在C++程序中像原生的C++特性一样使用multimethod以及虚函数参数。它是一个编译器的外壳。

 

测试和调试类

CPPUnit

         CppUnit 是个基于 LGPL 的开源项目,最初版本移植自 JUnit,是一个非常优秀的开源测试框架。CppUnit JUnit 一样主要思想来源于极限编程。主要功能就是对单元测试进行管理,并可进行自动化测试。

C++Test

参考站点:http://www.parasoft.com/

         C++ Test是一个单元测试工具,它自动化了CC++类,函数或者组件的测试。

Cantata++

参考站点:http://www.iplbath.com/products/tools/pt400.shtml

设计的目的是为了满足在合理的经济开销下使用这个工具可以让开发工程师开展单元测试和集成测试的需求.

Purify

参考站点:http://www-900.ibm.com/cn/software/rational/products/purifyplus/index.shtml

IBM Rational PurifyPlus是一套完整的运行时分析工具,旨在提高应用程序的可靠性和性能。PurifyPlus将内存错误和泄漏检测、应用程序性能描述、代码覆盖分析等功能组合在一个单一、完整的工具包中。

BoundsChecker

BoundsChecker是一个C++运行时错误检测和调试工具。它通过在Visual Studio内自动化调试过程加速开发并且缩短上市的周期。BoundsChecker提供清楚,详细的程序错误分析,许多是对C++独有的并且在staticstackheap内存中检测和诊断错误,以及发现内存和资源的泄漏。

Insure++

参考站点:http://www.parasoft.com/

一个自动化的运行时程序测试工具,检查难以察觉的错误,如内存覆盖,内存泄漏,内存分配错误,变量初始化错误,变量定义冲突,指针错误,库错误,逻辑错误和算法错误等。

GlowCode

参考站点:http://www.glowcode.com/

         GlowCode包括内存泄漏检查,code profiler,函数调用跟踪等功能。给C++开发者提供完整的错误诊断,和运行时性能分析工具包。

Stack Spy

参考站点:http://www.imperioustech.com/

它能捕捉stack corruption, stack over run, stack overflow等有关栈的错误。



 

 

C++资源之不完全导引 []

 

撰文/ 曾毅 陶文

最后更新:2004612

声明:

.本文20045月首发于《CSDN开发高手》,版权归该杂志与《程序员》杂志社所有。杂志限于篇幅部分内容有所删节,此处版本为相对完整版本。

.本文为介绍性文章,会随笔者学习C++语言不断更新。

C++中,库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论。现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级到重量级的都有。不少都是让人眼界大开,亦或是望而生叹的思维杰作。由于库的数量非常庞大,而且限于笔者水平,其中很多并不了解。所以文中所提的一些库都是比较著名的大型库。

标准库

标准库中提供了C++程序的基本设施。虽然C++标准库随着C++标准折腾了许多年,直到标准的出台才正式定型,但是在标准库的实现上却很令人欣慰得看到多种实现,并且已被实践证明为有工业级别强度的佳作。

1   Dinkumware C++ Library

参考站点:http://www.dinkumware.com/

P.J. Plauger编写的高品质的标准库。P.J. Plauger博士是Dr. Dobb's程序设计杰出奖的获得者。其编写的库长期被Microsoft采用,并且最近Borland也取得了其OEMlicense,在其C/C++的产品中采用Dinkumware的库。

2   RogueWave Standard C++ Library

参考站点:http://www.roguewave.com/

这个库在Borland C++ Builder的早期版本中曾经被采用,后来被其他的库给替换了。笔者不推荐使用。

3SGI STL

参考站点:http://www.roguewave.com/

SGI公司的C++标准模版库。

4STLport

参考站点:http://www.stlport.org/

SGI STL库的跨平台可移植版本。

 

准标准库——Boost

Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,在C++社区中影响甚大,其成员已近2000人。 Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的标准库。

Boost中比较有名气的有这么几个库:

Regex

正则表达式库

Spirit

LL parser framework,用C++代码直接表达EBNF

Graph

图组件和算法

Lambda

在调用的地方定义短小匿名的函数对象,很实用的functional功能

concept check

检查泛型编程中的concept

Mpl

用模板实现的元编程框架

Thread

可移植的C++多线程库

Python

C++类和函数映射到Python之中

Pool

内存池管理

smart_ptr

5个智能指针,学习智能指针必读,一份不错的参考是来自CUJ的文章:

Smart Pointers in Boost,哦,这篇文章可以查到,CUJ是提供在线浏览的。中文版见笔者在《Dr. Dobb's Journal软件研发杂志》第7辑上的译文。

Boost总体来说是实用价值很高,质量很高的库。并且由于其对跨平台的强调,对标准C++的强调,是编写平台无关,现代C++的开发者必备的工具。但是Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎。并且很多Boost中的库功能堪称对语言功能的扩展,其构造用尽精巧的手法,不要贸然的花费时间研读。Boost另外一面,比如Graph这样的库则是具有工业强度,结构良好,非常值得研读的精品代码,并且也可以放心的在产品代码中多多利用。

参考站点:http://www.boost.org(国内镜像:http://www.c-view.org/tech/lib/boost/index.htm

GUI

在众多C++的库中,GUI部分的库算是比较繁荣,也比较引人注目的。在实际开发中,GUI库的选择也是非常重要的一件事情,下面我们综述一下可选择的GUI库,各自的特点以及相关工具的支持。

1   MFC

大名鼎鼎的微软基础类库(Microsoft Foundation Class)。大凡学过VC++的人都应该知道这个库。虽然从技术角度讲,MFC是不大漂亮的,但是它构建于Windows API 之上,能够使程序员的工作更容易,编程效率高,减少了大量在建立 Windows 程序时必须编写的代码,同时它还提供了所有一般 C++ 编程的优点,例如继承和封装。MFC 编写的程序在各个版本的Windows操作系统上是可移植的,例如,在 Windows 3.1下编写的代码可以很容易地移植到 Windows NT Windows 95 上。但是在最近发展以及官方支持上日渐势微。

 

2   QT

参考网站:http://www.trolltech.com/

QtTrolltech公司的一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的很容易扩展,并且允许真正地组件编程。自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE 的基础,同时它还支持WindowsMacintoshUnix/X11等多种平台。

 

3WxWindows

参考网站:http://www.wxwindows.org/

跨平台的GUI库。因为其类层次极像MFC,所以有文章介绍从MFCWxWindows的代码移植以实现跨平台的功能。通过多年的开发也是一个日趋完善的GUI库,支持同样不弱于前面两个库。并且是完全开放源代码的。新近的C++ Builder XGUI设计器就是基于这个库的。

4Fox

开放源代码的GUI库。作者从自己亲身的开发经验中得出了一个理想的GUI库应该是什么样子的感受出发,从而开始了对这个库的开发。有兴趣的可以尝试一下。

参考网站:http://www.fox-toolkit.org/

5   WTL

基于ATL的一个库。因为使用了大量ATL的轻量级手法,模板等技术,在代码尺寸,以及速度优化方面做得非常到位。主要面向的使用群体是开发COM轻量级供网络下载的可视化控件的开发者。

6   GTK

参考网站:http://gtkmm.sourceforge.net/

GTK是一个大名鼎鼎的C的开源GUI库。在Linux世界中有Gnome这样的杀手应用。而GTK就是这个库的C++封装版本。

 

网络通信

ACE

参考网站:http://www.cs.wustl.edu/~schmidt/ACE.html

C++库的代表,超重量级的网络通信开发框架。ACE自适配通信环境(Adaptive Communication Environment)是可以自由使用、开放源代码的面向对象框架,在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++包装外观(Wrapper Facade)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。

StreamModule

参考网站:http://www.omnifarious.org/StrMod/

设计用于简化编写分布式程序的库。尝试着使得编写处理异步行为的程序更容易,而不是用同步的外壳包起异步的本质。

SimpleSocket

参考网站:http://home.hetnet.nl/~lcbokkers/simsock.htm

这个类库让编写基于socket的客户/服务器程序更加容易。

A Stream Socket API for C++

参考网站:http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html

又一个对Socket的封装库。

XML

Xerces

参考网站:http://xml.apache.org/xerces-c/

Xerces-C++ 是一个非常健壮的XML解析器,它提供了验证,以及SAXDOM APIXML验证在文档类型定义(Document Type DefinitionDTD)方面有很好的支持,并且在200112月增加了支持W3C XML Schema 的基本完整的开放标准。

XMLBooster

参考网站:http://www.xmlbooster.com/

这个库通过产生特制的parser的办法极大的提高了XML解析的速度,并且能够产生相应的GUI程序来修改这个parser。在DOMSAX两大主流XML解析办法之外提供了另外一个可行的解决方案。

Pull Parser

         参考网站:http://www.extreme.indiana.edu/xgws/xsoap/xpp/

         这个库采用pull方法的parser。在每个SAXparser底层都有一个pullparser,这个xpp把这层暴露出来直接给大家使用。在要充分考虑速度的时候值得尝试。

Xalan

         参考网站:http://xml.apache.org/xalan-c/

         Xalan是一个用于把XML文档转换为HTML,纯文本或者其他XML类型文档的XSLT处理器。

CMarkup

         参考网站:http://www.firstobject.com/xml.htm

         这是一种使用EDOMXML解析器。在很多思路上面非常灵活实用。值得大家在DOMSAX之外寻求一点灵感。

libxml++

http://libxmlplusplus.sourceforge.net/

libxml++是对著名的libxml XML解析器的C++封装版本

 

科学计算

Blitz++

参考网站:http://www.oonumerics.org/blitz/

Blitz++ 是一个高效率的数值计算函数库,它的设计目的是希望建立一套既具像C++ 一样方便,同时又比Fortran速度更快的数值计算环境。通常,用C++所写出的数值程序,比 Fortran20%左右,因此Blitz++正是要改掉这个缺点。方法是利用C++template技术,程序执行甚至可以比Fortran更快。Blitz++目前仍在发展中,对于常见的SVDFFTsQMRES等常见的线性代数方法并不提供,不过使用者可以很容易地利用Blitz++所提供的函数来构建。

POOMA

参考网站:http://www.codesourcery.com/pooma/pooma

POOMA是一个免费的高性能的C++库,用于处理并行式科学计算。POOMA的面向对象设计方便了快速的程序开发,对并行机器进行了优化以达到最高的效率,方便在工业和研究环境中使用。

MTL

参考网站:http://www.osl.iu.edu/research/mtl/

Matrix Template Library(MTL)是一个高性能的泛型组件库,提供了各种格式矩阵的大量线性代数方面的功能。在某些应用使用高性能编译器的情况下,比如Intel的编译器,从产生的汇编代码可以看出其与手写几乎没有两样的效能。

CGAL

参考网站:www.cgal.org

Computational Geometry Algorithms Library的目的是把在计算几何方面的大部分重要的解决方案和方法以C++库的形式提供给工业和学术界的用户。

 

游戏开发

Audio/Video 3D C++ Programming Library

参考网站:http://www.galacticasoftware.com/products/av/

AV3D是一个跨平台,高性能的C++库。主要的特性是提供3D图形,声效支持(SB,以及S3M),控制接口(键盘,鼠标和遥感),XMS

KlayGE

参考网站:http://home.g365.net/enginedev/

国内游戏开发高手自己用C++开发的游戏引擎。KlayGE是一个开放源代码、跨平台的游戏引擎,并使用Python作脚本语言。KlayGELGPL协议下发行。感谢龚敏敏先生为中国游戏开发事业所做出的贡献。

OGRE

参考网站:http://www.ogre3d.org

OGRE(面向对象的图形渲染引擎)是用C++开发的,使用灵活的面向对象3D引擎。它的目的是让开发者能更方便和直接地开发基于3D硬件设备的应用程序或游戏。引擎中的类库对更底层的系统库(如:Direct3DOpenGL)的全部使用细节进行了抽象,并提供了基于现实世界对象的接口和其它类。

 

线程

C++ Threads

参考网站:http://threads.sourceforge.net/

这个库的目标是给程序员提供易于使用的类,这些类被继承以提供在Linux环境中很难看到的大量的线程方面的功能。

ZThreads

参考网站:http://zthread.sourceforge.net/

一个先进的面向对象,跨平台的C++线程和同步库。

 

序列化

s11n

参考网站:http://s11n.net/

一个基于STLC++库,用于序列化PODSTL容器以及用户定义的类型。

Simple XML Persistence Library

参考网站:http://sxp.sourceforge.net/

这是一个把对象序列化为XML的轻量级的C++库。

 

字符串

C++ Str Library

参考网站:http://www.utilitycode.com/str/

操作字符串和字符的库,支持Windows和支持gcc的多种平台。提供高度优化的代码,并且支持多线程环境和Unicode,同时还有正则表达式的支持。

Common Text Transformation Library

参考网站:http://cttl.sourceforge.net/

这是一个解析和修改STL字符串的库。CTTL substring类可以用来比较,插入,替换以及用EBNF的语法进行解析。

GRETA

参考网站:http://research.microsoft.com/projects/greta/

这是由微软研究院的研究人员开发的处理正则表达式的库。在小型匹配的情况下有非常优秀的表现。

 

综合

P::Classes

参考网站:http://pclasses.com/

一个高度可移植的C++应用程序框架。当前关注类型和线程安全的signal/slot机制,i/o系统包括基于插件的网络协议透明的i/o架构,基于插件的应用程序消息日志框架,访问sql数据库的类等等。

ACDK - Artefaktur Component Development Kit

参考网站:http://acdk.sourceforge.net/

这是一个平台无关的C++组件框架,类似于Java或者.NET中的框架(反射机制,线程,Unicode,废料收集,I/O,网络,实用工具,XML,等等),以及对Java, Perl, Python, TCL, Lisp, COM CORBA的集成。

dlib C++ library

参考网站:http://www.cis.ohio-state.edu/~kingd/dlib/

各种各样的类的一个综合。大整数,Socket,线程,GUI,容器类,以及浏览目录的API等等。

Chilkat C++ Libraries

参考网站:http://www.chilkatsoft.com/cpp_libraries.asp

这是提供zipe-mail,编码,S/MIMEXML等方面的库。

C++ Portable Types Library (PTypes)

参考网站:http://www.melikyan.com/ptypes/

这是STL的比较简单的替代品,以及可移植的多线程和网络库。

LFC

参考网站:http://lfc.sourceforge.net/

哦,这又是一个尝试提供一切的C++

 

其他库

Loki

参考网站:http://www.moderncppdesign.com/

哦,你可能抱怨我早该和Boost一起介绍它,一个实验性质的库。作者在loki中把C++模板的功能发挥到了极致。并且尝试把类似设计模式这样思想层面的东西通过库来提供。同时还提供了智能指针这样比较实用的功能。

ATL

ATL(Active Template Library)是一组小巧、高效、灵活的类,这些类为创建可互操作的COM组件提供了基本的设施。

FC++: The Functional C++ Library

这个库提供了一些函数式语言中才有的要素。属于用库来扩充语言的一个代表作。如果想要在OOP之外寻找另一分的乐趣,可以去看看函数式程序设计的世界。大师Peter Norvig “Teach Yourself Programming in Ten Years”一文中就将函数式语言列为至少应当学习的6类编程语言之一。

FACT!

参考网站:http://www.kfa-juelich.de/zam/FACT/start/index.html

         另外一个实现函数式语言特性的库

Crypto++

提供处理密码,消息验证,单向hash,公匙加密系统等功能的免费库。

还有很多非常激动人心或者是极其实用的C++库,限于我们的水平以及文章的篇幅不能包括进来。在对于这些已经包含近来的库的介绍中,由于并不是每一个我们都使用过,所以难免有偏颇之处,请读者见谅。

书籍

以前熊节先生曾撰文评论相对于Java程序设计语言,C++的好书多如牛毛。荣耀先生在《程序员》杂志上撰文《C++程序设计之四书五经》也将本领域内几乎所有的经典书籍作了全面的介绍,任何关于书的评论此时看来便是很多余的了。个人浅见,除非你打算以C++作为唯一兴趣或者生存之本,一般读者确实没有足够的时间和必要将20余本书籍全部阅读。更有参考价值的是荣耀先生的另一篇文章:《至少应该阅读的九本C++著作》,可以从下面的地址浏览到此文:

http://www.royaloo.com/articles/articles_2003/9CppBooks.htm

下面几本书对于走在C++初学之路上的读者是我们最愿意推荐给大家的:

C++ Primer

哦,也许你会抱怨我们为什么不先介绍TCPL,但对于走在学习之路上的入门者,本书内容更为全面,更为详细易懂,我们称它为“C++的超级宝典”并不过分。配有一本不错的习题解答《C++ Primer Answer Book》可以辅助你的学习之路。

Essential C++

如果说《C++ Primer》是C++领域的超级宝典,那么此书作为掌握C++的大局观当之无愧。正如《.NET大局观》一书能够让读者全揽.NET,本书讲述了C++中最核心的全部主题。书虽不厚,内容精炼,不失为《C++ Primer》读者茶余饭后的主题回顾之作。

The C++ Programming Language

Bjarne为你带来的C++教程,真正能够告诉你怎么用才叫真正的C++的唯一一本书。虽然如同“某某程序设计语言”这样的书籍会给大家一个内容全揽,入门到精通的感觉,但本书确实不太适合初学者阅读。如果你自认为是一名很有经验的C++程序员,那至少也要反复咀嚼Bjarne先生所强调的若干内容。

Effective C++》,《More Effective C++

是的,正如一些C++爱好者经常以读过与没有读过上述两本作品来区分你是否是C++高手。我们也极力推崇这两本著作。在各种介绍C++专家经验的书籍里面,这两本是最贴近语言本质,看后最能够有脱胎换骨感觉的书,读此书你需每日三省汝身。

技术书籍仁者见仁,过多的评论反无太多意义,由读者喜好选择最适合自己的书方为上策。

资源网站

正如我们可以通过计算机历史上的重要人物了解计算机史的发展,C++相关人物的网站也可以使我们得到最有价值的参考与借鉴,下面的人物我们认为没有介绍的必要,只因下面的人物在C++领域的地位众所周知,我们只将相关的资源进行罗列以供读者学习,他们有的工作于贝尔实验室,有的工作于知名编译器厂商,有的在不断推进语言的标准化,有的为读者撰写了多部千古奇作……

Bjarne Stroustrup  http://www.research.att.com/~bs/

Stanley B. Lippman

http://blogs.msdn.com/slippman/(中文版http://www.zengyihome.net/slippman/index.htm)

Scott Meyers  http://www.aristeia.com/

David Musser  http://www.cs.rpi.edu/~musser/

Bruce Eckel  http://www.bruceeckel.com

Nicolai M. Josuttis  http://www.josuttis.com/

Herb Sutter  http://www.gotw.ca/

Andrei Alexandrescu  http://www.moderncppdesign.com/

侯捷先生  http://www.jjhou.com

孟岩先生  先生繁忙于工作,痴迷于技术,暂无个人主页,关于先生的作品可以通过CSDN的专栏和侯先生的主页访问到。

荣耀先生  http://www.royaloo.com/

潘爱民先生  http://www.icst.pku.edu.cn/panaimin/pam_homepage.htm

除了上述大师的主页外,以下的综合类C++学习参考站点是我们非常愿意向大家推荐的:

CodeProject  http://www.codeproject.com

CodeGuru  http://www.codeguru.com

Dr. Dobb's Journal  http://www.ddj.com

C/C++ Users Journal  http://www.cuj.com

C维视点  http://www.c-view.org

allaboutprogram  http://www.allaboutprogram.com

 

其他资料

ISO IEC JTC1/SC22/WG21 - C++:标准C++的权威参考

http://anubis.dkuug.dk/jtc1/sc22/wg21/

C++ FAQ LITE — Frequently Asked Questions: 最为全面的C++FAQ

http://www.sunistudio.com/cppfaq/index.html

C/C++ 新闻组

你不妨尝试从这里提问和回答问题,很多不错的Q&A资源......

.alt.comp.lang.learn.c-c++ 

这个简单些,如果你和我一样是个菜鸟

.comp.lang.c++.moderated

嗯,这个显然水平高一些

.comp.std.c++

如果你需要讨论标准C++相关话题的话

不得不写的结束语

结束的时候也是总结现状,展望未来的时候。虽然C++从脱胎于C开始,一路艰难坎坷的走过来,但是无论如何C++已经取得了工业基础的地位。文章列举的大量相关资源就是最好的证明,而业界的大量用C++写成的产品代码以及大量的C++职业工程师则是最直接的证明。同时,我们可以看到各个高校的计算机专业都开设有C++这门课程,网络上对于C++的学习讨论也从来都没有停过。但是,在Java.NET两大企业开发平台的围攻下,给人的感觉是C++越来越“不行”了。

C++在面向企业的软件开发中,在开发便捷性等方面的确要比JavaC#差很多,其中一个问题是C++语言本身比较复杂,学习曲线比较陡峭,另外一个问题是C++标准化的时间太长,丧失了很多的壮大机会,耗费了很多精力在厂商的之间的斗争上,而C++的标准库离一个完善的程序开发框架还缺少太多太多的内容,各个第三方的类库和框架又在一致性和完整性上没法和随平台提供的框架相提并论。难道C++真的要退出历史舞台了?

C++目前的活跃程度,以及应用现状来说是完全能够肯定C++仍然是软件工业的基础,也不会退出历史舞台的。另外从BoostLoki这些库中我们也能够看到C++的发展非常活跃,对于新技术新思维非常激进,C++仍然广泛受到关注。从ACE在高性能通信领域的应用,以及MTL这样的库在数值计算领域的出色表现,我们可以看到C++在高性能应用场合下的不可替代的作用,而嵌入式系统这样的内存受限开发平台,比如Symbian OS上,C++已经发挥着并且将发挥更大的作用。可以预见的是以后的软件无论上层的应用怎么变,它的底层核心都会是由C/C++这样的系统级软件编写的,比如Java虚拟机,.NET Framwork。因为只有这样的系统级软件才能完全彻底的发挥机器的功能。

需要看到的是两个趋势,一个趋势是C++变得更加复杂,更加学院派,通过模板等有潜力的语法因素构造越来越精巧的库成为了现代C++的热点,虽然在利用库实现新的编程范式,乃至设计模式等方面很有开创意义,也确实产生了一些能够便捷开发的工具,但是更多的是把C++变得更加强大,更加复杂,也更加难懂,似乎也更加学院派,不得不说它正在向边缘化道路发展。另一个趋势是C++在主流的企业应用开发中已经逐渐退出了,ERP这样的企业软件开发中基本上不会考虑C++,除非需要考虑性能或者和遗留代码的集成这些因素。C++退守到系统级别语言,成为软件工业的基础是大势所趋。然而反思一下,真的是退守么?自从STL出现,无数的人风起云涌的开始支持C++,他们狂呼“我看到深夜消失了,目标软件工程的出现。我看到了可维护的代码。”是的,STL在可维护性下做得如此出色。但是又怎样呢?STLC++铺平了现代软件工程的道路,而在上层应用程序软件开发领域这块场地早不单独属于C++,很多程序设计语言都做得很出色,疯狂的支持者会毫不犹豫地说我们应当支持C++,因为它是世界上最棒的语言。而坦率地说,你的腰杆真的那么硬么?也许只是在逃避一些事实。C++是优秀的,这不可否认,STL的出现让C++一度走上了最辉煌的时刻,然而现在看来……我的一位恩师曾言:真正能够将STL应用得淋漓尽致的人很保守地说国内也不超过200人,或许不加入STL能够使C++向着它应当发展的方向发展的更好,而现在看来,C++也应当回首到真正属于他的那一片圣地上……

参考资料

本文成文时参考了以下资源:

1、《程序员》20042月,3月,“C++ 程序设计之四书五经” 荣耀

2、水木清华BBS C++版精华区

3http://jjhou.csdn.net

4http://www.royaloo.com

5http://www.zengyihome.net

6C/C++ 开发人员:充实您的 XML 工具箱

http://www-900.ibm.com/developerWorks/cn/xml/x-ctlbx/index.shtml

 

C++资源之不完全导引 []

 

撰文/ 曾毅 陶文

最后更新:2004612

声明:

.本文20045月首发于《CSDN开发高手》,版权归该杂志与《程序员》杂志社所有。杂志限于篇幅部分内容有所删节,此处版本为相对完整版本。

.本文为介绍性文章,会随笔者学习C++语言不断更新。

C++中,库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论。现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级到重量级的都有。不少都是让人眼界大开,亦或是望而生叹的思维杰作。由于库的数量非常庞大,而且限于笔者水平,其中很多并不了解。所以文中所提的一些库都是比较著名的大型库。

标准库

标准库中提供了C++程序的基本设施。虽然C++标准库随着C++标准折腾了许多年,直到标准的出台才正式定型,但是在标准库的实现上却很令人欣慰得看到多种实现,并且已被实践证明为有工业级别强度的佳作。

1   Dinkumware C++ Library

参考站点:http://www.dinkumware.com/

P.J. Plauger编写的高品质的标准库。P.J. Plauger博士是Dr. Dobb's程序设计杰出奖的获得者。其编写的库长期被Microsoft采用,并且最近Borland也取得了其OEMlicense,在其C/C++的产品中采用Dinkumware的库。

2   RogueWave Standard C++ Library

参考站点:http://www.roguewave.com/

这个库在Borland C++ Builder的早期版本中曾经被采用,后来被其他的库给替换了。笔者不推荐使用。

3SGI STL

参考站点:http://www.roguewave.com/

SGI公司的C++标准模版库。

4STLport

参考站点:http://www.stlport.org/

SGI STL库的跨平台可移植版本。

 

准标准库——Boost

Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,在C++社区中影响甚大,其成员已近2000人。 Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的标准库。

Boost中比较有名气的有这么几个库:

Regex

正则表达式库

Spirit

LL parser framework,用C++代码直接表达EBNF

Graph

图组件和算法

Lambda

在调用的地方定义短小匿名的函数对象,很实用的functional功能

concept check

检查泛型编程中的concept

Mpl

用模板实现的元编程框架

Thread

可移植的C++多线程库

Python

C++类和函数映射到Python之中

Pool

内存池管理

smart_ptr

5个智能指针,学习智能指针必读,一份不错的参考是来自CUJ的文章:

Smart Pointers in Boost,哦,这篇文章可以查到,CUJ是提供在线浏览的。中文版见笔者在《Dr. Dobb's Journal软件研发杂志》第7辑上的译文。

Boost总体来说是实用价值很高,质量很高的库。并且由于其对跨平台的强调,对标准C++的强调,是编写平台无关,现代C++的开发者必备的工具。但是Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎。并且很多Boost中的库功能堪称对语言功能的扩展,其构造用尽精巧的手法,不要贸然的花费时间研读。Boost另外一面,比如Graph这样的库则是具有工业强度,结构良好,非常值得研读的精品代码,并且也可以放心的在产品代码中多多利用。

参考站点:http://www.boost.org(国内镜像:http://www.c-view.org/tech/lib/boost/index.htm

GUI

在众多C++的库中,GUI部分的库算是比较繁荣,也比较引人注目的。在实际开发中,GUI库的选择也是非常重要的一件事情,下面我们综述一下可选择的GUI库,各自的特点以及相关工具的支持。

1   MFC

大名鼎鼎的微软基础类库(Microsoft Foundation Class)。大凡学过VC++的人都应该知道这个库。虽然从技术角度讲,MFC是不大漂亮的,但是它构建于Windows API 之上,能够使程序员的工作更容易,编程效率高,减少了大量在建立 Windows 程序时必须编写的代码,同时它还提供了所有一般 C++ 编程的优点,例如继承和封装。MFC 编写的程序在各个版本的Windows操作系统上是可移植的,例如,在 Windows 3.1下编写的代码可以很容易地移植到 Windows NT Windows 95 上。但是在最近发展以及官方支持上日渐势微。

 

2   QT

参考网站:http://www.trolltech.com/

QtTrolltech公司的一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的很容易扩展,并且允许真正地组件编程。自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE 的基础,同时它还支持WindowsMacintoshUnix/X11等多种平台。

 

3WxWindows

参考网站:http://www.wxwindows.org/

跨平台的GUI库。因为其类层次极像MFC,所以有文章介绍从MFCWxWindows的代码移植以实现跨平台的功能。通过多年的开发也是一个日趋完善的GUI库,支持同样不弱于前面两个库。并且是完全开放源代码的。新近的C++ Builder XGUI设计器就是基于这个库的。

4Fox

开放源代码的GUI库。作者从自己亲身的开发经验中得出了一个理想的GUI库应该是什么样子的感受出发,从而开始了对这个库的开发。有兴趣的可以尝试一下。

参考网站:http://www.fox-toolkit.org/

5   WTL

基于ATL的一个库。因为使用了大量ATL的轻量级手法,模板等技术,在代码尺寸,以及速度优化方面做得非常到位。主要面向的使用群体是开发COM轻量级供网络下载的可视化控件的开发者。

6   GTK

参考网站:http://gtkmm.sourceforge.net/

GTK是一个大名鼎鼎的C的开源GUI库。在Linux世界中有Gnome这样的杀手应用。而GTK就是这个库的C++封装版本。

 

网络通信

ACE

参考网站:http://www.cs.wustl.edu/~schmidt/ACE.html

C++库的代表,超重量级的网络通信开发框架。ACE自适配通信环境(Adaptive Communication Environment)是可以自由使用、开放源代码的面向对象框架,在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++包装外观(Wrapper Facade)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。

StreamModule

参考网站:http://www.omnifarious.org/StrMod/

设计用于简化编写分布式程序的库。尝试着使得编写处理异步行为的程序更容易,而不是用同步的外壳包起异步的本质。

SimpleSocket

参考网站:http://home.hetnet.nl/~lcbokkers/simsock.htm

这个类库让编写基于socket的客户/服务器程序更加容易。

A Stream Socket API for C++

参考网站:http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html

又一个对Socket的封装库。

XML

Xerces

参考网站:http://xml.apache.org/xerces-c/

Xerces-C++ 是一个非常健壮的XML解析器,它提供了验证,以及SAXDOM APIXML验证在文档类型定义(Document Type DefinitionDTD)方面有很好的支持,并且在200112月增加了支持W3C XML Schema 的基本完整的开放标准。

XMLBooster

参考网站:http://www.xmlbooster.com/

这个库通过产生特制的parser的办法极大的提高了XML解析的速度,并且能够产生相应的GUI程序来修改这个parser。在DOMSAX两大主流XML解析办法之外提供了另外一个可行的解决方案。

Pull Parser

         参考网站:http://www.extreme.indiana.edu/xgws/xsoap/xpp/

         这个库采用pull方法的parser。在每个SAXparser底层都有一个pullparser,这个xpp把这层暴露出来直接给大家使用。在要充分考虑速度的时候值得尝试。

Xalan

         参考网站:http://xml.apache.org/xalan-c/

         Xalan是一个用于把XML文档转换为HTML,纯文本或者其他XML类型文档的XSLT处理器。

CMarkup

         参考网站:http://www.firstobject.com/xml.htm

         这是一种使用EDOMXML解析器。在很多思路上面非常灵活实用。值得大家在DOMSAX之外寻求一点灵感。

libxml++

http://libxmlplusplus.sourceforge.net/

libxml++是对著名的libxml XML解析器的C++封装版本

 

科学计算

Blitz++

参考网站:http://www.oonumerics.org/blitz/

Blitz++ 是一个高效率的数值计算函数库,它的设计目的是希望建立一套既具像C++ 一样方便,同时又比Fortran速度更快的数值计算环境。通常,用C++所写出的数值程序,比 Fortran20%左右,因此Blitz++正是要改掉这个缺点。方法是利用C++template技术,程序执行甚至可以比Fortran更快。Blitz++目前仍在发展中,对于常见的SVDFFTsQMRES等常见的线性代数方法并不提供,不过使用者可以很容易地利用Blitz++所提供的函数来构建。

POOMA

参考网站:http://www.codesourcery.com/pooma/pooma

POOMA是一个免费的高性能的C++库,用于处理并行式科学计算。POOMA的面向对象设计方便了快速的程序开发,对并行机器进行了优化以达到最高的效率,方便在工业和研究环境中使用。

MTL

参考网站:http://www.osl.iu.edu/research/mtl/

Matrix Template Library(MTL)是一个高性能的泛型组件库,提供了各种格式矩阵的大量线性代数方面的功能。在某些应用使用高性能编译器的情况下,比如Intel的编译器,从产生的汇编代码可以看出其与手写几乎没有两样的效能。

CGAL

参考网站:www.cgal.org

Computational Geometry Algorithms Library的目的是把在计算几何方面的大部分重要的解决方案和方法以C++库的形式提供给工业和学术界的用户。

 

游戏开发

Audio/Video 3D C++ Programming Library

参考网站:http://www.galacticasoftware.com/products/av/

AV3D是一个跨平台,高性能的C++库。主要的特性是提供3D图形,声效支持(SB,以及S3M),控制接口(键盘,鼠标和遥感),XMS

KlayGE

参考网站:http://home.g365.net/enginedev/

国内游戏开发高手自己用C++开发的游戏引擎。KlayGE是一个开放源代码、跨平台的游戏引擎,并使用Python作脚本语言。KlayGELGPL协议下发行。感谢龚敏敏先生为中国游戏开发事业所做出的贡献。

OGRE

参考网站:http://www.ogre3d.org

OGRE(面向对象的图形渲染引擎)是用C++开发的,使用灵活的面向对象3D引擎。它的目的是让开发者能更方便和直接地开发基于3D硬件设备的应用程序或游戏。引擎中的类库对更底层的系统库(如:Direct3DOpenGL)的全部使用细节进行了抽象,并提供了基于现实世界对象的接口和其它类。

 

线程

C++ Threads

参考网站:http://threads.sourceforge.net/

这个库的目标是给程序员提供易于使用的类,这些类被继承以提供在Linux环境中很难看到的大量的线程方面的功能。

ZThreads

参考网站:http://zthread.sourceforge.net/

一个先进的面向对象,跨平台的C++线程和同步库。

 

序列化

s11n

参考网站:http://s11n.net/

一个基于STLC++库,用于序列化PODSTL容器以及用户定义的类型。

Simple XML Persistence Library

参考网站:http://sxp.sourceforge.net/

这是一个把对象序列化为XML的轻量级的C++库。

 

字符串

C++ Str Library

参考网站:http://www.utilitycode.com/str/

操作字符串和字符的库,支持Windows和支持gcc的多种平台。提供高度优化的代码,并且支持多线程环境和Unicode,同时还有正则表达式的支持。

Common Text Transformation Library

参考网站:http://cttl.sourceforge.net/

这是一个解析和修改STL字符串的库。CTTL substring类可以用来比较,插入,替换以及用EBNF的语法进行解析。

GRETA

参考网站:http://research.microsoft.com/projects/greta/

这是由微软研究院的研究人员开发的处理正则表达式的库。在小型匹配的情况下有非常优秀的表现。

 

综合

P::Classes

参考网站:http://pclasses.com/

一个高度可移植的C++应用程序框架。当前关注类型和线程安全的signal/slot机制,i/o系统包括基于插件的网络协议透明的i/o架构,基于插件的应用程序消息日志框架,访问sql数据库的类等等。

ACDK - Artefaktur Component Development Kit

参考网站:http://acdk.sourceforge.net/

这是一个平台无关的C++组件框架,类似于Java或者.NET中的框架(反射机制,线程,Unicode,废料收集,I/O,网络,实用工具,XML,等等),以及对Java, Perl, Python, TCL, Lisp, COM CORBA的集成。

dlib C++ library

参考网站:http://www.cis.ohio-state.edu/~kingd/dlib/

各种各样的类的一个综合。大整数,Socket,线程,GUI,容器类,以及浏览目录的API等等。

Chilkat C++ Libraries

参考网站:http://www.chilkatsoft.com/cpp_libraries.asp

这是提供zipe-mail,编码,S/MIMEXML等方面的库。

C++ Portable Types Library (PTypes)

参考网站:http://www.melikyan.com/ptypes/

这是STL的比较简单的替代品,以及可移植的多线程和网络库。

LFC

参考网站:http://lfc.sourceforge.net/

哦,这又是一个尝试提供一切的C++

 

其他库

Loki

参考网站:http://www.moderncppdesign.com/

哦,你可能抱怨我早该和Boost一起介绍它,一个实验性质的库。作者在loki中把C++模板的功能发挥到了极致。并且尝试把类似设计模式这样思想层面的东西通过库来提供。同时还提供了智能指针这样比较实用的功能。

ATL

ATL(Active Template Library)是一组小巧、高效、灵活的类,这些类为创建可互操作的COM组件提供了基本的设施。

FC++: The Functional C++ Library

这个库提供了一些函数式语言中才有的要素。属于用库来扩充语言的一个代表作。如果想要在OOP之外寻找另一分的乐趣,可以去看看函数式程序设计的世界。大师Peter Norvig “Teach Yourself Programming in Ten Years”一文中就将函数式语言列为至少应当学习的6类编程语言之一。

FACT!

参考网站:http://www.kfa-juelich.de/zam/FACT/start/index.html

         另外一个实现函数式语言特性的库

Crypto++

提供处理密码,消息验证,单向hash,公匙加密系统等功能的免费库。

还有很多非常激动人心或者是极其实用的C++库,限于我们的水平以及文章的篇幅不能包括进来。在对于这些已经包含近来的库的介绍中,由于并不是每一个我们都使用过,所以难免有偏颇之处,请读者见谅。

书籍

以前熊节先生曾撰文评论相对于Java程序设计语言,C++的好书多如牛毛。荣耀先生在《程序员》杂志上撰文《C++程序设计之四书五经》也将本领域内几乎所有的经典书籍作了全面的介绍,任何关于书的评论此时看来便是很多余的了。个人浅见,除非你打算以C++作为唯一兴趣或者生存之本,一般读者确实没有足够的时间和必要将20余本书籍全部阅读。更有参考价值的是荣耀先生的另一篇文章:《至少应该阅读的九本C++著作》,可以从下面的地址浏览到此文:

http://www.royaloo.com/articles/articles_2003/9CppBooks.htm

下面几本书对于走在C++初学之路上的读者是我们最愿意推荐给大家的:

C++ Primer

哦,也许你会抱怨我们为什么不先介绍TCPL,但对于走在学习之路上的入门者,本书内容更为全面,更为详细易懂,我们称它为“C++的超级宝典”并不过分。配有一本不错的习题解答《C++ Primer Answer Book》可以辅助你的学习之路。

Essential C++

如果说《C++ Primer》是C++领域的超级宝典,那么此书作为掌握C++的大局观当之无愧。正如《.NET大局观》一书能够让读者全揽.NET,本书讲述了C++中最核心的全部主题。书虽不厚,内容精炼,不失为《C++ Primer》读者茶余饭后的主题回顾之作。

The C++ Programming Language

Bjarne为你带来的C++教程,真正能够告诉你怎么用才叫真正的C++的唯一一本书。虽然如同“某某程序设计语言”这样的书籍会给大家一个内容全揽,入门到精通的感觉,但本书确实不太适合初学者阅读。如果你自认为是一名很有经验的C++程序员,那至少也要反复咀嚼Bjarne先生所强调的若干内容。

Effective C++》,《More Effective C++

是的,正如一些C++爱好者经常以读过与没有读过上述两本作品来区分你是否是C++高手。我们也极力推崇这两本著作。在各种介绍C++专家经验的书籍里面,这两本是最贴近语言本质,看后最能够有脱胎换骨感觉的书,读此书你需每日三省汝身。

技术书籍仁者见仁,过多的评论反无太多意义,由读者喜好选择最适合自己的书方为上策。

资源网站

正如我们可以通过计算机历史上的重要人物了解计算机史的发展,C++相关人物的网站也可以使我们得到最有价值的参考与借鉴,下面的人物我们认为没有介绍的必要,只因下面的人物在C++领域的地位众所周知,我们只将相关的资源进行罗列以供读者学习,他们有的工作于贝尔实验室,有的工作于知名编译器厂商,有的在不断推进语言的标准化,有的为读者撰写了多部千古奇作……

Bjarne Stroustrup  http://www.research.att.com/~bs/

Stanley B. Lippman

http://blogs.msdn.com/slippman/(中文版http://www.zengyihome.net/slippman/index.htm)

Scott Meyers  http://www.aristeia.com/

David Musser  http://www.cs.rpi.edu/~musser/

Bruce Eckel  http://www.bruceeckel.com

Nicolai M. Josuttis  http://www.josuttis.com/

Herb Sutter  http://www.gotw.ca/

Andrei Alexandrescu  http://www.moderncppdesign.com/

侯捷先生  http://www.jjhou.com

孟岩先生  先生繁忙于工作,痴迷于技术,暂无个人主页,关于先生的作品可以通过CSDN的专栏和侯先生的主页访问到。

荣耀先生  http://www.royaloo.com/

潘爱民先生  http://www.icst.pku.edu.cn/panaimin/pam_homepage.htm

除了上述大师的主页外,以下的综合类C++学习参考站点是我们非常愿意向大家推荐的:

CodeProject  http://www.codeproject.com

CodeGuru  http://www.codeguru.com

Dr. Dobb's Journal  http://www.ddj.com

C/C++ Users Journal  http://www.cuj.com

C维视点  http://www.c-view.org

allaboutprogram  http://www.allaboutprogram.com

 

其他资料

ISO IEC JTC1/SC22/WG21 - C++:标准C++的权威参考

http://anubis.dkuug.dk/jtc1/sc22/wg21/

C++ FAQ LITE — Frequently Asked Questions: 最为全面的C++FAQ

http://www.sunistudio.com/cppfaq/index.html

C/C++ 新闻组

你不妨尝试从这里提问和回答问题,很多不错的Q&A资源......

.alt.comp.lang.learn.c-c++ 

这个简单些,如果你和我一样是个菜鸟

.comp.lang.c++.moderated

嗯,这个显然水平高一些

.comp.std.c++

如果你需要讨论标准C++相关话题的话

不得不写的结束语

结束的时候也是总结现状,展望未来的时候。虽然C++从脱胎于C开始,一路艰难坎坷的走过来,但是无论如何C++已经取得了工业基础的地位。文章列举的大量相关资源就是最好的证明,而业界的大量用C++写成的产品代码以及大量的C++职业工程师则是最直接的证明。同时,我们可以看到各个高校的计算机专业都开设有C++这门课程,网络上对于C++的学习讨论也从来都没有停过。但是,在Java.NET两大企业开发平台的围攻下,给人的感觉是C++越来越“不行”了。

C++在面向企业的软件开发中,在开发便捷性等方面的确要比JavaC#差很多,其中一个问题是C++语言本身比较复杂,学习曲线比较陡峭,另外一个问题是C++标准化的时间太长,丧失了很多的壮大机会,耗费了很多精力在厂商的之间的斗争上,而C++的标准库离一个完善的程序开发框架还缺少太多太多的内容,各个第三方的类库和框架又在一致性和完整性上没法和随平台提供的框架相提并论。难道C++真的要退出历史舞台了?

C++目前的活跃程度,以及应用现状来说是完全能够肯定C++仍然是软件工业的基础,也不会退出历史舞台的。另外从BoostLoki这些库中我们也能够看到C++的发展非常活跃,对于新技术新思维非常激进,C++仍然广泛受到关注。从ACE在高性能通信领域的应用,以及MTL这样的库在数值计算领域的出色表现,我们可以看到C++在高性能应用场合下的不可替代的作用,而嵌入式系统这样的内存受限开发平台,比如Symbian OS上,C++已经发挥着并且将发挥更大的作用。可以预见的是以后的软件无论上层的应用怎么变,它的底层核心都会是由C/C++这样的系统级软件编写的,比如Java虚拟机,.NET Framwork。因为只有这样的系统级软件才能完全彻底的发挥机器的功能。

需要看到的是两个趋势,一个趋势是C++变得更加复杂,更加学院派,通过模板等有潜力的语法因素构造越来越精巧的库成为了现代C++的热点,虽然在利用库实现新的编程范式,乃至设计模式等方面很有开创意义,也确实产生了一些能够便捷开发的工具,但是更多的是把C++变得更加强大,更加复杂,也更加难懂,似乎也更加学院派,不得不说它正在向边缘化道路发展。另一个趋势是C++在主流的企业应用开发中已经逐渐退出了,ERP这样的企业软件开发中基本上不会考虑C++,除非需要考虑性能或者和遗留代码的集成这些因素。C++退守到系统级别语言,成为软件工业的基础是大势所趋。然而反思一下,真的是退守么?自从STL出现,无数的人风起云涌的开始支持C++,他们狂呼“我看到深夜消失了,目标软件工程的出现。我看到了可维护的代码。”是的,STL在可维护性下做得如此出色。但是又怎样呢?STLC++铺平了现代软件工程的道路,而在上层应用程序软件开发领域这块场地早不单独属于C++,很多程序设计语言都做得很出色,疯狂的支持者会毫不犹豫地说我们应当支持C++,因为它是世界上最棒的语言。而坦率地说,你的腰杆真的那么硬么?也许只是在逃避一些事实。C++是优秀的,这不可否认,STL的出现让C++一度走上了最辉煌的时刻,然而现在看来……我的一位恩师曾言:真正能够将STL应用得淋漓尽致的人很保守地说国内也不超过200人,或许不加入STL能够使C++向着它应当发展的方向发展的更好,而现在看来,C++也应当回首到真正属于他的那一片圣地上……

参考资料

本文成文时参考了以下资源:

1、《程序员》20042月,3月,“C++ 程序设计之四书五经” 荣耀

2、水木清华BBS C++版精华区

3http://jjhou.csdn.net

4http://www.royaloo.com

5http://www.zengyihome.net

6C/C++ 开发人员:充实您的 XML 工具箱

http://www-900.ibm.com/developerWorks/cn/xml/x-ctlbx/index.shtml

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++资源之不完全导引 的相关文章

  • 在Ubuntu中安装Chrome浏览器

    Chrome 简介 Google Chrome是由Google开发的一款设计简单 高效的Web浏览工具 Google Chrome的特点是简洁 快速 GoogleChrome支持多标签浏览 xff0c 每个标签页面都在独立的 沙箱 内运行
  • STM32H747 / STM32H745 简单测试

    目录 1 简介 2 datasheet关键点介绍 2 1 PWR 3 资料说明 4 例程运行 4 1 选择CM7作为项目工程对象 xff0c 并编译下载程序 4 2 同理编译CM4项目对象 4 3 编译结果说明 参考链接 1 简介 STM3
  • NUCLEO STM32H743购买和使用说明

    摘要 STM32H743的NUCLEO板子有两种 xff0c 对应不同的PCB电路 xff0c 使用方式也有所不同 本文将对这两款评估板进行比较 xff0c 并给出参考资料和选择建议 两款板子的资料可以在ST官网上下 xff0c 分别是MB
  • 关于硬盘数据恢复的一些思考

    我平时会将数据保存在两台电脑和两个移动硬盘上 xff0c 但由于假期回家 xff0c IDE软件用起来容易崩 xff0c 于是决定重装下系统 xff0c 但发现USB启动盘找不到了 xff0c 便将移动硬盘隔分了小的个新逻辑卷 xff0c
  • Simulink中的Simscape

    Simscape是在Simulink环境下创建物理系统模型的工具和语言 8 它可以通过基于Matlab语法的Simscape语法来制作自己的物理仿真系统 如果使用Simscape中现有的基础库 xff08 Foundation Librar
  • Matlab电路仿真

    电路仿真的工具有很多 xff0c 比如专业点的Pspice 本科时学习时经常使用 但问题是 xff0c 即使电信专业以后真的从事硬件设计的也寥寥无几 而为了进行简单的仿真还要多装个软件 xff0c 我能接收 xff0c 我的老电脑也接收不了
  • RK1126 平台环境搭建以及入坑指南(不不 应该是入门指南)

    手上有个RK1126的板子 如下图 采用的是底板 43 核心板 xff0c 摄像头是OS04a10 简单做个记录 相比与海思的sdk 和example RK1126 的sdk 和example 功能更丰富一些 基本的rtsp 什么的 都已经
  • 关于JSP开发中jsp页面调用DAO返回的ResultSet为空值完美解决方案

    不多说 问题蛮简单 直接上代码 关于ResultSet为空值的原因经我查阅资料 应该是因为在JSP页面的时候conn已经被释放掉了 因此对应的resultset也过期了 所以不能用 解决方案就是重新开辟一块内存存储它 用链表 关键代码 Li
  • 关系模式的基本概念

    为了更好地存储数据 xff0c 需要将现实世界的事物及其关系进行层层抽象 xff0c 从而得到数据模型 使用关系数据模型的数据库系统是现在的主流数据库系统 数据模型是数据库的框架 xff0c 该框架描述了数据及其联系的组织方式 表达方式和存
  • 惯性器件分析—— ICM-42688-P

    2019年年底新推出的一款很赞的IMU 陀螺特性 加计特性 相关链接 官网DataSheet xff1a https invensense tdk com download pdf icm 42688 p datasheet 两家IMU对比
  • vim学习导航

    vim学习曲线陡峭 xff0c 其实和开始学习键盘打字和双拼打字的过程差不多 以前练习打字是因为小学电脑课没游戏玩 xff0c 只能玩金山打字的 警察抓小偷 xff1b 学习双拼主要动力是为了打字手手不酸 xff0c 能尽量跟上思维速度 而
  • word论文格式调整

    目录 注意事项 论文框架搭建 论文分块 页边距 页眉 页脚 样式 默认样式 正文 标题 参考文献 致谢 目录 图表 参考文献 公式 最后 注意事项 1 使用同一个word版本编辑 xff0c 避免格式不兼容 本文可能不适用于WPS 本文用o
  • 符号编码与乱码问题

    目标 xff1a 解释符号与编码 xff0c 分析乱码问题 xff0c 于是就能明明白白地处理大多数符号乱码问题了 符号与编码 以C 43 43 为例 xff0c 符号A的 十进制 编码为65 即 39 A 39 为65 其中 xff0c
  • PWM变模拟信号(积分电路 )

    就是简单的积分电路 频率不变 xff0c 积分后的电平相当于把高电平的电压和对应的时间的面积 xff0c 平均到一个周期里 基本上占空比是50 xff0c 转换的电压 xff0c 就是最高电压的50 xff0c 占空比30 xff0c 模拟
  • 如何生成汇编代码文件

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • Ardupilot SITL——arducopter 操作步骤

    打开cygwin输入 cd ardupilot ArduCopter Tools autotest sim vehicle py map console xff08 默认master下版本arducopter xff0c 默认模拟 四轴 x
  • 3-catkin包介绍与构建

    本教程简单介绍ROS1的catkin包 至于为什么选择deepin而不是ROS通用的ubuntu 也仅仅是为了支持国产系统 鉴于本人水平有限 xff0c 如哪位攻城狮网友发现本文存在的问题 xff0c 烦请留言指正 xff0c 谢谢 cat
  • make与cmake入门

    文章目录 1 手动链接与编译2 make编译工具2 1 介绍makefile2 2 makefile三要素2 3 make工作原理2 4 实战案例1案例2案例3案例4 2 5 常见的自动化变量解析 3 使用cmake进行编译3 1 介绍cm
  • RK1126平台项目总结

    项目的大概流程是 从摄像头读数据然后经过ai分析 输出ai分析结果编码成2路venc的流 然后 起一个rtsp服务器 供后续模块 处理 但是从需求来看的话其实很简单 但是实际上做的时候还是会遇到一些坑的 程序起来之后会起一个http服务 等

随机推荐

  • Keil uVision5开发步骤备忘

    1 安装 2 授权 xff1a File gt License Management xff0c AddLIC 3 参照开发手册 xff0c 配置keil环境 xff1a 1 添加ET199模拟器 xff0c 复制SDK里的ET199Sim
  • 使用杉川3i-T1单线激光雷达和Cartographer库SLAM问题及解决

    用Cartographer做二维的激光SLAM xff0c 用杉川给的ROS例子发布LaserScan数据 xff0c 发现在Rviz中显示的数据 xff0c 本来应该是平直的墙变成弧形的 xff0c 建图也是混乱的 xff0c 如下图 x
  • TI毫米波雷达 MIMO (2TX4RX)设置

    我们知道xWR1243和xWR1443 EVM是3TX4RX雷达 xff0c xWR1642 EVM是2TX4RX雷达 xff0c 我们不仅要掌握1TX4RX模式的使用还要学会使用MIMO雷达模式 本文主要介绍如何在mmWave Studi
  • 以Apollo为例学习/分析自动驾驶运动规划算法

    这篇文章写得很粗糙 xff0c 作为我入门学习的笔记 xff0c 其中的思路 分析很可能不正确 xff0c 也希望有在工业界工作的朋友能给我提出一些意见建议 这将是一篇大杂烩 xff0c 也是我一直在学习的主线 想要一下子整理清楚还是很困难
  • 二次规划(QP)与OSQP求解器

    目录 二次规划 xff08 QP xff09 OSQP 求解器 OSQP eigen接口 二次规划 xff08 QP xff09 优化在很多领域都发挥着重要应用 xff0c 其中自动驾驶的运动规划可以看做一个优化问题 xff0c 根据实际情
  • Jetson TX2 入门 ——介绍

    暑假留校 xff0c 老师给我们拿了两块开发板 xff0c 一个是英伟达的Jetson TX2 xff0c 一个是up squared xff0c 让我们先熟悉开发板 xff0c 为明年的比赛做准备 这两个板子是前几届学长做比赛用过的 自己
  • 2.1.2 激光雷达

    更多内容 xff0c 请关注 xff1a github xff1a Autopilot Updating Notes gitee Autopilot Updating Notes 激光雷达是自动驾驶领域非常依赖的传感器 xff0c 越来越多
  • 2.1.5 GPS定位导航

    更多内容 xff0c 请关注 xff1a github xff1a Autopilot Updating Notes gitee Autopilot Updating Notes GPS是Global Positioning System
  • ROS2 + Qt5 cmake的CMakeLists.txt文件配置

    ROS2 QT实现学习笔记 1 1 功能包的创建和编译 ROS2 Foxy 43 Qt5 on Linux Platform 按上面两个文章配置后的目录结构 build CMakeLists txt include mainwindow h
  • 计算思维:二进制串的校验

    题目 xff1a 待传输的二进制串为 1001111 xff0c 若采用偶校验 xff0c 需增加几位校验位才能判断出哪一位传输错误 xff0c 若传输过去变为 1011111 xff0c 则如何判断出是哪一位出错 xff1f 请描述判断过
  • RK1126实现画中画功能 picture in picture for RK 1126

    项目中需要将两个摄像头的流 合并成一个流 主摄像头显示大画面 副摄像头 显示在右上角 实现类似画中画的功能 摸索了下 需要将 从摄像头中取到的 yuv数据进行处理即可 rga模块提供了关于图像处理的一些接口 使用improcess实现图像的
  • QT之基于图形框架QGraphicsView实现链路图

    1 前言 最近因项目需求 xff0c 需要制作一个可以绘制树结构的 事件链 插件 xff0c 于是呼找到了QT自带的一个画流程图的例子 diagramscene xff0c 还在网上找到了另外一个例子 然后我结合了两个demo实现了我的 事
  • 毕业生如何写简历的内容

    毕业生如何写简历的内容 2003年10月14日 14 47 一份能吸引读者注意力的简历 xff0c 能创造面试的机会及增加录取的机率 xff0c 所以必须使它兼备简洁 有序 有个性且不失重点等特色 xff0c 万万不可繁琐冗杂 简历并没有固
  • Template Specialization

    See This in MSDN Library Page Options Conformance to ISO Standards for C 43 43 Kate Gregory Gregory Consulting April 200
  • 模糊控制

    模糊控制是以模糊集合理论为基础的一种新兴的控制手段 xff0c 它是模糊系统理 论和模糊技术与自动控制技术相结合的产物 自从这门科学诞生以来 xff0c 它产生了 许多探索性甚至是突破性的研究与应用成果 xff0c 同时 xff0c 这一方
  • 鲁棒控制——以静制动

    当今的自动控制技术都是基于反馈的概念 反馈理论的要素包括三个部分 xff1a 测量 比较和执行 测量关心的变量 xff0c 与期望值相比较 xff0c 用这个误差纠正调节控 制系统的响应 这个理论和应用自动控制的关键是 xff0c 做出正确
  • 自学电子技术的几个“要”

    学习电子技术 xff0c 基础构筑一定要牢靠 就说读图 xff0c 不能出错 xff0c 还要速度快 xff0c 要习惯成自然 检测元器件 xff0c 要坚持理论指导实践 xff0c 如测三极管 xff0c 理解了输入特性曲线及不同工作点在
  • 巧妙理解电气基础理论

    一 电与水相联系 电是看不见 摸不着 低压 的 xff0c 要想掌握它的特性 xff0c 全靠资料上的介绍和自己的想象 xff0c 确实难于理解 水是我们非常熟悉的 xff0c 它既看得见 xff0c 也模得着 xff0c 人们每天都离不开
  • 我们身边的人工智能应用

    人工智能是在计算机科学 控制论 信息论 心理学 语言学等多种学科相互渗透的基础发展起来的一门新兴边缘学科 xff0c 主要研究用用机器 xff08 主要是计算机 xff09 来模仿和实现人类的智能行为 xff0c 经过几十年的发展 xff0
  • C++资源之不完全导引

    C 43 43 资源之不完全导引作者 xff1a 曾毅 陶文 文章来源 xff1a csdn 点击数 xff1a lt script language 61 34 javascript 34 src 61 34 Article GetHit