以下是本人几年以来学习和开发中的一些积累和总结,欢迎讨论,欢迎B4.
1. 书籍:
Essential c++ : 入门书籍,读完可以开始写C++代码
The C++ Programe Language : C++之父的著作,无微不至,居家旅行必备良书。
C++ Primier : 非常完整的C++著作,不过不推荐入门阅读,参考书。
Effective C++: Scott Meyers作品,有一定功底以后再读,从此可以称为熟手。
More Effective C++: 与上篇一样。
Exceptional C++ : Herb Sutter作品,Scott Meyers学生,国外的博士就是不一样。
More Exceptional C++: 与上篇一样。
Modern C++ Design: Anders Alexandr著作,俺们最最佩服的神人之一。
Large-Scale C++ Software Design: 如果你需要参与设计20万行以上的软件,建议阅读,否则还是继续研究设计模式吧。
2. 连接
Newsgroup:comp.lang.c++ : 古老的新闻组,需要代理才能访问。如果跟我一样懒,不妨试试news.gmane.org,可以使用Outlook Express浏览。
CUJ : 读大牛们论文的好地方,不过2002年以后的更新都没啥好玩的了。强烈推荐"Generic<Programming>"系列,Anders Alexandr的范型专栏。
http://www.research.att.com/~bs/C++.html : Bjarne Stroustrup的C++联结页面,大量的C++联结信息。
3. 代码库
STL : C++的标准模板库,有好几种版本,其中以SGI(GCC默认)的版本最为好使,VC6所带版本最蹩脚。
Boost : 非常完善的跨平台C++库,提供智能指针,正则表达式,线程,字符串工具函数等好用的DD。很长时间了网站都没法访问,不过可以通过C-VIEW的镜像访问。
Loki : Anders Alexandr的代码库,设计精巧,提供智能指针,Functor,TypeList等。
QT : 本来是完美的C++ GUI库,可惜对于商业开发要收取版权费,动辄上千美元,惹不起。
Xerces : XML代码库,估计是除.Net Framework的System.XML外最好使的XML库了,对于C++程序员,如果需要完善的XML Core Level3支持,跨平台的,免费的XML库,那就是它了。不过体积可不小。
Xalan : XML XSLT支持库,配合Xerces使用,Apache的一贯传统,大而全。
TinyXml : 如果您的XML只需要支持Ansi和UTF8编码,只需要做些简单的XML解析,TinyXML是很好的选择,小而精。
ICU : IBM的Unicode实现,有JAVA和C++/C两种版本,支持各种编码,国际化和本地化功能,但是,很庞大,8M左右。
libiconv : GNU的UNICODE实现,提供各种字符集到UNICODE之间的转换功能,1M左右。
ACE: C++网络编程库,很完善,使用方便,适合开发服务器。提供网络通讯,消息队列,线程/进程池,各种互斥缩/信号量,以及一整套服务器开发框架,不过目前好像没有提供对epoll的支持。
cURL : 从名字可以看出来,c操作URL资源的库,完善支持HTTP,SHTTP,FTP等协议,比WinINet好使,与正在“烟酒”中的WinHTTP有一拼。
FreeImage: 非常完善的图像处理库,设计非常好,用插件的方式支持多种图像格式,GIF因版权问题除外。
IT++: 专业的数学库。
GC6.2: C++垃圾回收器,很好使。GCC自带,Mono中使的也是它。
libpdf : 生成PDF文件的库,可惜不能读入编辑PDF文件。
没事去www.sf.net上转转,说不定什么时间就出了极品。
4. 经典论题:
Smart Pointers in Boost : http://www.cuj.com/documents/s=8014/cuj0204karlsson/
Scope Guard : http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/alexandr.htm
Min Max: http://www.c-view.org/journal/007/gp_aa.htm,这是译文。
5. 编译器差异:
主要考虑两个编译器GCC和VC6,以及跨平台跨编译器代码中应该注意的一些问题。
1. VC6和GCC处理临时变量的const属性的不同处理,例程和解释请参考 这里 。
2. VC6和GCC对64位整数的扩展的差异。VC使用__int64,GCC使用long long.
3. VC6下的wchar_t为2个字节,GCC下wchar_t为4个字节。
4. VC6下对模板的支持bug很多,导致很多代码在VC6下无法编译,详细可以参考一下一个简单的列表。
5. VC6下使用__forceinline强制函数为inline,linux下没有办法,但是可以通个编译选项-finline-limit对编译器进行“强烈”建议。
6. VC6下使用#pragma comment(lib,libname)可以静态连接库文件,GCC下通过-I和-L选项在Link是连接库文件。
6. 个人观点:
强烈推荐Learning Standard C++ as a New Language(http://www.research.att.com/~bs/new_learning.pdf),Bjarne Stroustrup的
肺腑之言,就本人的所知,很多人都只是把C++当作带类的C来使,对一些基本的概念比较模糊,比如拷贝构造,赋值构造,深度拷贝,模板,
多重继承,虚集成等概念不大清楚,在代码中又无意中用到,bug也就随之而来。
忘记模板。STL很伟大,ATL很好使。但是模板实在是一把双刃剑,而且受伤的十有八九是自己。除非用于设计地层的代码库,
否则建议放弃使用模板,因为它,整个工程变得难以维护和调试。是的,可能你很熟悉,维护起来没有问题,可是不是每个人都是模板高手。
只有两个理由使用宏。第一个,为了优化代码。GCC没有强制INLINE的方法,导致使用宏是唯一确保可行的性能优化手段。其次,为了实现
一些没有宏就实现不了的功能,比如连接字符串(配合##使用),读取当前的行号(__LINE__)。这两种情况以外,建议不要使用宏,特别是
不要使用镶嵌宏,这种代码如果出现bug,只有上帝知道怎么解决。我曾经因为工作需要,花了一年时间维护一个50万代码行的软件,其中充斥
着各种设计精巧,动辄50行的宏。不错,这些宏确实大大减少了整个软件的代码行,可是,发现bug以后,我唯一的办法就是把这些宏重新展开
到函数中去,不然怎么调试?
项目一开始就对内存泄漏和资源泄漏进行跟踪,最好实现一些进行跟踪的辅助代码。本人曾经实现过一个,如果有兴趣,可以参考讨论,
连接如下。内存泄漏也可以使用一些工具,如bound checker,其它资源就只有靠自己了。
对于服务器软件开发,写LOG文件是最好的调试方法。
7. 小技巧:
如何让一个类只能被new出来,分配在堆中?
这是一个偶然的机会,和一个朋友讨论的结果,我至今不知道为什么他会有这种需求,但是方法确实找到了。让您先想想,我的解决方法请见这里。