现在的位置: 首页 > 综合 > 正文

一些C++连接,以及个人的C++学习总结。

2013年08月19日 ⁄ 综合 ⁄ 共 3202字 ⁄ 字号 评论关闭

以下是本人几年以来学习和开发中的一些积累和总结,欢迎讨论,欢迎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出来,分配在堆中?
   
    这是一个偶然的机会,和一个朋友讨论的结果,我至今不知道为什么他会有这种需求,但是方法确实找到了。让您先想想,我的解决方法请见这里。

 

 

抱歉!评论已关闭.