﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-暮暮息幕幕新-随笔分类-2.C/C++/C#/Java</title><link>http://www.cppblog.com/singohgod/category/2210.html</link><description>每天晚上入睡，都将迎来崭新的明天，这就是梦想！-大宝天天见</description><language>zh-cn</language><lastBuildDate>Thu, 17 Oct 2013 17:07:52 GMT</lastBuildDate><pubDate>Thu, 17 Oct 2013 17:07:52 GMT</pubDate><ttl>60</ttl><item><title>[转载]winnt.h(236) : error C2146: 语法错误 : 缺少“;”(在标识符“PVOID64”的前面)</title><link>http://www.cppblog.com/singohgod/archive/2011/12/07/161660.html</link><dc:creator>大宝天天见</dc:creator><author>大宝天天见</author><pubDate>Wed, 07 Dec 2011 05:03:00 GMT</pubDate><guid>http://www.cppblog.com/singohgod/archive/2011/12/07/161660.html</guid><wfw:comment>http://www.cppblog.com/singohgod/comments/161660.html</wfw:comment><comments>http://www.cppblog.com/singohgod/archive/2011/12/07/161660.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/singohgod/comments/commentRss/161660.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/singohgod/services/trackbacks/161660.html</trackback:ping><description><![CDATA[今天发现解决这个问题的最好办法:<br />结论是由于include路径的顺序引起的.把DX9的路径移到最后,果然就好了 @import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&amp;file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); <img src ="http://www.cppblog.com/singohgod/aggbug/161660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/singohgod/" target="_blank">大宝天天见</a> 2011-12-07 13:03 <a href="http://www.cppblog.com/singohgod/archive/2011/12/07/161660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]linux缺少库时添加查找路径</title><link>http://www.cppblog.com/singohgod/archive/2011/07/10/150604.html</link><dc:creator>大宝天天见</dc:creator><author>大宝天天见</author><pubDate>Sun, 10 Jul 2011 11:02:00 GMT</pubDate><guid>http://www.cppblog.com/singohgod/archive/2011/07/10/150604.html</guid><wfw:comment>http://www.cppblog.com/singohgod/comments/150604.html</wfw:comment><comments>http://www.cppblog.com/singohgod/archive/2011/07/10/150604.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/singohgod/comments/commentRss/150604.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/singohgod/services/trackbacks/150604.html</trackback:ping><description><![CDATA[<p>打开/etc/ld.so.conf文件在其后面添加链接查找路径：/usr/local/lib（或其他库所在路径），为了启用该配置在终端输入ldconfig。<br />
<br />
今天安装codeblocks就遇到了这个问题，库在/usr/lib下，不加上这个配置始终提示：<br />
./codeblocks: error while loading shared libraries: libcodeblocks.so.0: cannot open shared object file: No such file or directory<br />
<br />
加上后问题解决！~</p>
@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.cppblog.com/singohgod/aggbug/150604.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/singohgod/" target="_blank">大宝天天见</a> 2011-07-10 19:02 <a href="http://www.cppblog.com/singohgod/archive/2011/07/10/150604.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]Linux API 网址转换(DWORD, IP,域名)</title><link>http://www.cppblog.com/singohgod/archive/2011/06/27/149588.html</link><dc:creator>大宝天天见</dc:creator><author>大宝天天见</author><pubDate>Mon, 27 Jun 2011 09:46:00 GMT</pubDate><guid>http://www.cppblog.com/singohgod/archive/2011/06/27/149588.html</guid><wfw:comment>http://www.cppblog.com/singohgod/comments/149588.html</wfw:comment><comments>http://www.cppblog.com/singohgod/archive/2011/06/27/149588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/singohgod/comments/commentRss/149588.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/singohgod/services/trackbacks/149588.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 21px; font-family: verdana, sans-serif; text-align: left"> 
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px"><br /><br />做网络模块的时候经常会遇到有关网址的处理.一般大致的情形是3种:</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px">1.得到的是域名,如:www.3322.org</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px">2.得到的是实际的IP地址,如:61.160.235.203</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px">3.得到的是经过inet_addr处理过的IP,为unsigned long(DWORD)</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px">一.那么如果是给出点分制的IP要转为DWORD型是如何转化呢?这个其实最简单,有专门的函数专门处理此事</p><pre><span style="color: rgb(0,0,255)">unsigned</span> <span style="color: rgb(0,0,255)">long</span> dwIP = inet_addr("<span style="color: rgb(139,0,0)">222.212.12.77</span>");
<span style="color: rgb(0,0,255)">printf</span>("<span style="color: rgb(139,0,0)">IP(%s)-&gt;DWORD(%lu)\n</span>");

<span style="color: rgb(0,128,0)">//output</span>
IP(222.212.12.77)-&gt;DWORD(1292686558)</pre>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-top: 0px">二.第一种情况的逆转化</p><pre>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sys/select.h&gt;
#include &lt;netdb.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;errno.h&gt;
#include &lt;string.h&gt;

<span style="color: rgb(0,0,255)">int</span> main(<span style="color: rgb(0,0,255)">int</span> argc, <span style="color: rgb(0,0,255)">char</span> *argv[])
{
	<span style="color: rgb(0,0,255)">struct</span> in_addr net;
	<span style="color: rgb(0,0,255)">char</span> tmp[16] = {0};

	<span style="color: rgb(0,0,255)">if</span>(argc != 3)
	{
		<span style="color: rgb(0,0,255)">printf</span>("<span style="color: rgb(139,0,0)">You MUST enter 3 varibal.No.1:func name No.2:case.No.3:ip(string or DWORD)\n</span>");
		<span style="color: rgb(0,0,255)">return</span> 0;
	}

	<span style="color: rgb(0,0,255)">if</span>(<span style="color: rgb(0,0,255)">strcmp</span>("<span style="color: rgb(139,0,0)">1</span>", argv[1]) == 0) 
	{
		<span style="color: rgb(0,0,255)">char</span>* ip_string;
		ip_string = argv[2];
		<span style="color: rgb(0,0,255)">unsigned</span> <span style="color: rgb(0,0,255)">long</span> dword = inet_addr(ip_string);

		<span style="color: rgb(0,0,255)">printf</span>("<span style="color: rgb(139,0,0)">IP(%s)--&gt;DWORD(%lu)\n</span>", ip_string, dword);
	}
	<span style="color: rgb(0,0,255)">else</span> <span style="color: rgb(0,0,255)">if</span>(<span style="color: rgb(0,0,255)">strcmp</span>("<span style="color: rgb(139,0,0)">2</span>", argv[1]) == 0)
	{
		net.s_addr = (<span style="color: rgb(0,0,255)">unsigned</span> <span style="color: rgb(0,0,255)">long</span>)<span style="color: rgb(0,0,255)">atol</span>(argv[2]);
		<span style="color: rgb(0,0,255)">strcpy</span>(tmp, inet_ntoa(net));
		<span style="color: rgb(0,0,255)">printf</span>("<span style="color: rgb(139,0,0)">DWORD(%s)--&gt;IP(%s)\n</span>",argv[2], tmp);
	}
	<span style="color: rgb(0,0,255)">return</span> 0;
}</pre><pre>这里给出一个点分制IP和DWORD相互转化的程序</pre><pre>三.如果给出的是域名而想得到点分制的IP呢?</pre><pre>这里给出一个接口,支持输入的类型是点分制和域名2中类型,返回的是DWORD型的IP</pre><pre>有一点要声明的是gethostbyname这个函数必须在网络连通的情况下才能正确完成域名的解析,你想,连个网都不通,它怎么解析?</pre><pre>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sys/select.h&gt;
#include &lt;netdb.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;errno.h&gt;
#include &lt;string.h&gt;


#define DWORD <span style="color: rgb(0,0,255)">unsigned</span> <span style="color: rgb(0,0,255)">long</span>

DWORD platform_domain2ip(<span style="color: rgb(0,0,255)">const</span> <span style="color: rgb(0,0,255)">char</span> *szDomain, <span style="color: rgb(0,0,255)">char</span> *szDotNumIP)
{
	<span style="color: rgb(0,0,255)">char</span> szAddr[32] = {0};
	<span style="color: rgb(0,0,255)">struct</span> hostent *pHost;

	<span style="color: rgb(0,0,255)">printf</span>("<span style="color: rgb(139,0,0)">input domain name(%s)\n</span>", szDomain);
	

	<span style="color: rgb(0,0,255)">if</span>((pHost = gethostbyname(szDomain)) == NULL)
	{
		<span style="color: rgb(0,0,255)">printf</span>("<span style="color: rgb(139,0,0)">can not parse domain\n</span>");
		<span style="color: rgb(0,0,255)">return</span> -1;
	}
	<span style="color: rgb(0,0,255)">printf</span>("<span style="color: rgb(139,0,0)">HostName :%s\n</span>",pHost-&gt;h_name);
	<span style="color: rgb(0,0,255)">strcpy</span>(szAddr, inet_ntoa(*((<span style="color: rgb(0,0,255)">struct</span> in_addr *)pHost-&gt;h_addr)));
	<span style="color: rgb(0,0,255)">printf</span>("<span style="color: rgb(139,0,0)">IP Address :%s\n</span>", szAddr);
	<span style="color: rgb(0,0,255)">strcpy</span>(szDotNumIP, szAddr);

	<span style="color: rgb(0,0,255)">return</span> inet_addr(szAddr);
}

<span style="color: rgb(0,0,255)">int</span> main(<span style="color: rgb(0,0,255)">int</span> argc, <span style="color: rgb(0,0,255)">char</span> *argv[])
{
	DWORD dwip;
	<span style="color: rgb(0,0,255)">char</span> *ip = <span style="color: rgb(0,0,255)">malloc</span>(32);
	<span style="color: rgb(0,128,0)">//dwip = platform_domain2ip("www.3322.org", ip);</span>
	dwip = platform_domain2ip("<span style="color: rgb(139,0,0)">61.160.235.203</span>", ip);
	<span style="color: rgb(0,0,255)">printf</span>("<span style="color: rgb(139,0,0)">ip 1 (%s) 2 dw(%lu)\n</span>", ip, dwip);
	<span style="color: rgb(0,0,255)">return</span> 0;
}</pre><pre>//可以将main的注册分别打开来判断下结果是否正确,这里给出运行的结果,有图有真相</pre><pre>编译的命令再说下吧,怕有人不知道</pre><pre>gcc gethost.c &#8211;Wall &#8211;o gethost//在linux下</pre><pre>arm-hismall-linux-gcc gethost.c &#8211;Wall &#8211;o gethost//嵌入式环境下</pre><pre>&nbsp;<img alt="" src="http://www.cppblog.com/images/cppblog_com/singohgod/1.gif" border="0" /></pre><pre></pre><pre><img alt="" src="http://www.cppblog.com/images/cppblog_com/singohgod/2.gif" border="0" /></pre><pre><img alt="" src="http://www.cppblog.com/images/cppblog_com/singohgod/3.gif" border="0" /></pre><pre>此接口已经在我的工程中使用,在平台IP的解析和3322的解析中得到了应用,所以是稳定可行的.</pre><pre>这3中IP的转化都了解了的话,那么网络编程不就扫除了一个大石头吗?呵呵,大家功能进步</pre><pre>&nbsp;</pre><pre>网上比较流行的gethostbyname的例子如下,受到了启发</pre><pre>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sys/select.h&gt;
#include &lt;netdb.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;errno.h&gt;
#include &lt;string.h&gt;

<span style="color: rgb(0,0,255)">int</span> main(<span style="color: rgb(0,0,255)">int</span> argc, <span style="color: rgb(0,0,255)">char</span> **argv)
{
    <span style="color: rgb(0,0,255)">char</span> *ptr,**pptr;
    <span style="color: rgb(0,0,255)">struct</span> hostent *hptr;
    <span style="color: rgb(0,0,255)">char</span> str[32];

<span style="color: rgb(0,128,0)">    /* 取得命令后第一个参数，即要解析的域名或主机名 */</span> 
    ptr = argv[1];

<span style="color: rgb(0,128,0)">    /* 调用gethostbyname()。调用结果都存在hptr中 */</span> 
    <span style="color: rgb(0,0,255)">if</span>((hptr = gethostbyname(ptr)) == NULL)
    {
        <span style="color: rgb(0,0,255)">printf</span>("<span style="color: rgb(139,0,0)">gethostbyname error for host:%s\n</span>", ptr);
        <span style="color: rgb(0,0,255)">return</span> 1; /* 如果调用gethostbyname发生错误，返回1 */
    }

<span style="color: rgb(0,128,0)">    </span> 
    <span style="color: rgb(0,0,255)">printf</span>("<span style="color: rgb(139,0,0)">official hostname:%s\n</span>",hptr-&gt;h_name);

<span style="color: rgb(0,128,0)">    /* 主机可能有多个别名，将所有别名分别打出来 */</span> 
    <span style="color: rgb(0,0,255)">for</span>(pptr = hptr-&gt;h_aliases; *pptr != NULL; pptr++)
        <span style="color: rgb(0,0,255)">printf</span>("<span style="color: rgb(139,0,0)">  alias:%s\n</span>",*pptr);

    <span style="color: rgb(0,128,0)">/* 根据地址类型，将地址打出来 */</span>
    <span style="color: rgb(0,0,255)">switch</span>(hptr-&gt;h_addrtype)
    {
        <span style="color: rgb(0,0,255)">case</span> AF_INET:
        <span style="color: rgb(0,0,255)">case</span> AF_INET6:
            pptr=hptr-&gt;h_addr_list;

            <span style="color: rgb(0,128,0)">/* 将刚才得到的所有地址都打出来。其中调用了inet_ntop()函数*/</span>
            <span style="color: rgb(0,0,255)">for</span>(;*pptr!=NULL;pptr++)
            <span style="color: rgb(0,0,255)">printf</span>("<span style="color: rgb(139,0,0)">  address:%s\n</span>", inet_ntop(hptr-&gt;h_addrtype,*pptr, str, <span style="color: rgb(0,0,255)">sizeof</span>(str)));
        <span style="color: rgb(0,0,255)">break</span>;
        <span style="color: rgb(0,0,255)">default</span>:
            <span style="color: rgb(0,0,255)">printf</span>("<span style="color: rgb(139,0,0)">unknown address type\n</span>");
        <span style="color: rgb(0,0,255)">break</span>;
    }

    <span style="color: rgb(0,0,255)">return</span> 0;
}</pre></span></span><br class="Apple-interchange-newline" /><img src ="http://www.cppblog.com/singohgod/aggbug/149588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/singohgod/" target="_blank">大宝天天见</a> 2011-06-27 17:46 <a href="http://www.cppblog.com/singohgod/archive/2011/06/27/149588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]linux下C++开发工具</title><link>http://www.cppblog.com/singohgod/archive/2011/05/08/145950.html</link><dc:creator>大宝天天见</dc:creator><author>大宝天天见</author><pubDate>Sun, 08 May 2011 07:18:00 GMT</pubDate><guid>http://www.cppblog.com/singohgod/archive/2011/05/08/145950.html</guid><wfw:comment>http://www.cppblog.com/singohgod/comments/145950.html</wfw:comment><comments>http://www.cppblog.com/singohgod/archive/2011/05/08/145950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/singohgod/comments/commentRss/145950.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/singohgod/services/trackbacks/145950.html</trackback:ping><description><![CDATA[<div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000; ">就C＋＋开发工具而言，与Windows下微软（VC，&nbsp;VS2005等）一统天下相比，Linux</span><span style="color: #000000; ">/</span><span style="color: #000000; ">Unix下C＋＋开发，可谓五花八门，各式各样。Emacs,&nbsp;vi,&nbsp;eclipse,&nbsp;anjuta，kdevelop等层出不穷。<br>Windows下，开发工具多以集成开发环境IDE的形式展现给最终用户。例如，VS2005集成了编辑器，宏汇编ml，C&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">C</span><span style="color: #000000; ">++</span><span style="color: #000000; ">编译器cl，资源编译器rc，调试器，文档生成工具,&nbsp;nmake。它们以集成方式提供给最终用户，对于初学者而言十分方便。但是，这种商业模式，直接导致用户可定制性差，不利于自动化，集成第三方工具的能力弱。例如，无法定制一些宏来处理一些重复操作；体会不到自动化makefile一步到位快感；无法远程登录到服务器上进行开发；无法使用某种&#8221;粘合剂&#8221;来把第三方工具（例如，文本工具，字符串工具）有效地调用起来。可以说，良好的商业支持和傻瓜式开发，是它们主要的优点。<br>在linux下，开发工具被切割成一个个独立的小工具。各自处理不同的问题。例如，编辑器（emacs,&nbsp;vim)用来进行编辑程序的，调试器（gdb)用来调试程序，编译器（GCC）用来编译和链接程序的，性能分析工具（gcov,&nbsp;gprof)用来优化程序的，文档生成器（doxygen）用来生成文档的。同时，还有一些系统工具和系统知识，我们是很有必要了解的：程序自动化机制&nbsp;makefile，系统粘合剂shell，系统查找工具grep,&nbsp;locate,&nbsp;find。其它的工具（例如ctags，&nbsp;OCI公司的MPC等等），一旦熟练掌握，它们将成为你手中的利器。<br>本文主要是一些针对LINUX下开发工具使用的经验之谈。由于，工具品种繁多，我们没有能力也没有必要一一介绍。对于LINUX下IDE工具，例如&nbsp;eclipse,&nbsp;anjuta等，它们虽然也很实用，但是使用起来比较简单，而且目前还算不上主流。所以，它们将不被着重介绍。同时，本文也不打算写成各个工具的操作手册，只着眼于介绍各个工具的想要解决的问题、运行机理和主要特性。<br>正文<br>编辑器<br>要进行开发，第一件事情就是选择一个合适的编辑器。编辑器选择有几个要素：<br></span><span style="color: #000000; ">1</span><span style="color: #000000; ">）减少不必要的编辑动作，减少编辑的时间。<br>一切能够无二义性描述出来的编辑任务，都可以而且应该能被自动化。例如，每一个C＋＋程序都会有一个main函数；我们在定义.h文件时，都希望加入一些预处理指令＃define来帮我们解决重复引用同一个头文件而带来的麻烦。鼠标操作总是比键盘操作要慢的。这方面EMACS做得可算是到了极致。所以，&nbsp;EMACS用户经常会吹嘘：他们编辑的速度等同于他们思考的速度。<br></span><span style="color: #000000; ">2</span><span style="color: #000000; ">）可扩展性高。<br>程序员预期的编辑器应该能提供一些编程的帮助，例如，语法高亮，自动补齐，自动排版，语法检查等等。留心观察一下gedit,&nbsp;vim,&nbsp;emacs,&nbsp;ultraEdit，就会发现它们提供的远不是windows&nbsp;记事本，写字板提供的那么简陋的功能。对于一种新的语言，新的语法，它们应该能很方便地提供支持，而不停留在一种或几种固定的语言上。<br></span><span style="color: #000000; ">3</span><span style="color: #000000; ">）用户可定制性高。<br>如果想长期从事研发，&nbsp;特别是linux</span><span style="color: #000000; ">/</span><span style="color: #000000; ">unix下研发的话，那么你很有必要学好一个功能足够的编辑器。有这么一句话：Linux下程序员分为三种，使用emacs的，使用vi的，还有其它。<br>EMACS是Stallman用lisp语言写的一个GPL的编辑器。我们这里所说的emacs指的是GNU&nbsp;emacs，而非Xemacs。由于它的开放性，我们可以把它打造成一个功能强大的IDE。我们在安装好CGYwin之后，也可以在Windows系统下使用&nbsp;EMACS。CGYwin和MINGW是第三方写的一个在Windows系统上模拟POSIX系统的工具。<br>EMACS与其说的是一个编辑器，倒不如说它是一个操作系统。我们可以用它来写编程，写wiki，收发邮件等等。EMACS主要是通过两种方式来进行扩展：el脚本(elisp是lisp的一种方言）和第三方扩展包。EMACS的入门成本很高。由于是纯键盘操作，所以需要记忆大量的快捷键；功能强大是通过用户添加一些扩展包，lisp脚本来实现的。如何正确配置和修改是很需要耐心和技巧的。<br>编译器<br>编译器首选GCC（GNU&nbsp;COMPILER&nbsp;COLLECTION)。原因有两个，它是GNU开源的，同时它对标准C</span><span style="color: #000000; ">++</span><span style="color: #000000; ">的支持度高达96.</span><span style="color: #000000; ">15</span><span style="color: #000000; ">%</span><span style="color: #000000; ">。而VC</span><span style="color: #000000; ">++</span><span style="color: #000000; ">6</span><span style="color: #000000; ">.0的支持度只有83.</span><span style="color: #000000; ">43</span><span style="color: #000000; ">%</span><span style="color: #000000; ">。&nbsp;GCC不仅是通常意义上的C或C</span><span style="color: #000000; ">++</span><span style="color: #000000; ">的编译器，它还可以编译java等其它语言。gcc是gnu&nbsp;c的编译器,g</span><span style="color: #000000; ">++</span><span style="color: #000000; ">是gnu&nbsp;c</span><span style="color: #000000; ">++</span><span style="color: #000000; ">的编译器,&nbsp;而EGCS(Enhanced&nbsp;GNU&nbsp;Compiler&nbsp;Suite)可以认为是gcc的改进版。<br>编译语言从源程序到目标代码会经过如下几个阶段：源程序－＞汇编程序－＞编译成obj程序－</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">链接成最终可执行程序。我们可以通过一条编译指令来完成所有步骤。也可以分步执行。gcc有三个重要选项</span><span style="color: #000000; ">-</span><span style="color: #000000; ">E(只进行预处理),&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">S(生成汇编代码),&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">g(生成带原代码调试符号的可执行文件，如果想用gdb调试的话，就应该在编译时打开这个选项）。<br>GCC可以看作一个软件包，除了编译工具，它还集成了调试器gdb，性能分析工具gcov,&nbsp;gprof。只要我们装好了GCC，这些强大工具就可以直接使用了。<br>通过gcov，我们可以查看一个程序，源代码中每行代码的运行次数。我们优化运行次数最多的代码，那么就可以大大优化程序。使用gcov时，需要打开&nbsp;GCC的fprofile</span><span style="color: #000000; ">-</span><span style="color: #000000; ">arcs和ftest</span><span style="color: #000000; ">-</span><span style="color: #000000; ">coverage两个选项。gcov中常用的选项有</span><span style="color: #000000; ">-</span><span style="color: #000000; ">b分支统计信息。<br>通过gprof工具，我们可以查看函数之间的调用顺序，及各个函数运行的时间。我们可以将gprof理解为linux</span><span style="color: #000000; ">/</span><span style="color: #000000; ">unix自带工具time的加强版。使用gprof时，需要打开GCC的pg选项。<br>gcov和&nbsp;gprof的共同点是在编译程序时，加入自己的一些辅助信息，由此来进行程序诊断。除了，这些优化手段，我们还可以使用一些内存泄漏工具，来减少野指针，未释放的内存空间。<br>调试器<br>GDB即GNU的调试器，它是GCC附带的一个性能优质的调试器。通过GDB和脚本结合，我们可以很好的实现回归测试。<br>GDB可以运行于CLI和GUI两种模式。默认GDB是CLI模式的，我们可以去下载和安装GUI模式的GDB，例如xxgdb，&nbsp;ddd等。一个更好的方式是在&nbsp;EMACS中使用GDB。GDB包括visual&nbsp;studio工具的所有调试功能，还包括它没有的功能。它除了支持，我们一般的设置断点，单步跟踪，step&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">,&nbsp;step&nbsp;</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">,&nbsp;step&nbsp;over等，还有一些强大的功能。在gdb中，我们可以有以下几种暂停方式：断点（BreakPoint）、观察点（WatchPoint）、捕捉点（CatchPoint）、信号（Signals）、线程停止（Thread&nbsp;Stops）。<br>下面列举几个让我印象深刻的功能。</span><span style="color: #000000; ">1</span><span style="color: #000000; ">）通过&nbsp;watch指令，可以让程序在某个变量的值发生变化时，暂停下来。</span><span style="color: #000000; ">2</span><span style="color: #000000; ">）通过print指令，在程序运行时，设置变量的值，运行一个程序自身支持的一个方法。</span><span style="color: #000000; ">3</span><span style="color: #000000; ">）通过until指令，我们可以让程序在运行到某个程序时暂停下来。</span><span style="color: #000000; ">4</span><span style="color: #000000; ">）通过break..&nbsp;if指令，使得程序在满足某个bool表达式时，暂停下来。<br>粘合剂<br>我想通过&#8220;粘合剂&#8221;这个词来表达将多个工具粘合起来的&#8220;胶水&#8221;。例如，通过shell脚本，我们可以把OS命令，sed指令，awk指令，其它脚本文件等串联起来，发挥它们的合力。在linux&nbsp;C</span><span style="color: #000000; ">++</span><span style="color: #000000; ">编程中，我们不可避免地会使用makefile文件。通过，它我们可以把编译指令，生成文档操作，清除操作等等串联起来。从某种意义上来看，它也相当于一个粘合剂。<br>makefile的出发点是，维护好一个项目中众多文件的依赖关系，由此得到一个源程序的拓扑图。当我们只修改图中某个结点时，重新编译时就只需要将拓扑图中关联的链路进行编译就好了。由此，大大缩短了编译的时间。make有两大概念：dependencies和rules。规则rule即针对每一个依赖关系&nbsp;dependency定义一个操作规则。这个细粒度的分离，就可以使我们可以定制软件构建的行为。例如，修改使用的编译器，修改includepath,&nbsp;修改libpath,&nbsp;修改编译选项等等。我们常见的VC中的nmake，功能和make是类似的。<br>make使用的重点和难点是编写Makefile文件。Makefile的语法相对其它语言来说是很不一样的，我们要特别注意TAB键和空格键的区别。有很多工具可以用来帮助我们生成Makefile。最出名的就是GNU的autoconf了。一个GNU程序的编写，需要autoscan,&nbsp;aclocal,&nbsp;autoconf,&nbsp;automake这四个工具。<br>我们知道GNU软件安装的三步曲是：.</span><span style="color: #000000; ">/</span><span style="color: #000000; ">configure,&nbsp;make,&nbsp;make&nbsp;install。其中.</span><span style="color: #000000; ">/</span><span style="color: #000000; ">configure就是根据autoconf,&nbsp;alocal等工具生成一个makefile文件。make指令就是调用make指令来根据makefile文件的规则来编译源程序。而make&nbsp;install就是执行makefile中的install规则指出的操作（一般是copy操作）。而make&nbsp;clean就是执行makefile中的clean规则指出的操作（一般是rm操作）。我们用Eclispe</span><span style="color: #000000; ">+</span><span style="color: #000000; ">CDT开发Managed&nbsp;C</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;Project时，它就是通过objects.mk,subdir.mk,sources.mk三个文件来生成Makefile。我们注意观察编译时的输出信息，就可以看到显示的Makefile文件的内容。<br>可以说，如果想编译出跨平台的C＋＋程序，那么makefile是一种最方便的机制。<br>OCI公司为Douglas&nbsp;C.Schmidt的ACE，TAO开源社区编写了一段伟大的perl脚本－－MPC。它由平台信息，一个规则文件，源代码，生成用户想要的工程文件，例如Make,&nbsp;Nmake,&nbsp;Visual&nbsp;C</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">6</span><span style="color: #000000; ">,&nbsp;Visual&nbsp;C</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;7等等。Google&nbsp;Web&nbsp;Tookit,&nbsp;Celtix做的事情与之类似，不过它们是针对JAVA的，而MPC是针对C＋＋的。<br>结束语<br>国内资料太多的低层次的重复，经常是一个网页被多次转载，而且回答问题时深度不够。个人找资料的顺序是：查看quick&nbsp;start或how&nbsp;to文档－＞自带的帮助（如果看起来不太吃力话）－＞百度查一下中文网页，来理清一下基本概念－＞google查一下－＞几个大的，相关的网站查下资料－＞看自带帮助。再者，面对面的交流是十分重要的，大家可以相互理一下概念，交流一下心得。可惜，我身边这种氛围还是不够。<br>Linux下开发还可以更友好一些。个人感觉，&nbsp;linux开发要在国内普通程序员中大规模普及，还有一段很长的路要走。ubuntu火爆的主要原因，就是它帮用户搭好一些默认配置。用户如果想新加一些服务，它们提供了良好，有效地支持。所以，我想我们可以在IDE和现在linux这种一个个小部件的这两种状态之间，取一个折衷。也就是针对几种主要需求的用户，发布一些配置好的环境。尤其是emacs的各种el脚本（例如界面主题的color</span><span style="color: #000000; ">-</span><span style="color: #000000; ">theme，&nbsp;C</span><span style="color: #000000; ">/</span><span style="color: #000000; ">C</span><span style="color: #000000; ">++</span><span style="color: #000000; ">语言编辑策略，代码样式设置脚本，各种emacs系统设置），&nbsp;第三方扩展包（模板template,&nbsp;编程支持包cedet等）。每一个用户浪费时间来进行这些配置是十分没有意义的！工具始终只是工具，我们不能沦为工具的奴隶，不能把一大部分精力浪费在配置工具上。<br>值得注意的是现在方兴未艾的eclipse有向这方面迈进的趋势。但是，现在emacs已经做得很好了，ecilpse能否超越它，我们还有待观察。我们可以通过在eclipse上安装SDT插件来进行C</span><span style="color: #000000; ">++</span><span style="color: #000000; ">开发。但是，它目前还不支持调试功能，而且不太稳定，功能不够强。例如，有时会无故死掉；如果想通过eclipse来转向函数原型的话，那么迎接你的将是一个漫长、焦急的等待。<br>由于本人缺少在linux下进行实际大规模程序的开发经验，对很多工具和机制的理解还比较肤浅。对它们的熟悉程度离真正实用，还有一段很长的路要走。<br>我之前是一个C程序员，而且是个Windows的程序员，在windows下使用VC6.</span><span style="color: #000000; ">0</span><span style="color: #000000; ">/</span><span style="color: #000000; ">VS2005等microsoft的傻瓜式工具工作，&nbsp;对于那个vc&nbsp;</span><span style="color: #000000; ">6.0</span><span style="color: #000000; ">/</span><span style="color: #000000; ">vs2005的快捷操作，debug操作是那么的熟悉，可以说vc&nbsp;</span><span style="color: #000000; ">6.0</span><span style="color: #000000; ">/</span><span style="color: #000000; ">vs2005是window下开发c</span><span style="color: #000000; ">/</span><span style="color: #000000; ">c</span><span style="color: #000000; ">++</span><span style="color: #000000; ">最好用的工具了，可以查看调用堆栈，内存变化情况，变量值，另外安装&nbsp;visual&nbsp;assist&nbsp;x后让VC看起来是那么的完美。<br>但是windows下写成代码到了linux下是有问题的，所以建议在vc中将工具</span><span style="color: #000000; ">-</span><span style="color: #000000; ">》选项—》制表符—》制表符大小4，插入空格，另外的问题就是&nbsp;那个回车换行的问题，例如windows下是0d,0a，到了linux下用vi看到的都是</span><span style="color: #000000; ">^</span><span style="color: #000000; ">M，给别人带来不便，所以如果提交的服务器是linux，而&nbsp;你是在windows下开发，可以在svn</span><span style="color: #000000; ">/</span><span style="color: #000000; ">cvs中进行设置，就可以自动进行dos2unix的转换，相关的文档可以查看svn</span><span style="color: #000000; ">/</span><span style="color: #000000; ">cvs的相关手册，其&nbsp;中都有这样的设置。<br>有幸这次我转到了Linux下开发，有幸认识了linux，但是随之而来的就是特别头疼的问题：Linux下使用什么工具进行编码，编译，&nbsp;debug呢？？我感到非常的迷茫，然后就是网上大搜索，看到那么多的网友推荐VIM时，我失望了，特别的失望，然后用VIM敲了一个下午，累的手的麻&nbsp;了，感到特别的不爽，就像是用左手拿筷子一样，全身的力量无法施展，所以&nbsp;我还是计划再找找看。不过后来我还是找到了适合自己的工具。呵呵，真是太高兴了，今天把我自己这几天搜集的一些资料整理一下，给以后转向linux的程序&nbsp;员一点提示吧</span><span style="color: #000000; ">!</span><span style="color: #000000; "><br>主要的工具如下：<br></span><span style="color: #000000; ">1</span><span style="color: #000000; ">.&nbsp;vim&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;ctags&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;taglist&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;cscope&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;cppcomplete&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;global<br>这个我也试过了，比较有用的帖子如下：<br>http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">www.linuxsir.org/bbs/showthread.php?t=241578</span><span style="color: #008000; "><br></span><span style="color: #000000; ">http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx</span><span style="color: #008000; "><br></span><span style="color: #000000; ">但是这个要记大量的命令，不过还好，这些命令有两三天就可以记住了，<br>我这里有个简单的册子：<br></span><span style="color: #000000; ">2</span><span style="color: #000000; ">、文本的操作<br></span><span style="color: #000000; ">~</span><span style="color: #000000; "><br>:e</span><span style="color: #000000; ">!</span><span style="color: #000000; ">&nbsp;file1&nbsp;在当前文件下编辑新的文件<br>:r&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">etc</span><span style="color: #000000; ">/</span><span style="color: #000000; ">passwd&nbsp;实现文件的读入功能<br>:wq&nbsp;保持并退出<br>:q</span><span style="color: #000000; ">!</span><span style="color: #000000; ">&nbsp;强行退出<br>O&nbsp;：重起一行<br>U：撤销&nbsp;：&nbsp;C</span><span style="color: #000000; ">-</span><span style="color: #000000; ">R&nbsp;：重做<br>dd&nbsp;删除一行&nbsp;d$删除行后的<br>e:移动单词&nbsp;ge&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">—&#8211;&nbsp;&#8211;&#224;&nbsp;e<br></span><span style="color: #000000; ">%</span><span style="color: #000000; ">:括号匹配<br>33G：跳到33行<br>gg&nbsp;:跳到第一行<br>C</span><span style="color: #000000; ">-</span><span style="color: #000000; ">O&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">C</span><span style="color: #000000; ">-</span><span style="color: #000000; ">I来回跳转<br>H&nbsp;&#8211;HOME&nbsp;L&nbsp;&#8211;last<br>ma&nbsp;:定义标签&nbsp;a，&#8216;a:回到a<br>C</span><span style="color: #000000; ">-</span><span style="color: #000000; ">V文本块操作<br></span><span style="color: #000000; ">/</span><span style="color: #000000; ">\<br>yy&nbsp;:复制一行，p:粘贴<br></span><span style="color: #000000; ">^</span><span style="color: #000000; ">&nbsp;将光标快速跳转到本行的首行字符<br>$&nbsp;将光标快速跳转到本行的行尾字符<br>:m,ny&nbsp;复制第m行到第n行之间的文本到VI缓冲区<br><br></span><span style="color: #000000; ">5.3</span><span style="color: #000000; ">、替换操作<br>:s</span><span style="color: #000000; ">/</span><span style="color: #000000; ">old</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;替换当前行的第一个字符old为字符new<br>:s</span><span style="color: #000000; ">/</span><span style="color: #000000; ">old</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">/</span><span style="color: #000000; ">g&nbsp;替换当前行的所有字符old为字符new<br>:m,ns</span><span style="color: #000000; ">/</span><span style="color: #000000; ">old</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">/</span><span style="color: #000000; ">g&nbsp;替换当前行号m到行号n的所有字符old为字符new<br>:</span><span style="color: #000000; ">%</span><span style="color: #000000; ">s</span><span style="color: #000000; ">/</span><span style="color: #000000; ">old</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">/</span><span style="color: #000000; ">g&nbsp;替换整个文本的所有字符old为字符new<br><br></span><span style="color: #000000; ">5.7</span><span style="color: #000000; ">、使用替换的确认功能<br>:s</span><span style="color: #000000; ">/</span><span style="color: #000000; ">old</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">/</span><span style="color: #000000; ">c&nbsp;替换当前行的第一个字符old为字符new并提示用户确认操作<br>:s</span><span style="color: #000000; ">/</span><span style="color: #000000; ">old</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">/</span><span style="color: #000000; ">gc&nbsp;替换当前行的所有字符old为字符new并提示用户确认操作<br>:m,ns</span><span style="color: #000000; ">/</span><span style="color: #000000; ">old</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">/</span><span style="color: #000000; ">gc&nbsp;替换当前行号m到行号n的所有字符old为字符new并提示用户确认操作<br>:</span><span style="color: #000000; ">%</span><span style="color: #000000; ">s</span><span style="color: #000000; ">/</span><span style="color: #000000; ">old</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">/</span><span style="color: #000000; ">gc&nbsp;替换整个文本的所有字符old为字符new并提示用户确认操作<br>：edit&nbsp;foo.txt&nbsp;—编辑另一个文档<br>：next&nbsp;进行文件切换<br>C</span><span style="color: #000000; ">-</span><span style="color: #000000; ">W&nbsp;切换窗口<br>vimdiff&nbsp;main.c</span><span style="color: #000000; ">~</span><span style="color: #000000; ">&nbsp;main.c<br>:g</span><span style="color: #000000; ">+</span><span style="color: #008000; ">//</span><span style="color: #008000; ">+s/foobar/barfoo/g</span><span style="color: #008000; "><br></span><span style="color: #000000; ">CTags:<br>Ctags&nbsp;&#8211;R</span><span style="color: #000000; ">/</span><span style="color: #000000; ">ctags&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; "><br>:</span><span style="color: #0000FF; ">set</span><span style="color: #000000; ">&nbsp;tags&nbsp;</span><span style="color: #000000; ">=/</span><span style="color: #000000; ">..</span><span style="color: #000000; ">/</span><span style="color: #000000; ">tags<br>：Tlist<br>F3查找<br>：make<br>:cw&nbsp;:cn&nbsp;:cp<br>mm&nbsp;标签，F2&nbsp;切换<br>cscope&nbsp;&#8211;Rbq<br>:cs&nbsp;add&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">..</span><span style="color: #000000; ">/</span><span style="color: #000000; ">cscope.</span><span style="color: #0000FF; ">out</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">..</span><span style="color: #000000; ">/</span><span style="color: #000000; "><br>:cs&nbsp;find&nbsp;g&nbsp;xxx<br>:cs&nbsp;find&nbsp;c&nbsp;vim_strsave<br>:cw<br>按tab键自动补全。<br>缺点是：&nbsp;自动补全功能麻烦，必须先建立ctags，写代码还是很累，我写了一下午，写的手都麻了。出错检查&nbsp;啊，括号自动匹配啊，<br>单词补全功能啊，都不满意，另外对C</span><span style="color: #000000; ">++</span><span style="color: #000000; ">的支持不好。<br>比如我刚写了2个config.h,config.cpp，这2个文件<br>没有进行CTAG,CSCOPE操作，就不能单词补全，括号匹配不能检测，不知道是我配置有问题还是怎么回事啊。<br>另外不能进行DEBUG,所以我只能放弃。<br></span><span style="color: #000000; ">2</span><span style="color: #000000; ">.emacs</span><span style="color: #000000; ">+</span><span style="color: #000000; ">插件<br>可以查看<br>http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">blog.163.com/yu_hongchang/blog/static/3989413820081121512613/</span><span style="color: #008000; "><br></span><span style="color: #000000; ">这个我没有试验，估计和vim一样，都是命令操作，听说这个功能强大一些，能够通过xterm进行调试，这个我之前用过，但是那个xterm真的不怎么好用，界面，鼠标，我都不喜欢。<br></span><span style="color: #000000; ">3</span><span style="color: #000000; ">.&nbsp;kdevelop<br>这个工具做的比较差劲吧，我也不喜欢，比如他的自动补全功能很不爽，比如：有个函数<br>Int&nbsp;test(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;c1,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;c2)<br>当我们敲下&nbsp;tes时，只能出现test，而后面的参数列表都不能显示，所以当代码量比较大，函数参数比较多的时候，我们都记不住参数，没有参数列表提示，就会觉得很不爽。不过还好，它集成了kgdb可以进行debug.<br></span><span style="color: #000000; ">4</span><span style="color: #000000; ">.eclipse&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">cdt<br>好多人用这个IDE，还算好吧，但是eclipse是个java的，运行速度慢的很，另外单词补全功能太差劲了，只能补全结构体或者类，在写下.</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">之后才能补全，另外要按&nbsp;control</span><span style="color: #000000; ">+/</span><span style="color: #000000; ">&nbsp;才能补全，不能在敲代码的同时自动显示，eclipse对c</span><span style="color: #000000; ">/</span><span style="color: #000000; ">c</span><span style="color: #000000; ">++</span><span style="color: #000000; ">的支持远远不如对JAVA的支持强大，但是我至少认为比在vim中写要舒服一些，可能&nbsp;是个人习惯了那个IDE的工作环境。<br></span><span style="color: #000000; ">5</span><span style="color: #000000; ">.code::blocks<br>可以查看：<br>http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">www.codeblocks.org/</span><span style="color: #008000; "><br></span><span style="color: #000000; ">支持的平台不全，我的是redhat&nbsp;企业版&nbsp;</span><span style="color: #000000; ">5.0</span><span style="color: #000000; ">，就安装不上，所以我也没有能够一睹它的芳容，可惜啊。<br></span><span style="color: #000000; ">6</span><span style="color: #000000; ">.&nbsp;anjuta<br>这个我下载了安装不上，不知道为什么，而且要求配置的比较多，也比较麻烦，如果你感兴趣，可以看<br>http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">hi.baidu.com/my2008space/blog/item/140de5255fab81084c088d1e.html</span><span style="color: #008000; "><br></span><span style="color: #000000; ">7</span><span style="color: #000000; ">.&nbsp;Kylix<br>这个没有试。<br></span><span style="color: #000000; ">8</span><span style="color: #000000; ">.netbeans<br>这个也不错，我装过试了试，能满足我的功能，但是可定制稍微差点，但是能满足需要了，也还不错吧，如果没有下面要提到的slick&nbsp;edit,我就会选择它了。<br></span><span style="color: #000000; ">9</span><span style="color: #000000; ">.windows&nbsp;ue</span><span style="color: #000000; ">+</span><span style="color: #000000; ">ssh<br>有很多的人用这个方法，我不太喜欢，可能是不喜欢ue那个界面吧，应该和vim之类的类似。<br></span><span style="color: #000000; ">10</span><span style="color: #000000; ">.slick&nbsp;edit<br>呵呵，我最终选择的是这个，很好用，可定制性强，支持的语言多，非常的好用，能够直接进行debug,而且速度也很快，界面和vc&nbsp;</span><span style="color: #000000; ">6</span><span style="color: #000000; ">.0很相似，是一个唯一可以和&nbsp;vc&nbsp;相媲美的工具，但不是免费的，不过还是要感谢那些的黑客，让这个软件得到了破解，<br>你可以通过下面的链接下载：<br>http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">www.slickedit.com/content/view/409/239/</span><span style="color: #008000; "><br></span><span style="color: #000000; ">下载SlickEdit&nbsp;v14.</span><span style="color: #000000; ">0.2</span><span style="color: #000000; ">.</span><span style="color: #000000; ">2</span><span style="color: #000000; "><br>然后到http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">download.csdn.net/source/1481066</span><span style="color: #008000; "><br></span><span style="color: #000000; ">去下载破解的文件，然后覆盖就可以了。<br>这个工具非常的好用啊，大家可以试一试啊，<br>这个工具最好的地方就是可以查看memory的情况，这点我喜欢。呵呵<br></span><span style="color: #000000; ">11</span><span style="color: #000000; ">.编译工具和DEBUG工具<br>主要的编译工具都是gcc，当代码量大的时候就要写makefile了，另外的调试工具主要都是gdb，这些可视化的IDE基本都是包装了gcc,&nbsp;gdb。所以slickedit对于我这种刚转到Linux,对makefile不熟悉的人来说无疑是一根救命的稻草，能让我很快的进入工作状态，当然，&nbsp;你只是把它当成编辑的工具，也会发现它能大大缩小你编码的时间，让你的手不会因为写代码而感到疲惫。<br>终于尘埃落定，以后我要用slickedit来开始我的Linux之旅了。<br></span><span style="color: #000000; ">1</span><span style="color: #000000; ">.&nbsp;c</span><span style="color: #000000; ">/</span><span style="color: #000000; ">c</span><span style="color: #000000; ">++</span><span style="color: #000000; ">编译器&nbsp;gcc</span><span style="color: #000000; ">/</span><span style="color: #000000; ">g</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br>详情请参考网站:http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">gcc.gnu.org/</span><span style="color: #008000; "><br></span><span style="color: #000000; ">2</span><span style="color: #000000; ">.&nbsp;UML建模工具&nbsp;Bouml<br>linux下比较好用的建模工具，相当于windows下的rational&nbsp;rose，具成了程序UML模型设计，代码编辑，代码生成功能等功能.<br>详情请参考网站：http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">bouml.free.fr/</span><span style="color: #008000; "><br></span><span style="color: #000000; ">3</span><span style="color: #000000; ">.&nbsp;makefile文件编写工具&nbsp;：autoconf,automake<br>无论是在Linux还是在Unix环境中，make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件，<br>我们都经常要用到make或&nbsp;make&nbsp;install。利用make工具，我们可以将大型的开发项目分解成为多个更易于管理的模块，<br>对于一个包括几百个源文件的应用程序，但是如果通过查阅make的帮助文档来手工编写Makefile,对任何程序员都是一场挑战。<br>幸而有GNU&nbsp;提供的Autoconf及Automake这两套工具使得编写makefile不再是一个难题<br>使用make和&nbsp;makefile工具就可以轻而易举的理顺各个源文件之间纷繁复杂的相互关系,autoconf,automake一般配合libtool使用。<br>详情请参考网站：<br>http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">www.ibm.com/developerworks/cn/linux/l-makefile/</span><span style="color: #008000; "><br></span><span style="color: #000000; ">http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">www.gnu.org/software/autoconf/</span><span style="color: #008000; "><br></span><span style="color: #000000; ">http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">www.gnu.org/software/automake/</span><span style="color: #008000; "><br></span><span style="color: #000000; ">http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">www.gnu.org/software/libtool/</span><span style="color: #008000; "><br></span><span style="color: #000000; ">4</span><span style="color: #000000; ">.&nbsp;调试工具：gdb<br>在window下编程，调试工具已经具成到VS环境，在linux</span><span style="color: #000000; ">/</span><span style="color: #000000; ">Unix下调试则通过gdb来调试，个人觉得gdb调试比vs调试高效很多。<br>详情请参考网站：http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">www.gnu.org/software/gdb/</span><span style="color: #008000; "><br></span><span style="color: #000000; ">5</span><span style="color: #000000; ">.&nbsp;内存泄漏工具：valgrind<br>对于动则成千上万行的代码，很难通过手工的方式去保证内存没有泄漏，<br>valgrind通过内存申请、释放匹配的原则来检测内存泄漏，内存越界的BUG。当然，良好的编程习惯也是保证代码质量高效必不可少的条件。<br>参考网站：http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">valgrind.org/</span><span style="color: #008000; "><br></span><span style="color: #000000; ">6</span><span style="color: #000000; ">.&nbsp;源代码管理工具：svn<br>软件开发不再是个人大师的年代，都是以团队的方式来开发，如何保证代码的同步，协同开发，svn给我们提了很好的帮助。<br>详情请参考网站：http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">svncorp.org/</span><span style="color: #008000; "><br></span><span style="color: #000000; ">7</span><span style="color: #000000; ">.&nbsp;网络协议分析工具：wireshark<br>编写网络程序，就不可避免要处理网络协议,分析网络数据.wireshark提供了关于网络层和上层协议的各种信息。<br>命令行下分析网络协议可以使用tcpdump.</span></div><img src ="http://www.cppblog.com/singohgod/aggbug/145950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/singohgod/" target="_blank">大宝天天见</a> 2011-05-08 15:18 <a href="http://www.cppblog.com/singohgod/archive/2011/05/08/145950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]vs2005 下 fstream 不能打开中文路径名的问题!</title><link>http://www.cppblog.com/singohgod/archive/2009/10/12/98392.html</link><dc:creator>大宝天天见</dc:creator><author>大宝天天见</author><pubDate>Mon, 12 Oct 2009 09:44:00 GMT</pubDate><guid>http://www.cppblog.com/singohgod/archive/2009/10/12/98392.html</guid><wfw:comment>http://www.cppblog.com/singohgod/comments/98392.html</wfw:comment><comments>http://www.cppblog.com/singohgod/archive/2009/10/12/98392.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/singohgod/comments/commentRss/98392.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/singohgod/services/trackbacks/98392.html</trackback:ping><description><![CDATA[<p>奇怪的问题，据说vs2003能成功，vs2005的确是要失败。。。<br>解决办法：<br><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置代码页为简体中文，936是简体中文的代码页。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">std::locale&nbsp;loc1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;std::locale::global(std::locale(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.936</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br></span><span id=Codehighlighter1_93_140_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;在这里使用std::ifstream&nbsp;或者&nbsp;std::fstream<img src="http://www.cppblog.com/Images/dot.gif"></span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">恢复原来的代码页</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">std::locale::global(std::locale(loc1));</span><br></p>
<img src ="http://www.cppblog.com/singohgod/aggbug/98392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/singohgod/" target="_blank">大宝天天见</a> 2009-10-12 17:44 <a href="http://www.cppblog.com/singohgod/archive/2009/10/12/98392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]关于float运算中出现-1.#IND000的问题</title><link>http://www.cppblog.com/singohgod/archive/2009/09/02/95089.html</link><dc:creator>大宝天天见</dc:creator><author>大宝天天见</author><pubDate>Wed, 02 Sep 2009 04:12:00 GMT</pubDate><guid>http://www.cppblog.com/singohgod/archive/2009/09/02/95089.html</guid><wfw:comment>http://www.cppblog.com/singohgod/comments/95089.html</wfw:comment><comments>http://www.cppblog.com/singohgod/archive/2009/09/02/95089.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/singohgod/comments/commentRss/95089.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/singohgod/services/trackbacks/95089.html</trackback:ping><description><![CDATA[<p>在龙魂客户端中出现的模型突然消失的问题,百思不得其解,后来加上了日志输出,终于发现,设置的float的方向是-1.#IND000,原来是一个无穷小的浮点数,以至于float类型都不能表示了......看来float类型真是危险啊,竟然出现这种事....而且它不造成非法....现在加上了判断,就不会有这种问题了.但代码里面大量的float类型.....希望不会有事吧,阿门!</p>
<img src ="http://www.cppblog.com/singohgod/aggbug/95089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/singohgod/" target="_blank">大宝天天见</a> 2009-09-02 12:12 <a href="http://www.cppblog.com/singohgod/archive/2009/09/02/95089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]Visual Studio中的debug和release版本的区别</title><link>http://www.cppblog.com/singohgod/archive/2007/11/12/36461.html</link><dc:creator>大宝天天见</dc:creator><author>大宝天天见</author><pubDate>Mon, 12 Nov 2007 12:59:00 GMT</pubDate><guid>http://www.cppblog.com/singohgod/archive/2007/11/12/36461.html</guid><wfw:comment>http://www.cppblog.com/singohgod/comments/36461.html</wfw:comment><comments>http://www.cppblog.com/singohgod/archive/2007/11/12/36461.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/singohgod/comments/commentRss/36461.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/singohgod/services/trackbacks/36461.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt">Debug通常称为调试版本，它包含调试信息，并且不作任何优化，便于程序员调试程序。Release称为发布版本，它往往是进行了各种优化，使得程序在代码大小和运行速度上都是最优的，以便用户很好地使用。<br>Debug 和 Release 的真正秘密，在于一组编译选项。下面列出了分别针对二者的选项（当然除此之外还有其他一些，如/Fd /Fo，但区别并不重要，通常他们也不会引起 Release 版错误，在此不讨论）<br>Debug 版本</p>
<p style="FONT-SIZE: 10pt">参数 含义 <br>/MDd /MLd 或 /MTd 使用 Debug runtime library (调试版本的运行时刻函数库) <br>/Od 关闭优化开关 <br>/D "_DEBUG" 相当于 #define _DEBUG,打开编译调试代码开关 (主要针对assert函数) <br>/ZI 创建 Edit and continue(编辑继续)数据库，这样在调试过程中如果修改了源代码不需重新编译 <br>/GZ 可以帮助捕获内存错误 <br>/Gm 打开最小化重链接开关， 减少链接时间 <br>&nbsp;<br>Release 版本 </p>
<p style="FONT-SIZE: 10pt">参数 含义 <br>/MD /ML 或 /MT 使用发布版本的运行时刻函数库 <br>/O1 或 /O2 优化开关，使程序最小或最快 <br>/D "NDEBUG" 关闭条件编译调试代码开关 (即不编译assert函数) <br>/GF 合并重复的字符串， 并将字符串常量放到只读内存， 防止被修改 <br>&nbsp;<br>实际上，Debug 和 Release 并没有本质的界限，他们只是一组编译选项的集合，编译器只是按照预定的选项行动。事实上，我们甚至可以修改这些选项，从而得到优化过的调试版本或是带跟踪语句的发布版本。 <br>哪些情况下 Release 版会出错 <br>有了上面的介绍，我们再来逐个对照这些选项看看 Release 版错误是怎样产生的 <br>1、Runtime Library：链接哪种运行时刻函数库通常只对程序的性能产生影响。调试版本的 Runtime Library 包含了调试信息，并采用了一些保护机制以帮助发现错误，因此性能不如发布版本。编译器提供的 Runtime Library 通常很稳定，不会造成 Release 版错误；倒是由于 Debug 的 Runtime Library 加强了对错误的检测，如堆内存分配，有时会出现 Debug 有错但 Release 正常的现象。应当指出的是，如果 Debug 有错，即使 Release 正常，程序肯定是有 Bug 的，只不过可能是 Release 版的某次运行没有表现出来而已。 <br>2、优化：这是造成错误的主要原因，因为关闭优化时源程序基本上是直接翻译的，而打开优化后编译器会作出一系列假设。这类错误主要有以下几种： <br>1. 帧指针(Frame Pointer)省略（简称FPO）：在函数调用过程中，所有调用信息（返回地址、参数）以及自动变量都是放在栈中的。若函数的声明与实现不同（参数、返回值、调用方式），就会产生错误，但 Debug 方式下，栈的访问通过 EBP 寄存器保存的地址实现，如果没有发生数组越界之类的错误（或是越界&#8220;不多&#8221;），函数通常能正常执行；Release 方式下，优化会省略 EBP 栈基址指针，这样通过一个全局指针访问栈就会造成返回地址错误是程序崩溃。 <br>C++ 的强类型特性能检查出大多数这样的错误，但如果用了强制类型转换，就不行了。你可以在 Release 版本中强制加入/Oy-编译选项来关掉帧指针省略，以确定是否此类错误。此类错误通常有：MFC 消息响应函数书写错误。正确的应为： </p>
<p style="FONT-SIZE: 10pt">afx_msg LRESULT OnMessageOwn<br>(WPARAM wparam, LPARAM lparam);<br>&nbsp;<br>ON_MESSAGE 宏包含强制类型转换。防止这种错误的方法之一是重定义 ON_MESSAGE 宏，把下列代码加到 stdafx.h 中（在#include "afxwin.h"之后）,函数原形错误时编译会报错。 </p>
<p style="FONT-SIZE: 10pt">#undef ON_MESSAGE<br>#define ON_MESSAGE(message, memberFxn) \<br>{<br>message, 0, 0, 0, AfxSig_lwl, \<br>(AFX_PMSG)(AFX_PMSGW)<br>(static_cast&lt; LRESULT (AFX_MSG_CALL \<br>CWnd::*)(WPARAM, LPARAM) &gt; (&amp;memberFxn)<br>},</p>
<p style="FONT-SIZE: 10pt">2. volatile 型变量：volatile 告诉编译器该变量可能被程序之外的未知方式修改（如系统、其他进程和线程）。优化程序为了使程序性能提高，常把一些变量放在寄存器中（类似于 register 关键字），而其他进程只能对该变量所在的内存进行修改，而寄存器中的值没变。 <br>如果你的程序是多线程的，或者你发现某个变量的值与预期的不符而你确信已正确的设置了，则很可能遇到这样的问题。这种错误有时会表现为程序在最快优化出错而最小优化正常。把你认为可疑的变量加上 volatile 试试。<br>3. 变量优化：优化程序会根据变量的使用情况优化变量。例如，函数中有一个未被使用的变量，在 Debug 版中它有可能掩盖一个数组越界，而在 Release 版中，这个变量很可能被优化调，此时数组越界会破坏栈中有用的数据。当然，实际的情况会比这复杂得多。与此有关的错误有非法访问，包括数组越界、指针错误等。例如：</p>
<p style="FONT-SIZE: 10pt">void fn(void)<br>{<br>&nbsp; int i;<br>&nbsp; i = 1;<br>&nbsp; int a[4];<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; int j;<br>&nbsp;&nbsp;&nbsp; j = 1;<br>&nbsp; }<br>&nbsp; a[-1] = 1;<br>&nbsp; //当然错误不会这么明显，例如下标是变量<br>&nbsp; a[4] = 1;<br>}<br>&nbsp;<br>&nbsp;<br>j 虽然在数组越界时已出了作用域，但其空间并未收回，因而 i 和 j 就会掩盖越界。而 Release 版由于 i、j 并未其很大作用可能会被优化掉，从而使栈被破坏。 <br>3. DEBUG 与 NDEBUG ：当定义了 _DEBUG 时，assert() 函数会被编译，而 NDEBUG 时不被编译。此外，TRACE() 宏的编译也受 _DEBUG 控制。 <br>所有这些断言都只在 Debug版中才被编译，而在 Release 版中被忽略。唯一的例外是 VERIFY()。事实上，这些宏都是调用了assert()函数，只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了任何程序代码，而不只是布尔表达式（例如赋值、能改变变量值的函数调用等），那么Release版都不会执行这些操作，从而造成错误。初学者很容易犯这类错误，查找的方法也很简单，因为这些宏都已在上面列出，只要利用 VC++ 的 Find in Files 功能在工程所有文件中找到用这些宏的地方再一一检查即可。另外，有些高手可能还会加入 #ifdef _DEBUG 之类的条件编译，也要注意一下。 <br>顺便值得一提的是VERIFY()宏，这个宏允许你将程序代码放在布尔表达式里。这个宏通常用来检查 Windows API的返回值。有些人可能为这个原因而滥用VERIFY()，事实上这是危险的，因为VERIFY()违反了断言的思想，不能使程序代码和调试代码完全分离，最终可能会带来很多麻烦。因此，专家们建议尽量少用这个宏。 <br>4. /GZ 选项：这个选项会做以下这些事： <br>1. 初始化内存和变量。包括用 0xCC 初始化所有自动变量，0xCD ( Cleared Data ) 初始化堆中分配的内存（即动态分配的内存，例如 new ），0xDD ( Dead Data ) 填充已被释放的堆内存（例如 delete ），0xFD( deFencde Data ) 初始化受保护的内存（debug 版在动态分配内存的前后加入保护内存以防止越界访问），其中括号中的词是微软建议的助记词。这样做的好处是这些值都很大，作为指针是不可能的（而且 32 位系统中指针很少是奇数值，在有些系统中奇数的指针会产生运行时错误），作为数值也很少遇到，而且这些值也很容易辨认，因此这很有利于在 Debug 版中发现 Release 版才会遇到的错误。要特别注意的是，很多人认为编译器会用0来初始化变量，这是错误的（而且这样很不利于查找错误）。 <br>2. 通过函数指针调用函数时，会通过检查栈指针验证函数调用的匹配性。（防止原形不匹配） <br>3. 函数返回前检查栈指针，确认未被修改。（防止越界访问和原形不匹配，与第二项合在一起可大致模拟帧指针省略 FPO ）通常 /GZ 选项会造成 Debug 版出错而 Release 版正常的现象，因为 Release 版中未初始化的变量是随机的，这有可能使指针指向一个有效地址而掩盖了非法访问。除此之外，/Gm/GF等选项造成错误的情况比较少，而且他们的效果显而易见，比较容易发现。 <br>怎样&#8220;调试&#8221; Release 版的程序 <br>遇到Debug成功但Release失败，显然是一件很沮丧的事，而且往往无从下手。如果你看了以上的分析，结合错误的具体表现，很快找出了错误，固然很好。但如果一时找不出，以下给出了一些在这种情况下的策略。 <br>1. 前面已经提过，Debug和Release只是一组编译选项的差别，实际上并没有什么定义能区分二者。我们可以修改Release版的编译选项来缩小错误范围。如上所述，可以把Release 的选项逐个改为与之相对的Debug选项，如/MD改为/MDd、/O1改为/Od，或运行时间优化改为程序大小优化。注意，一次只改一个选项，看改哪个选项时错误消失，再对应该选项相关的错误，针对性地查找。这些选项在Project\Settings...中都可以直接通过列表选取，通常不要手动修改。由于以上的分析已相当全面，这个方法是最有效的。 <br>2. 在编程过程中就要时常注意测试 Release 版本，以免最后代码太多，时间又很紧。 <br>3. 在 Debug 版中使用 /W4 警告级别，这样可以从编译器获得最大限度的错误信息，比如 if( i =0 )就会引起 /W4 警告。不要忽略这些警告，通常这是你程序中的 Bug 引起的。但有时 /W4 会带来很多冗余信息，如 未使用的函数参数 警告，而很多消息处理函数都会忽略某些参数。我们可以用: </p>
<p style="FONT-SIZE: 10pt">#progma warning(disable: 4702)<br>//禁止<br>//...<br>#progma warning(default: 4702)<br>//重新允许来暂时禁止某个警告，或使用<br>#progma warning(push, 3) <br>//设置警告级别为 /W3<br>//...<br>#progma warning(pop)<br>//重设为 /W4<br>&nbsp;<br>&nbsp;<br>来暂时改变警告级别，有时你可以只在认为可疑的那一部分代码使用 /W4。 <br>4. 你也可以像Debug一样调试你的Release版，只要加入调试符号。在Project/Settings... 中，选中 Settings for "Win32 Release"，选中 C/C++ 标签，Category 选 General，Debug Info 选 Program Database。再在 Link 标签 Project options 最后加上 "/OPT:REF" (引号不要输)。这样调试器就能使用 pdb 文件中的调试符号。 <br>但调试时你会发现断点很难设置，变量也很难找到??这些都被优化过了。不过令人庆幸的是，Call Stack窗口仍然工作正常，即使帧指针被优化，栈信息（特别是返回地址）仍然能找到。这对定位错误很有帮助。<br>==========================================================================<br>别人原创的文档，引用一下：&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; DEBUG和RELEASE&nbsp;&nbsp; 版本差异及调试相关问题：&nbsp;&nbsp; <br>&nbsp; .&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 内存分配问题&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量未初始化。下面的程序在debug中运行的很好。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thing&nbsp;&nbsp; *&nbsp;&nbsp; search(thing&nbsp;&nbsp; *&nbsp;&nbsp; something)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL&nbsp;&nbsp; found;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int&nbsp;&nbsp; i&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp; i&nbsp;&nbsp; &lt;&nbsp;&nbsp; whatever.GetSize();&nbsp;&nbsp; i++)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(whatever[i]-&gt;field&nbsp;&nbsp; ==&nbsp;&nbsp; something-&gt;field)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; /*&nbsp;&nbsp; found&nbsp;&nbsp; it&nbsp;&nbsp; */&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; found&nbsp;&nbsp; =&nbsp;&nbsp; TRUE;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; /*&nbsp;&nbsp; found&nbsp;&nbsp; it&nbsp;&nbsp; */&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(found)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; whatever[i];&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; NULL;&nbsp;&nbsp; <br>&nbsp; 而在release中却不行，因为debug中会自动给变量初始化found=FALSE,而在release版中则不会。所以尽可能的给变量、类或结构初始化。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据溢出的问题&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如：char&nbsp;&nbsp; buffer[10];&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; counter;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lstrcpy(buffer,&nbsp;&nbsp; "abcdefghik");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 在debug版中buffer的NULL覆盖了counter的高位，但是除非counter&gt;16M,什么问题也没有。但是在release版中，counter可能被放在寄存器中，这样NULL就覆盖了buffer下面的空间，可能就是函数的返回地址，这将导致ACCESS&nbsp;&nbsp; ERROR。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DEBUG版和RELEASE版的内存分配方式是不同的&nbsp;&nbsp; 。如果你在DEBUG版中申请&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ele&nbsp;&nbsp; 为&nbsp;&nbsp; 6*sizeof(DWORD)=24bytes,实际上分配给你的是32bytes（debug版以32bytes为单位分配），&nbsp;&nbsp; 而在release版，分配给你的就是24bytes（release版以8bytes为单位），所以在debug版中如果你写ele[6],可能不会有什么问题，而在release版中，就有ACCESS&nbsp;&nbsp; VIOLATE。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; II.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASSERT和VERIFY&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASSERT在Release版本中是不会被编译的。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; ASSERT宏是这样定义的&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #ifdef&nbsp;&nbsp; _DEBUG&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define&nbsp;&nbsp; ASSERT(x)&nbsp;&nbsp; if(&nbsp;&nbsp; (x)&nbsp;&nbsp; ==&nbsp;&nbsp; 0)&nbsp;&nbsp; report_assert_failure()&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #else&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define&nbsp;&nbsp; ASSERT(x)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endif&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实际上复杂一些，但无关紧要。假如你在这些语句中加了程序中必须要有的代码&nbsp;&nbsp; <br>&nbsp; 比如&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; ASSERT(pNewObj&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; CMyClass);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; pNewObj-&gt;MyFunction();&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 这种时候Release版本中的pNewObj不会分配到空间&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 所以执行到下一个语句的时候程序会报该程序执行了非法操作的错误。这时可以用VERIFY&nbsp;&nbsp; ：&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #ifdef&nbsp;&nbsp; _DEBUG&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define&nbsp;&nbsp; VERIFY(x)&nbsp;&nbsp; if(&nbsp;&nbsp; (x)&nbsp;&nbsp; ==&nbsp;&nbsp; 0)&nbsp;&nbsp; report_assert_failure()&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #else&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define&nbsp;&nbsp; VERIFY(x)&nbsp;&nbsp; (x)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endif&nbsp;&nbsp; <br>&nbsp; 这样的话，代码在release版中就可以执行了。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; III.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数问题：&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 自定义消息的处理函数，必须定义如下：&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; afx_msg&nbsp;&nbsp; LRESULT&nbsp;&nbsp; OnMyMessage(WPARAM,&nbsp;&nbsp; LPARAM);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 返回值必须是HRESULT型，否则Debug会过，而Release出错&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; IV.&nbsp;&nbsp;&nbsp;&nbsp; 内存分配&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 保证数据创建和清除的统一性：如果一个DLL提供一个能够创建数据的函数，那么这个DLL同时应该提供一个函数销毁这些数据。数据的创建和清除应该在同一个层次上。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; V.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DLL的灾难&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 人们将不同版本DLL混合造成的不一致性形象的称为&nbsp;&nbsp; &#8220;动态连接库的地狱&#8220;(DLL&nbsp;&nbsp; Hell)&nbsp;&nbsp; ，甚至微软自己也这么说(<a href="http://msdn.microsoft.com/library/techart/dlldanger1.htm">http://msdn.microsoft.com/library/techart/dlldanger1.htm</a>)。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你的程序使用你自己的DLL时请注意：&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不能将debug和release版的DLL混合在一起使用。debug都是debug版，release版都是release版。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 解决办法是将debug和release的程序分别放在主程序的debug和release目录下&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 千万不要以为静态连接库会解决问题，那只会使情况更糟糕。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; VI.&nbsp;&nbsp;&nbsp;&nbsp; RELEASE板中的调试&nbsp;&nbsp; ：&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将ASSERT()&nbsp;&nbsp; 改为&nbsp;&nbsp; VERIFY()&nbsp;&nbsp; 。找出定义在"#ifdef&nbsp;&nbsp; _DEBUG"中的代码，如果在RELEASE版本中需要这些代码请将他们移到定义外。查找TRACE(...)中代码，因为这些代码在RELEASE中也不被编译。&nbsp;&nbsp; 请认真检查那些在RELEASE中需要的代码是否并没有被便宜。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量的初始化所带来的不同，在不同的系统，或是在DEBUG/RELEASE版本间都存在这样的差异，所以请对变量进行初始化。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否在编译时已经有了警告?请将警告级别设置为3或4,然后保证在编译时没有警告出现.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; VII.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将Project&nbsp;&nbsp; Settings"&nbsp;&nbsp; 中&nbsp;&nbsp; "C++/C&nbsp;&nbsp; "&nbsp;&nbsp; 项目下优化选项改为Disbale（Debug）。编译器的优化可能导致许多意想不到的错误，请参考<a href="http://www.pgh.net/~newcomer/debug_release.htm">http://www.pgh.net/~newcomer/debug_release.htm</a>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此外对RELEASE版本的软件也可以进行调试，请做如下改动：&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 在"Project&nbsp;&nbsp; Settings"&nbsp;&nbsp; 中&nbsp;&nbsp; "C++/C&nbsp;&nbsp; "&nbsp;&nbsp; 项目下设置&nbsp;&nbsp; "category"&nbsp;&nbsp; 为&nbsp;&nbsp; "General"&nbsp;&nbsp; 并且将"Debug&nbsp;&nbsp; Info"设置为&nbsp;&nbsp; "Program&nbsp;&nbsp; Database"。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 在"Link"项目下选中"Generate&nbsp;&nbsp; Debug&nbsp;&nbsp; Info"检查框。&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; "Rebuild&nbsp;&nbsp; All"&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 如此做法会产生的一些限制：&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 无法获得在MFC&nbsp;&nbsp; DLL中的变量的值。&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 必须对该软件所使用的所有DLL工程都进行改动。&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 另：&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; MS&nbsp;&nbsp; BUG：MS的一份技术文档中表明，在VC5中对于DLL的"Maximize&nbsp;&nbsp; Speed"优化选项并未被完全支持，因此这将会引起内存错误并导致程序崩溃。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.sysinternals.com/">www.sysinternals.com</a>有一个程序DebugView，用来捕捉OutputDebugString的输出，运行起来后（估计是自设为system&nbsp;&nbsp; debugger）就可以观看所有程序的OutputDebugString的输出。此后，你可以脱离VC来运行你的程序并观看调试信息。&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有一个叫Gimpel&nbsp;&nbsp; Lint的静态代码检查工具，据说比较好用。<a href="http://www.gimpel.com/">http://www.gimpel.com</a>&nbsp;&nbsp; 不过要化$的。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 参考文献：&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.cygnus-software.com/papers/release_debugging.html">http://www.cygnus-software.com/papers/release_debugging.html</a>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.pgh.net/~newcomer/debug_release.htm">http://www.pgh.net/~newcomer/debug_release.htm</a> <br></p>
<img src ="http://www.cppblog.com/singohgod/aggbug/36461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/singohgod/" target="_blank">大宝天天见</a> 2007-11-12 20:59 <a href="http://www.cppblog.com/singohgod/archive/2007/11/12/36461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]Visual C++开发工具与调试技巧整理</title><link>http://www.cppblog.com/singohgod/archive/2007/10/10/33882.html</link><dc:creator>大宝天天见</dc:creator><author>大宝天天见</author><pubDate>Wed, 10 Oct 2007 03:28:00 GMT</pubDate><guid>http://www.cppblog.com/singohgod/archive/2007/10/10/33882.html</guid><wfw:comment>http://www.cppblog.com/singohgod/comments/33882.html</wfw:comment><comments>http://www.cppblog.com/singohgod/archive/2007/10/10/33882.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/singohgod/comments/commentRss/33882.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/singohgod/services/trackbacks/33882.html</trackback:ping><description><![CDATA[自己总是用VC平台来开发东西，但是有时候总是出这样那样的问题，呵呵，总是需要上网查资料来解决,在这里把自己用到上网查的一些技巧摘录如下,希望对大家有用，省去大家再去搜索的烦恼。<br><br><strong>1.如何在Release状态下进行调试</strong><br>Project－&gt;Setting＝&gt;ProjectSetting对话框，选择Release状态。C/C++标签中的Category选General，Optimizations选Disable(Debug)，Debut info选Program Database。在Link标签中选中Generate debug info复选框。<br><br>注：只是一个介乎Debug和Release的中间状态，所有的ASSERT、VERIFY都不起作用，函数调用方式已经是真正的调用，而不查表，但是这种状态下QuickWatch、调用队列跟踪功能仍然有效，和Debug版一样。<br><br><strong>2. Release和Debug有什么不同</strong><br>Release版称为发行版，Debug版称为调试版。<br>Debug中可以单步执行、跟踪等功能，但生成的可执行文件比较大，代码运行速度较慢。Release版运行速度较快，可执行文件较小，但在其编译条件下无法执行调试功能。<br>Release的exe文件链接的是标准的MFC DLL(Use MFC in a shared or static dll)。这些DLL在安装Windows的时候，已经配置，所以这些程序能够在没有安装Visual C++ 6.0的机器上运行。而Debug版本的exe链接了调试版本的MFC DLL文件，在没有安装Visual C++6.0的机器上不能运行，因为缺相应的DLL，除非选择use static dll when link。<br><br><strong>3. ASSERT和VERIFY有什么区别</strong><br>ASSERT里面的内容在Release版本中不编译，VERIFY里面的内容仍然翻译，但不再判断真假。所以后者更安全一点。<br>例如ASSERT(file.Open(strFileName))。<br>一旦到了Release版本中，这一行就忽略了，file根本就不Open()了，而且没有任何出错的信息。如果用VERIFY()就不会有这个问题。<br><br><strong>4.Workspace和Project之间是什么样的关系</strong><br>每个Workspace可以包括几个project，但只有一个处于Active状态，各个project之间可以有依赖关系，在project的Setting..中可以设定，比如那个Active状态的project可以依赖于其他的提供其函数调用的静态库。<br><br><strong>5. 如何在非MFC程序中使用ClassWizard</strong><br>在工程目录下新建一个空的.RC文件，然后加入到工程中就可以了。<br><br><strong>6.如何设置断点</strong><br>按F9在当前光标处增加一个断点和取消一个断点。<br>另外，在编辑状态下，按Ctrl+B组合键，弹出断点设置对话框。然后单击【Condition&#8230;】按钮弹出设置断点条件的对话框进行设置。<br><br><strong>7.在编辑状态下发现成员变量或函数不能显示提示是如何打开显示功能</strong><br>这似乎是目前这个Visual C++ 6.0版本的一个bug，可按如下步骤使其正常，如再出现，可如法炮制：<br>(1)关闭Project<br>(2)删除&#8220;工程名.ncb&#8221;文件<br>(3)重新打开工程<br><br><strong>8.如何将一个通过ClassWizard生成的类彻底删除</strong><br>首先在工作区的FileView中选中该类的.h和.cpp文件，按delete删除，然后在文件管理器中将这两个文件删除，再运行ClassWizard，这时出现是否移走该类的提示，选择remove就可以了。<br><br><strong>9. 如何将在workspace中消失的类找出来</strong><br>打开该类对应的头文件，然后将其类名随便改一下，这个时候工作区就会出现新的类，再将这个类改回原来的名字就可以了。<br><br><strong>10. 如何清除所有的断点</strong><br>菜单【Edit】－&gt;【Breakpoints&#8230;】，打开&#8220;Breakpoints&#8221;对话框，单击【Remove All】按钮即可。快捷键是&#8220;Ctrl + Shift + F8&#8221;。<br><br><strong>11. 如何再ClassWizard中选择未列出的信息</strong><br>打开&#8220;ClassWizard&#8221;对话框，然后切换到&#8220;Class Info&#8221;页面。改变&#8220;Message filter&#8221;，如选择&#8220;Window&#8221;，&#8220;Message&#8221;页面就会出现Window的信息。<br><br><strong>12. 如何检测程序中的括号是否匹配</strong><br>把光标移动到需要检测的括号前面，按快捷键&#8220;Ctrl + ]&#8221;。如果括号匹配正确，光标就跳到匹配的括号处，否则光标不移动，并且机箱喇叭还会发出一声警告。<br><br><strong>13. 如何查看一个宏(或变量、函数)的定义</strong><br>把光标移动到要查看的一个宏上，就比如说最常见的DECLARE_MAP_MESSAGE上按一下F12(或右键菜单中的相关菜单)，如果没有建立浏览文件，就会出现提示对话框，按【确定】按钮，然后就会跳到该宏(或变量、函数)定义的地方。<br><br><strong>14. 如何添加Lib文件到当前工程</strong><br>单击菜单【Project】－&gt;【Settings&#8230;】弹出&#8220;Project Setting&#8221;对话框，切换到&#8220;Link&#8221;标签页，在&#8220;Object/library modules&#8221;处输入Lib文件名称，不同的Lib之间用空格格开。<br><br><strong>15. 如何快速删除项目下的Debug文件夹中临时文件</strong><br>在工作区的FileView视图中选中对应的项目，单击右键弹出菜单，选择【Clean(selection only)】菜单即可。<br><br><strong>16. 如何快速生成一个现有工程除了工程名外完全相同的新工程</strong><br>在新建工程的&#8220;New&#8221;对话框中选择&#8220;Custom Appwizard&#8221;项，输入新工程的名字，单击【OK】按钮。出现&#8220;Custom AppWizard&#8221;项，输入新工程的名字，单击【OK】按钮。出现&#8220;Custom AppWizard－Step 1 of 2&#8221;对话框，选择&#8220;An existing Project&#8221;项，单击【Next】按钮。出现&#8220;Custom AppWizard－Step 2 of 2&#8221;对话框，选择现有工程的工程文件名，最后单击【Finish】按钮。编译后就生成一个与现有工程相同但可以重新取名的工程AppWizard。<br>现在就可以项用MFC AppWizard一样用这个定制的向导。如果不想用了，可以在Visual C++ 6.0安装目录下Common\MSDev98\Template目录中删除该Wizard对应的.awx和.pdb文件。<br><br><strong>17. 如何解决Visual C++ 6.0不正确连接的问题</strong><br>情景：明明改动了一个文件，却要把整个项目全部重新编译链接一次。刚刚链接好，一运行，又提示重新编译链接一次。<br>这是因为出现了未来文件(修改时间和创建时间比系统时间晚)的缘故。可以这样处理：找到工程文件夹下的debug目录，将创建和修改时间都比系统时间的文件全部删除，然后再从新&#8220;Rebuild All&#8221;一次。<br><br><strong>18. 引起LNK2001的常见错误都有哪些</strong><br>遇到的LNK2001错误主要为：unresolved external symbol &#8220;symbol&#8221;<br>如果链接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签，将产生此错误信息。<br>一般来说，发生错误的原因有两个：一是所引用的函数、变量不存在，拼写不正确或者使用错误；其次可能使用了不同版本的链接库。以下是可能产生LNK2001错误的原因：<br>&lt;1&gt;由于编码错误导致的LNK2001错误<br>(1)不相匹配的程序代码或模块定义(.DEF)文件导致LNK2001。例如，如果在C++源文件了内声明了一变量&#8220;var1&#8221;，却试图在另一个文件内以变量&#8220;var1&#8221;访问改变量。<br>(2)如果使用的内联函数是在.cpp文件内定义的，而不是在头文件内定义将导致LNK2001错误。<br>(3)调用函数时如果所用的参数类型和头函数声明时的类型不符将会产生LNK2001错误。<br>(4)试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001错误。<br>(5)要注意函数和变量的可公用性，只有全局变量、函数是可公用的。静态函数和静态变量具有相同的使用范围限制。当试图从文件外部方位任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001错误。<br>&lt;2&gt;由于编译和联机的设置而造成的LNK2001错误<br>(1)如果编译时使用的是/NOD(/NODERAULTLIB)选项，程序所需要的运行库和MFC时将得到又编译器写入目标文件模块，但除非在文件中明确包含这些库名，否则这些库不会被链接进工程文件。这种情况下使用/NOD将导致LNK2001错误<br>(2)如果没有为wWinMainCRTStartup设定程序入口，在使用Unicode和MFC时将出现&#8220;unresolved external on _WinMain@16&#8221;的LNK2001错误信息。<br>(3)使用/MD选项编译时，既然所有的运行库都被保留在动态链接库之内，源文件中对&#8220;func&#8221;的引用，在目标文件里即对&#8220;__imp__func&#8221;的引用。如果试图使用静态库LIBC.LIB或LIBCMT.LIB进行链接，将在__imp__func上发生LNK2001错误。如果不使用/MD选项编译，在使用MSVCxx.LIB链接时也会发生LNK2001错误。<br>(4)使用/ML选项编译时，如用LIBCMT.LIB链接会在_errno上发生LNK2001错误。<br>(5)当编译调试版的应用程序时，如果采用发行版模态库进行链接也会产生LNK2001错误；同样，使用调试版模态库链接发行版应用程序时也会产生相同的错误。<br>(6)不同版本的库和编译器的混合使用也能产生问题，因为新版的库里可能包含早先的版本没有的符号和说明。<br>(7)在不同的模块中使用内联和非内联的编译选项能够导致LNK2001错误。如果创建C++库时打开了函数内联(/Ob1或/Ob2)，但是在描述该函数的相应头文件里却关闭了函数内联(没有inline关键字)，只是将得到错误信息。为避免该问题的发生，应该在相应的头文件中用inline关键字标志为内联函数。<br>(8)不正确的/SUBSYSTEM或ENTRY设置也能导致LNK2001错误。<br><br><strong>19. 如何调试一个没有源码的exe文件调用的dll</strong><br>在Visual C++ 6.0中，进入&#8220;Project Setting&#8221;对话框然后选择Debug标签页。通常Visual Studio默认&#8220;executable for debug session&#8221;为可执行文件名，但可以将他改成任何你想要的程序。甚至可以指定不同的工作目录以及传递参数到你的程序。这个技术常用来调试Dlls、名字空间扩展、COM对象和其他从某些EXE以及从第三方的EXE中调用的plug-in程序。<br><br><strong>20. Visual C++ 6.0工程中的项目文件都表示什么</strong><br>.opt：工程关于开发环境的参数文件。如工具条位置等信息。<br>.aps(AppStudio File)资源辅助文件，二进制格式，一般不用去管它。<br>.clw：ClassWizard信息文件，实际上是INI文件格式，有兴趣可以研究一下。有时候ClassWizard出了问题，手工修改CLW文件可以解决。如果此文件不存在的话，每次用ClassWizard的时候回提示是否重建。<br>.dsp(DevelopStudio Project)：项目文件，文本格式，不过不熟悉的不要手工修改。<br>.dsw(DevelopStudio Workspace)：是工作区文件，其他特点和.dsp差不多。<br>.plg：是编译信息文件，编译时的error和warning信息文件(实际上是一个html文件)，一般用处不大。在单击菜单【Tool】－&gt;【Option】弹出的对话框里面有个选项可以控制这个文件的生成。<br>.hpj(Help Project)：是生成帮助文件的工程，用microsoft Help Compiler可以处理。<br>.mdp(Microsoft DevStudio Project)：是旧版本的项目文件，如果要打开此文件的话，会提示你是否转换成新的.dsp格式。<br>.bsc：是用于浏览项目信息的，如果用Source Brower的话就必须有这个文件。如果不用这个功能的话，可以在Project Options里面去掉Generate Browse Info File，这样可以加快编译速度。<br>.map是执行文件的映象信息记录文件，除非对系统底层，这个文件一般用不着。<br>.pch(Pre-Compiled File)：是与编译文件，可以加快编译速度，但是文件非常大。<br>.pdb(Program Database)：记录了程序有关的一些数据和调试信息，在调试的时候可能有用。<br>.exp：只有在编译DLL的时候才会生成，记录了DLL文件的一些信息，一般也没有用。<br>.ncb：无编译浏览文件(no compile browser)。当自动完成功能出问题时可以删除此文件。编译工程后会自动生成。 
<img src ="http://www.cppblog.com/singohgod/aggbug/33882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/singohgod/" target="_blank">大宝天天见</a> 2007-10-10 11:28 <a href="http://www.cppblog.com/singohgod/archive/2007/10/10/33882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]关于查看编译时连接顺序</title><link>http://www.cppblog.com/singohgod/archive/2007/09/26/32923.html</link><dc:creator>大宝天天见</dc:creator><author>大宝天天见</author><pubDate>Wed, 26 Sep 2007 08:56:00 GMT</pubDate><guid>http://www.cppblog.com/singohgod/archive/2007/09/26/32923.html</guid><wfw:comment>http://www.cppblog.com/singohgod/comments/32923.html</wfw:comment><comments>http://www.cppblog.com/singohgod/archive/2007/09/26/32923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/singohgod/comments/commentRss/32923.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/singohgod/services/trackbacks/32923.html</trackback:ping><description><![CDATA[
<p><span style="FONT-SIZE: 0.9em"><span style="FONT-SIZE: 1em">今天遇到很诡异的问题,<span style="FONT-SIZE: 0.75em"><span style="COLOR: #cc0033">MSVCRTD.LIB</span> <span style="COLOR: #0000ff">LIBCMTD.LIB</span> 这两个库如果连接顺序反了就会报错<br/><span style="FONT-SIZE: 2em"><span style="FONT-SIZE: 0.75em">加上/verbose:lib可以看到连接顺序,正在修改中...</span></span></span></span><br/><br/>顺便记录一下,警告太多的话可以将警告等级调整一下,就在项目的属性里面~</span></p>
<p>还有种原因是使用了<span style="COLOR: #ff0000">tchar</span>造成的,需要修改winmain入口函数:</p>
<p>将 <span style="COLOR: #ff0000">_tWinMain(.., .., LPTSTR, ..)</span> 修改为:</p>
<p><span style="COLOR: #ff0000">WinMain(.., .., LPSTR, ..)</span> 即可.<br/></p>
<img src ="http://www.cppblog.com/singohgod/aggbug/32923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/singohgod/" target="_blank">大宝天天见</a> 2007-09-26 16:56 <a href="http://www.cppblog.com/singohgod/archive/2007/09/26/32923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]微软C/C++ 编译器选项参考</title><link>http://www.cppblog.com/singohgod/archive/2007/04/27/23016.html</link><dc:creator>大宝天天见</dc:creator><author>大宝天天见</author><pubDate>Fri, 27 Apr 2007 01:57:00 GMT</pubDate><guid>http://www.cppblog.com/singohgod/archive/2007/04/27/23016.html</guid><wfw:comment>http://www.cppblog.com/singohgod/comments/23016.html</wfw:comment><comments>http://www.cppblog.com/singohgod/archive/2007/04/27/23016.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/singohgod/comments/commentRss/23016.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/singohgod/services/trackbacks/23016.html</trackback:ping><description><![CDATA[微软C/C++ 编译器选项 <br>-优化- <br>/O1 最小化空间 minimize space <br>/Op[-] 改善浮点数一致性 improve floating-pt consistency <br>/O2 最大化速度 maximize speed <br>/Os 优选代码空间 favor code space <br>/Oa 假设没有别名 assume no aliasing <br>/Ot 优选代码速度 favor code speed <br>/Ob 内联展开（默认 n=0） inline expansion (default n=0) <br>/Ow 假设交叉函数别名 assume cross-function aliasing <br>/Od 禁用优化（默认值） disable optimizations (default) <br>/Ox 最大化选项。(/Ogityb2 /Gs) maximum opts. (/Ogityb1 /Gs) <br>/Og 启用全局优化 enable global optimization <br>/Oy[-] 启用框架指针省略 enable frame pointer omission <br>/Oi 启用内建函数 enable intrinsic functions <br>-代码生成- <br>/G3 为 80386 进行优化 optimize for 80386 <br>/G4 为 80486 进行优化 optimize for 80486 <br>/GR[-] 启用 C++ RTTI enable C++ RTTI <br>/G5 为 Pentium 进行优化 optimize for Pentium <br>/G6 为 Pentium Pro 进行优化 optimize for Pentium Pro <br>/GX[-] 启用 C++ 异常处理（与 /EHsc 相同） enable C++ EH (same as /EHsc) <br>/EHs 启用同步 C++ 异常处理 enable synchronous C++ EH <br>/GD 为 Windows DLL 进行优化 optimize for Windows DLL <br>/GB 为混合模型进行优化（默认） optimize for blended model (default) <br>/EHa 启用异步 C++ 异常处理 enable asynchronous C++ EH <br>/Gd __cdecl 调用约定 __cdecl calling convention <br>/EHc extern&#8220;C&#8221;默认为 nothrow extern "C" defaults to nothrow <br>/Gr __fastcall 调用约定 __fastcall calling convention <br>/Gi[-] 启用增量编译 enable incremental compilation <br>/Gz __stdcall 调用约定 __stdcall calling convention <br>/Gm[-] 启用最小重新生成 enable minimal rebuild <br>/GA 为 Windows 应用程序进行优化 optimize for Windows Application <br>/Gf 启用字符串池 enable string pooling <br>/QIfdiv[-] 启用 Pentium FDIV 修复 enable Pentium FDIV fix <br>/GF 启用只读字符串池 enable read-only string pooling <br>/QI0f[-] 启用 Pentium 0x0f 修复 enable Pentium 0x0f fix <br>/Gy 分隔链接器函数 separate functions for linker <br>/GZ 启用运行时调试检查 enable runtime debug checks <br>/Gh 启用钩子函数调用 enable hook function call <br>/Ge 对所有函数强制堆栈检查 force stack checking for all funcs <br>/Gs[num] 禁用堆栈检查调用 disable stack checking calls <br>-输出文件- <br>/Fa[file] 命名程序集列表文件 name assembly listing file <br>/Fo 命名对象文件 name object file <br>/FA[sc] 配置程序集列表 configure assembly listing <br>/Fp 命名预编译头文件 name precompiled header file <br>/Fd[file] 命名 .PDB 文件 name .PDB file <br>/Fr[file] 命名源浏览器文件 name source browser file <br>/Fe 命名可执行文件 name executable file <br>/FR[file] 命名扩展 .SBR 文件 name extended .SBR file <br>/Fm[file] 命名映射文件 name map file <br>-预处理器- <br>/FI 命名强制包含文件 name forced include file <br>/C 不吸取注释 don't strip comments <br>/U 移除预定义宏 remove predefined macro <br>/D{=|#} 定义宏 define macro <br>/u 移除所有预定义宏 remove all predefined macros <br>/E 将预处理定向到标准输出 preprocess to stdout <br>/I 添加到包含文件的搜索路径 add to include search path <br>/EP 将预处理定向到标准输出，不要带行号 preprocess to stdout, no #line <br>/X 忽略&#8220;标准位置&#8221; ignore "standard places" <br>/P 预处理到文件 preprocess to file <br>-语言- <br>/Zi 启用调试信息 enable debugging information <br>/Zl 忽略 .OBJ 中的默认库名 omit default library name in .OBJ <br>/ZI 启用调试信息的&#8220;编辑并继续&#8221;功能 enable Edit and Continue debug info <br>/Zg 生成函数原型 generate function prototypes <br>/Z7 启用旧式调试信息 enable old-style debug info <br>/Zs 只进行语法检查 syntax check only <br>/Zd 仅要行号调试信息 line number debugging info only <br>/vd{0|1} 禁用/启用 vtordisp disable/enable vtordisp <br>/Zp[n] 在 n 字节边界上包装结构 pack structs on n-byte boundary <br>/vm 指向成员的指针类型 type of pointers to members <br>/Za 禁用扩展（暗指 /Op） disable extensions (implies /Op) <br>/noBool 禁用&#8220;bool&#8221;关键字 disable "bool" keyword <br>/Ze 启用扩展（默认） enable extensions (default) <br>- 杂项 - <br>/?, /help 打印此帮助消息 print this help message <br>/c 只编译，不链接 compile only, no link <br>/W 设置警告等级（默认 n=1） set warning level (default n=1) <br>/H 最大化外部名称长度 max external name length <br>/J 默认 char 类型是 unsigned default char type is unsigned <br>/nologo 取消显示版权消息 suppress copyright message <br>/WX 将警告视为错误 treat warnings as errors <br>/Tc 将文件编译为 .c compile file as .c <br>/Yc[file] 创建 .PCH 文件 create .PCH file <br>/Tp 将文件编译为 .cpp compile file as .cpp <br>/Yd 将调试信息放在每个 .OBJ 中 put debug info in every .OBJ <br>/TC 将所有文件编译为 .c compile all files as .c <br>/TP 将所有文件编译为 .cpp compile all files as .cpp <br>/Yu[file] 使用 .PCH 文件 use .PCH file <br>/V 设置版本字符串 set version string <br>/YX[file] 自动的 .PCH 文件 automatic .PCH <br>/w 禁用所有警告 disable all warnings <br>/Zm 最大内存分配（默认为 %） max memory alloc (% of default) <br>-链接- <br>/MD 与 MSVCRT.LIB 链接 link with MSVCRT.LIB <br>/MDd 与 MSVCRTD.LIB 调试库链接 link with MSVCRTD.LIB debug lib <br>/ML 与 LIBC.LIB 链接 link with LIBC.LIB <br>/MLd 与 LIBCD.LIB 调试库链接 link with LIBCD.LIB debug lib <br>/MT 与 LIBCMT.LIB 链接 link with LIBCMT.LIB <br>/MTd 与 LIBCMTD.LIB 调试库链接 link with LIBCMTD.LIB debug lib <br>/LD 创建 .DLL Create .DLL <br>/F 设置堆栈大小 set stack size <br>/LDd 创建 .DLL 调试库 Create .DLL debug libary <br>/link [链接器选项和库] [linker options and libraries] 
<img src ="http://www.cppblog.com/singohgod/aggbug/23016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/singohgod/" target="_blank">大宝天天见</a> 2007-04-27 09:57 <a href="http://www.cppblog.com/singohgod/archive/2007/04/27/23016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]VC 常用快捷键 </title><link>http://www.cppblog.com/singohgod/archive/2007/01/19/17772.html</link><dc:creator>大宝天天见</dc:creator><author>大宝天天见</author><pubDate>Fri, 19 Jan 2007 01:31:00 GMT</pubDate><guid>http://www.cppblog.com/singohgod/archive/2007/01/19/17772.html</guid><wfw:comment>http://www.cppblog.com/singohgod/comments/17772.html</wfw:comment><comments>http://www.cppblog.com/singohgod/archive/2007/01/19/17772.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/singohgod/comments/commentRss/17772.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/singohgod/services/trackbacks/17772.html</trackback:ping><description><![CDATA[
		<span style="COLOR: #000000">   F5: 启动<br />   Ctrl + F5: 执行<br />   F7: 生成<br />   F9: 设置/取消断点<br />   F10: 逐过程<br />   F11: 逐语句<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />   Ctrl</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">F: 查找 <br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Ctrl</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">Shift</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">F: 在文件中查找 <br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />F3: 查找下一个 <br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Shift</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">F3: 查找上一个 <br /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Ctrl</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">H: 替换 <br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Ctrl</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">Shift</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">H: 在文件中替换 <br /></span>
		<span style="COLOR: #000000">
				<br />
				<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Ctrl</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">Shift</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">V: 剪贴板循环<br /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Ctrl</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">左右箭头键: 一次可以移动一个单词 <br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Ctrl</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">上下箭头键: 滚动代码屏幕，但不移动光标位置。<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Ctrl</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">Shift</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">L: 删除当前行<br /></span>
		<span style="COLOR: #000000">
				<br />
				<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Ctrl</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">Shift</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">U: 全部变为大写 <br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Ctrl</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">U: 全部变为小写<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Ctrl</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">J</span>
		<span style="COLOR: #000000">: 列出成员 <br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />Ctrl</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">Shift</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">空格键</span>
		<span style="COLOR: #000000">: 参数信息<br /><br /></span>
		<span style="COLOR: #000000">
				<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
		</span>
		<span style="COLOR: #000000">Ctrl</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">K,C: 注释选定内容<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span>
		<span style="COLOR: #000000">Ctrl</span>
		<span style="COLOR: #000000">+</span>
		<span style="COLOR: #000000">K,U: 取消选定注释内容<br /><br /></span>
		<span style="COLOR: #000000">
				<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />F12: 转到所调用过程或变量的定义<br /><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /></span>
		<br />
<img src ="http://www.cppblog.com/singohgod/aggbug/17772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/singohgod/" target="_blank">大宝天天见</a> 2007-01-19 09:31 <a href="http://www.cppblog.com/singohgod/archive/2007/01/19/17772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]C++资源之不完全导引（完整版）</title><link>http://www.cppblog.com/singohgod/archive/2007/01/19/17770.html</link><dc:creator>大宝天天见</dc:creator><author>大宝天天见</author><pubDate>Fri, 19 Jan 2007 01:20:00 GMT</pubDate><guid>http://www.cppblog.com/singohgod/archive/2007/01/19/17770.html</guid><wfw:comment>http://www.cppblog.com/singohgod/comments/17770.html</wfw:comment><comments>http://www.cppblog.com/singohgod/archive/2007/01/19/17770.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/singohgod/comments/commentRss/17770.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/singohgod/services/trackbacks/17770.html</trackback:ping><description><![CDATA[
		<table class="fixedTable blogpost" cellspacing="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="ellipse">
										<span class="bvTitle" id="subjcns!1p5qP-LmQlonNx_ujZCY3OgA!128">
												<strong>
														<font size="3">C++资源之不完全导引（完整版）</font>
												</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="bvh8">
										<strong>
												<font size="3">
												</font>
										</strong>
								</td>
						</tr>
						<tr>
								<td id="msgcns!1p5qP-LmQlonNx_ujZCY3OgA!128">
										<p>C++资源之不完全导引（完整版）</p>
										<p>来源：<a href="http://www.csdn.net/"><u><font color="#0000ff">www.csdn.net</font></u></a></p>
										<p>撰文：曾毅、陶文</p>
										<p>声明：本文2004年5月首发于《CSDN开发高手》，版权归该杂志与《程序员》杂志社<br />所有。</p>
										<p>------------------------------------------------------------------------<br />--------</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>　　1，前言</p>
		<p>　　无数次听到“我要开始学习C++!”的呐喊，无数次听到“C++太复杂了，我真的<br />学不会”的无奈。Stan Lippman先生曾在《C++ Primer》一书中指出“C++是最为难<br />学的高级程序设计语言之一”，人们常将“之一”去掉以表达自己对C++的敬畏。诚<br />然，C++程序设计语言对于学习者的确有很多难以逾越的鸿沟，体系结构的庞大，应<br />接不暇并不断扩充的特性……除此之外，参考资料之多与冗杂使它的学习者望而却<br />步，欲求深入者苦不堪言。希望这一份不完全导引能够成为您C++学习之路上的引路<br />灯。</p>
		<p>　　撰写本文的初衷并不打算带领大家体验古老的C++历史，如果你想了解C++的历<br />史与其前期发展中诸多技术的演变，你应当去参考Bjarne的《The Design and Evo<br />lution of C++》。当然也不打算给大家一个无所不包的宝典（并非不想：其一是因<br />水平有限，其二无奈C++之博大精深），所给出的仅仅是一些我们认为对于想学习C<br />++的广大读者来说最重要并且触手可及的开发与学习资源。</p>
		<p>　　本文介绍并分析了一些编译器，开发环境，库，少量的书籍以及参考网站，并<br />且尽可能尝试着给出一个利用这些资源的导引，望对如同我们一样的初学者能够有<br />所裨益。</p>
		<p>------------------------------------------------------------------------<br />--------</p>
		<p>　　2，编译器</p>
		<p>　　在C++之外的任何语言中，编译器都从来没有受到过如此之重视。因为C++是一<br />门相当复杂的语言，所以编译器也难于构建。直到最近我们才开始能够使用上完全<br />符合C++标准的编译器（哦，你可能会责怪那些编译器厂商不能尽早的提供符合标准<br />的编译器，这只能怪他们各自维系着自身的一套别人不愿接受的标准）。什么？你<br />说这无关紧要？哦，不，你所需要的是和标准化C++高度兼容的编译环境。长远来看<br />，只有这样的编译器对C++开发人员来说才是最有意义的工具，尤其是对于程序设计<br />语言的学习者。一至性让代码具备可移植性，并让一门语言及其库的应用更为广泛<br />。嗯，是的，我们这里只打算介绍一些公认的优秀编译器。</p>
		<p>　　2.1 Borland C++</p>
		<p>　　这个是Borland C++ Builder和Borland C++ Builder X这两种开发环境的后台<br />编译器。（哦，我之所以将之分为两种开发环境你应当能明白为什么，正如Delphi<br />7到Delphi8的转变，是革命性的两代。）Borland C++由老牌开发工具厂商Borland<br />倾力打造。该公司的编译器素以速度快，空间效率高著称，Borland C++ 系列编译<br />器秉承了这个传统，属于非常优质的编译器。标准化方面早在5.5版本的编译器中对<br />标准化C++的兼容就达到了92.73%。目前最新版本是Borland C++ Builder X中的6.<br />0版本，官方称100%符合ANSI/ISO的C++标准以及C99标准。嗯…这正是我前面所指的<br />“完全符合C++标准的编译器”。</p>
		<p>　　2.2 Visual C++</p>
		<p>　　这个正是我们熟知的Visual Studio 和 Visual Studio.net 2002, 2003以及2<br />005 Whidbey中带的C++编译器。由Microsoft公司研制。在Visual Studio 6.0中，<br />因为编译器有太多地方不能与后来出现的C++标准相吻合而饱受批评（想想你在使用<br />STL的时候编译时报出的那些令人厌恶的error和warning吧）。VC++6.0对标准化C+<br />+的兼容只有83.43%。但是随着C++编译器设计大师Stanley Lippman以及诸多C++社<br />群达人的加盟，在Visual Studio.NET 2003中，Visual C++编译器已经成为一个非<br />常成熟可靠的C++编译器了。Dr.Dobb's Journal的评测显示Visual C++7.1对标准C<br />++的兼容性高达98.22%，一度成为CBX之前兼容性最好的编译器。结合强大的Visua<br />l Studio.NET开发环境，是一个非常不错的选择。至于Whidbey时代的Visual C++,<br />似乎微软所最关注的是C++/CLI……我们不想评论微软下一代的C++编译器对标准化<br />兼容如何，但他确实越来越适合.NET (其实你和我的感觉可能是一样的，微软不应<br />当把标准C++这块肥肉丢给Borland,然而微软可能并不这样认为)。</p>
		<p>　　2.3 GNU C++</p>
		<p>　　著名的开源C++编译器。是类Unix操作系统下编写C++程序的首选。特点是有非<br />常好的移植性，你可以在非常广泛的平台上使用它，同时也是编写跨平台，嵌入式<br />程序很好的选择。另外在符合标准这个方面一直都非常好，GCC3.3大概能够达到96<br />.15%。但是由于其跨平台的特性，在代码尺寸速度等优化上略微差一点。</p>
		<p>　　基于GNU C++的编译器有很多，比如：</p>
		<p>　　(1) Mingw</p>
		<p>　　<a href="http://www.mingw.org/"><u><font color="#0000ff">http://www.mingw.org/</font></u></a></p>
		<p>　　GCC的一个Windows的移植版本（Dev-C++的后台）</p>
		<p>　　(2) Cygwin</p>
		<p>　　<a href="http://sources.redhat.com/cygwin/"><u><font color="#0000ff">http://sources.redhat.com/cygwin/</font></u></a></p>
		<p>　　GCC的另外一个Windows移植版本是Cygwin的一部分，Cygwin是Windows下的一个<br />Unix仿真环境。严格的说是模拟GNU的环境，这也就是"Gnu's Not Unix"要表达的意<br />思，噢，扯远了，这并不是我们在这里关心的实质内容。</p>
		<p>　　(3) Djgpp</p>
		<p>　　<a href="http://www.delorie.com/djgpp/"><u><font color="#0000ff">http://www.delorie.com/djgpp/</font></u></a></p>
		<p>　　这是GCC的DOS移植版本。</p>
		<p>　　(4) RSXNT</p>
		<p>　　<a href="http://www.mathematik.uni-bielefeld.de/~rainer/"><u><font color="#0000ff">http://www.mathematik.uni-bielefeld.de/~rainer/</font></u></a></p>
		<p>　　这是GCC的DOS和Windows移植版本。</p>
		<p>　　(5) Intel C++</p>
		<p>　　著名CPU制造厂商Intel出品的编译器，Special Design for Intel x86！对于<br />Intel x86结构的CPU经过特别的优化。在有些应用情况下，特别是数值计算等高性<br />能应用，仅仅采用Intel的编译器编译就能大幅度的提高性能。</p>
		<p>　　(6) Digital Mars C++</p>
		<p>　　网络上提供免费下载，Zortech/Symantec C++的继承者，其前身在当年惨烈的<br />C++四国战中也是主角之一。</p>
		<p>------------------------------------------------------------------------<br />--------</p>
		<p>　　3，开发环境</p>
		<p>　　开发环境对于程序员的作用不言而喻。选择自己朝夕相处的环境也不是容易的<br />事情，特别是在IDE如此丰富的情况下。下面就是我们推荐的一些常见的C++开发环<br />境，并没有包括一些小型的，罕见的IDE。其中任何一款都是功能丰富，可以用作日<br />常开发使用的。对于不同层面的开发者，请参见内文关于适用对象的描述。</p>
		<p>　　3.1 Visual Studio 6.0</p>
		<p>　　这个虽然是Microsoft公司的老版本的开发环境，但是鉴于其后继版本Visual<br />Studio.NET的庞大身躯，以及初学者并不那么高的功能要求，所以推荐这个开发环<br />境给C++的初学者，供其学习C++的最基本的部分，比如C的那部分子集，当然你别指<br />望他能够支持最新的C99标准。在日常的开发中，仍然有很多公司使用这个经典稳定<br />的环境，比如笔者就看曾亲见有些公司将其编译器替换为GCC做手机开发之用。</p>
		<p>　　3.2 Visual Studio.NET 2003</p>
		<p>　　作为Microsoft公司官方正式发布的最新版本开发环境，其中有太多激动人心的<br />功能。结合其最新的C++编译器。对于机器配置比较好的开发人员来说，使用这个开<br />发环境将能满足其大部分的要求。这里不打算单独说Visual Studio Whidbey,虽然<br />Visual Studio .NET 2005 - Whidbey社区预览版已经推出，但暂不是很稳定，读者<br />可以亲身去体验。</p>
		<p>　　3.3 Borland C++ Builder 6</p>
		<p>　　这个并不是Borland的C++开发环境的最新版本。选择它的原因是它不是用Java<br />写的IDE，速度比较快。它有一个很完善的GUI窗体设计器，和Delphi共用一个VCL。<br />由于这些特点，比较适合初学者上手。但是由于其GUI的中心位置，可能不利于对于<br />C++语言的学习。而且其为了支持VCL这个Object Pascal写的库也对C++进行了一些<br />私有的扩充。使得人们有一个不得不接受的事实：“Borland C++ Builder 6的高手<br />几乎都是Delphi高手”。</p>
		<p>　　3.4 Borland C++ Builder X</p>
		<p>　　正如前文所述，虽然版本号上和前面那个IDE非常相象，但是其实它们是完全不<br />同的两个集成开发环境。C++Builder更多的是一个和Delphi同步的C++版本的开发环<br />境，C++BuilderX则是完全从C++的角度思考得出的一个功能丰富的IDE。其最大的特<br />点是跨平台，跨编译器，多种Framework的集成，并且有一个WxWindows为基础的GU<br />I设计器。尤其是采用了纯C++来重写了整个Framework,摒弃了以前令人无奈的版本<br />。对于C++的开发来说，从编译器，到库，到功能集成都是非常理想的。可以预见，<br />Borland C++ Builder X 2.0很值得C++爱好者期待。唯一令人难堪之处是作为一个<br />C++的开发工具，其IDE是用Java写的，在配置不够理想的机器上请慎重考虑再安装<br />。</p>
		<p>　　3.5 Emacs + GCC</p>
		<p>　　前面讲的大部分是Windows环境下的集成开发环境。Linux上的开发者更倾向于<br />使用Emacs来编辑C++的文件，用Makefile来命令GCC做编译。虽然看上去比较松散，<br />但是这些东西综合起来还是一个开0发环境。如果你能够娴熟的使用这样的环境写程<br />序，你的水平应该足够指导我们来写这篇陋文了。</p>
		<p>　　3.6 Dev C++</p>
		<p>　　GCC是一个很好的编译器。在Windows上的C++编译器一直和标准有着一段距离的<br />时候，GCC就是一个让Windows下开发者流口水的编译器。Dev-C++就是能够让GCC跑<br />在Windows下的工具，作为集成开发环境，还提供了同专业IDE相媲美的语法高亮，<br />代码提示，调试等功能。由于使用Delphi开发，占用内存少，速度很快，比较适合<br />轻量级的学习和使用。</p>
		<p>　　3.7 Eclipse + CDT</p>
		<p>　　Eclipse可是近来大名鼎鼎的开发工具。最新一期的Jolt大奖就颁给了这个杰出<br />的神物。说其神奇是因为，它本身是用Java写的，但是拥有比一般Java写的程序快<br />得多的速度。而且因为其基于插件组装一切的原则，使得能够有CDT这样的插件把E<br />clipse变成一个C/C++的开发环境。如果你一直用Eclipse写Java的程序，不妨用它<br />体验一下C++开发的乐趣。</p>
		<p>------------------------------------------------------------------------<br />--------</p>
		<p>　　4，工具</p>
		<p>　　C++的辅助工具繁多，我们分门别类的为大家作介绍：</p>
		<p>　　4.1 文档类</p>
		<p>　　(1) Doxygen</p>
		<p>　　参考站点：<a href="http://www.doxygen.org/"><u><font color="#0000ff">http://www.doxygen.org</font></u></a></p>
		<p>　　Doxygen是一种适合C风格语言（如C++、C、IDL、Java甚至包括C#和PHP）的、<br />开放源码的、基于命令行的文档产生器。</p>
		<p>　　(2) C++2HTML</p>
		<p>　　参考站点：<a href="http://www.bedaux.net/cpp2html/"><u><font color="#0000ff">http://www.bedaux.net/cpp2html/</font></u></a></p>
		<p>　　把C++代码变成语法高亮的HTML</p>
		<p>　　(3) CodeColorizer</p>
		<p>　　参考站点：<a href="http://www.chami.com/colorizer/"><u><font color="#0000ff">http://www.chami.com/colorizer/</font></u></a></p>
		<p>　　它能把好几种语言的源代码着色为HTML</p>
		<p>　　(4) Doc-O-Matic</p>
		<p>　　参考站点：<a href="http://www.doc-o-matic.com/"><u><font color="#0000ff">http://www.doc-o-matic.com/</font></u></a></p>
		<p>　　Doc-O_Matic为你的C/C++，C++.net，Delphi/Pascal, VB.NET，C#和Java程序<br />或者组件产生准确的文档。Doc-O-Matic使用源代码中的符号和注释以及外部的文档<br />文件创建与流行的文档样式一致的文档。</p>
		<p>　　(5) DocVizor</p>
		<p>　　参考站点：<a href="http://www.ucancode.net/Products/DocBuilder/Features.htm"><u><font color="#0000ff">http://www.ucancode.net/Products/DocBuilder/Features.htm</font></u></a></p>
		<p>　　DocVizor满足了面向对象软件开发者的基本要求——它让我们能够看到C++工程<br />中的类层次结构。DocVizor快速地产生完整可供打印的类层次结构图，包括从第三<br />方库中来的那些类，除此之外DocVizor还能从类信息中产生HTML文件。</p>
		<p>　　(6) SourcePublisher C++</p>
		<p>　　参考站点：<a href="http://www.scitools.com/sourcepublisher_c.html"><u><font color="#0000ff">http://www.scitools.com/sourcepublisher_c.html</font></u></a></p>
		<p>　　给源代码产生提供快速直观的HTML报表，包括代码，类层次结构，调用和被调<br />用树，包含和被包含树。支持多种操作系统。</p>
		<p>　　(7) Understand</p>
		<p>　　参考站点：<a href="http://www.scitools.com/ucpp.html"><u><font color="#0000ff">http://www.scitools.com/ucpp.html</font></u></a></p>
		<p>　　分析任何规模的C或者C++工程，帮助我们更好的理解以及编写文档。</p>
		<p>　　4.2 代码类</p>
		<p>　　(1) CC-Rider</p>
		<p>　　参考站点：<a href="http://www.cc-rider.com/"><u><font color="#0000ff">http://www.cc-rider.com</font></u></a></p>
		<p>　　CC-Rider是用于C/C++程序强大的代码可视化工具，通过交互式浏览、编辑及自<br />动文件来促进程序的维持和发展。</p>
		<p>　　(2) CodeInspect</p>
		<p>　　参考站点：<a href="http://www.yokasoft.com/"><u><font color="#0000ff">http://www.yokasoft.com/</font></u></a></p>
		<p>　　一种新的C/C++代码分析工具。它检查我们的源代码找出非标准的，可能的，以<br />及普通的错误代码。</p>
		<p>　　(3) CodeWizard</p>
		<p>　　参考站点：<a href="http://www.parasoft.com/"><u><font color="#0000ff">http://www.parasoft.com</font></u></a></p>
		<p>　　先进的C/C++源代码分析工具，使用超过500个编码规范自动化地标明危险的，<br />但是编译器不能检查到的代码结构。</p>
		<p>　　(4) C++ Validation Test Suites</p>
		<p>　　参考站点：<a href="http://www.plumhall.com/suites.html"><u><font color="#0000ff">http://www.plumhall.com/suites.html</font></u></a></p>
		<p>　　一组用于测试编译器和库对于标准吻合程度的代码库。</p>
		<p>　　(5) CppRefactory</p>
		<p>　　参考站点：<a href="http://cpptool.sourceforge.net/"><u><font color="#0000ff">http://cpptool.sourceforge.net/</font></u></a></p>
		<p>　　CPPRefactory是一个使得开发者能够重构他们的C++代码的程序。目的是使得C<br />++代码的重构能够尽可能的有效率和简单。</p>
		<p>　　(6) Lzz</p>
		<p>　　参考站点：<a href="http://www.lazycplusplus.com/"><u><font color="#0000ff">http://www.lazycplusplus.com/</font></u></a></p>
		<p>　　Lzz是一个自动化许多C++编程中的体力活的工具。它能够节省我们许多事件并<br />且使得编码更加有乐趣。给出一系列的声明，Lzz会给我们创建头文件和源文件。</p>
		<p>　　(7) QA C++ Generation 2000</p>
		<p>　　参考站点：<a href="http://www.programmingresearch.com/solutions/qacpp.htm"><u><font color="#0000ff">http://www.programmingresearch.com/solutions/qacpp.htm</font></u></a></p>
		<p>　　它关注面向对象的C++源代码，对有关于设计，效率，可靠性，可维护性的部分<br />提出警告信息。</p>
		<p>　　(8) s-mail project - Java to C++DOL</p>
		<p>　　参考站点：<a href="http://sadlocha.strefa.pl/s-mail/ja2dol.html"><u><font color="#0000ff">http://sadlocha.strefa.pl/s-mail/ja2dol.html</font></u></a></p>
		<p>　　把Java源代码翻译为相应的C++源代码的命令行工具。</p>
		<p>　　(9) SNIP from Cleanscape Software International</p>
		<p>　　参考站点：<a href="http://www.cleanscape.net/stdprod/snip/index.html"><u><font color="#0000ff">http://www.cleanscape.net/stdprod/snip/index.html</font></u></a></p>
		<p>　　一个填平编码和设计之间沟壑的易于使用的C++开发工具，节省大量编辑和调试<br />的事件，它还使得开发者能够指定设计模式作为对象模型，自动从对象模型中产生<br />C++的类。</p>
		<p>　　(10) SourceStyler C++</p>
		<p>　　参考站点：<a href="http://www.ochresoftware.com/"><u><font color="#0000ff">http://www.ochresoftware.com/</font></u></a></p>
		<p>　　对C/C++源代码提供完整的格式化和排版控制的工具。提供多于75个的格式化选<br />项以及完全支持ANSI C++。</p>
		<p>　　4.3 编译类</p>
		<p>　　(1) Compilercache</p>
		<p>　　参考站点：<a href="http://www.erikyyy.de/compilercache/"><u><font color="#0000ff">http://www.erikyyy.de/compilercache/</font></u></a></p>
		<p>　　Compilercache是一个对你的C和C++编译器的封装脚本。每次我们进行编译，封<br />装脚本，把编译的结果放入缓存，一旦编译相同的东西，结果将从缓存中取出而不<br />是再次编译。</p>
		<p>　　(2) Ccache</p>
		<p>　　参考站点：<a href="http://ccache.samba.org/"><u><font color="#0000ff">http://ccache.samba.org/</font></u></a></p>
		<p>　　Ccache是一个编译器缓存。它使用起来就像C/C++编译器的缓存预处理器，编译<br />速度通常能提高普通编译过程的5~10倍。</p>
		<p>　　(3) Cmm (C++ with MultiMethods)</p>
		<p>　　参考站点：<a href="http://www.op59.net/cmm/cmm-0.28/users.html"><u><font color="#0000ff">http://www.op59.net/cmm/cmm-0.28/users.html</font></u></a></p>
		<p>　　这是一种C++语言的扩展。读入Cmm源代码输出C++的源代码，功能是对C++语言<br />添加了对multimethod的支持。</p>
		<p>　　(4) The Frost Project</p>
		<p>　　参考站点：<a href="http://frost.flewid.de/"><u><font color="#0000ff">http://frost.flewid.de/</font></u></a></p>
		<p>　　Forst使得你能够在C++程序中像原生的C++特性一样使用multimethod以及虚函<br />数参数。它是一个编译器的外壳。</p>
		<p>　　4.4 测试和调试类</p>
		<p>　　(1) CPPUnit</p>
		<p>　　CppUnit 是个基于 LGPL 的开源项目，最初版本移植自 JUnit，是一个非常优<br />秀的开源测试框架。CppUnit 和 JUnit 一样主要思想来源于极限编程。主要功能就<br />是对单元测试进行管理，并可进行自动化测试。</p>
		<p>　　(2) C++Test</p>
		<p>　　参考站点：<a href="http://www.parasoft.com/"><u><font color="#0000ff">http://www.parasoft.com/</font></u></a></p>
		<p>　　C++ Test是一个单元测试工具，它自动化了C和C++类，函数或者组件的测试。</p>
		<p>
				<br />　　(3) Cantata++</p>
		<p>　　参考站点：<a href="http://www.iplbath.com/products/tools/pt400.shtml"><u><font color="#0000ff">http://www.iplbath.com/products/tools/pt400.shtml</font></u></a></p>
		<p>　　设计的目的是为了满足在合理的经济开销下使用这个工具可以让开发工程师开<br />展单元测试和集成测试的需求.</p>
		<p>　　(4) Purify</p>
		<p>　　参考站点：<a href="http://www-900.ibm.com/cn/software/rational/products/purif"><u><font color="#0000ff">http://www-900.ibm.com/cn/software/rational/products/purif</font></u></a><br />yplus/index.shtml</p>
		<p>　　IBM Rational PurifyPlus是一套完整的运行时分析工具，旨在提高应用程序的<br />可靠性和性能。PurifyPlus将内存错误和泄漏检测、应用程序性能描述、代码覆盖<br />分析等功能组合在一个单一、完整的工具包中。</p>
		<p>　　(5) BoundsChecker</p>
		<p>　　BoundsChecker是一个C++运行时错误检测和调试工具。它通过在Visual Studi<br />o内自动化调试过程加速开发并且缩短上市的周期。BoundsChecker提供清楚，详细<br />的程序错误分析，许多是对C++独有的并且在static，stack和heap内存中检测和诊<br />断错误，以及发现内存和资源的泄漏。　　(6) Insure++</p>
		<p>　　参考站点：<a href="http://www.parasoft.com/"><u><font color="#0000ff">http://www.parasoft.com/</font></u></a></p>
		<p>　　一个自动化的运行时程序测试工具，检查难以察觉的错误,如内存覆盖，内存泄<br />漏，内存分配错误，变量初始化错误，变量定义冲突，指针错误，库错误，逻辑错<br />误和算法错误等。</p>
		<p>　　(7) GlowCode</p>
		<p>　　参考站点：<a href="http://www.glowcode.com/"><u><font color="#0000ff">http://www.glowcode.com/</font></u></a></p>
		<p>　　GlowCode包括内存泄漏检查，code profiler，函数调用跟踪等功能。给C++开<br />发者提供完整的错误诊断，和运行时性能分析工具包。</p>
		<p>　　(8) Stack Spy</p>
		<p>　　参考站点：<a href="http://www.imperioustech.com/"><u><font color="#0000ff">http://www.imperioustech.com/</font></u></a></p>
		<p>　　它能捕捉stack corruption, stack over run, stack overflow等有关栈的错<br />误。</p>
		<p>------------------------------------------------------------------------<br />--------</p>
		<p>　　5，库</p>
		<p>　　在C++中，库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了<br />设计库来扩充功能要好过设计更多的语法的言论。现实中，C++的库门类繁多，解决<br />的问题也是极其广泛，库从轻量级到重量级的都有。不少都是让人眼界大开，亦或<br />是望而生叹的思维杰作。由于库的数量非常庞大，而且限于笔者水平，其中很多并<br />不了解。所以文中所提的一些库都是比较著名的大型库。</p>
		<p>　　5.1 标准库</p>
		<p>　　标准库中提供了C++程序的基本设施。虽然C++标准库随着C++标准折腾了许多年<br />，直到标准的出台才正式定型，但是在标准库的实现上却很令人欣慰得看到多种实<br />现，并且已被实践证明为有工业级别强度的佳作。</p>
		<p>　　(1) Dinkumware C++ Library</p>
		<p>　　参考站点：<a href="http://www.dinkumware.com/"><u><font color="#0000ff">http://www.dinkumware.com/</font></u></a></p>
		<p>　　P.J. Plauger编写的高品质的标准库。P.J. Plauger博士是Dr. Dobb's程序设<br />计杰出奖的获得者。其编写的库长期被Microsoft采用，并且最近Borland也取得了<br />其OEM的license，在其C/C++的产品中采用Dinkumware的库。</p>
		<p>　　(2) RogueWave Standard C++ Library</p>
		<p>　　参考站点：<a href="http://www.roguewave.com/"><u><font color="#0000ff">http://www.roguewave.com/</font></u></a></p>
		<p>　　这个库在Borland C++ Builder的早期版本中曾经被采用，后来被其他的库给替<br />换了。笔者不推荐使用。</p>
		<p>　　(3) SGI STL</p>
		<p>　　参考站点：<a href="http://www.roguewave.com/"><u><font color="#0000ff">http://www.roguewave.com/</font></u></a></p>
		<p>　　SGI公司的C++标准模版库。</p>
		<p>　　(4) STLport</p>
		<p>　　参考站点：<a href="http://www.stlport.org/"><u><font color="#0000ff">http://www.stlport.org/</font></u></a></p>
		<p>　　SGI STL库的跨平台可移植版本。</p>
		<p>　　5.2 “准”标准库 - Boost</p>
		<p>　　参考站点：<a href="http://www.boost.org/"><u><font color="#0000ff">http://www.boost.org</font></u></a></p>
		<p>　　国内镜像：<a href="http://www.c-view.org/tech/lib/boost/index.htm"><u><font color="#0000ff">http://www.c-view.org/tech/lib/boost/index.htm</font></u></a></p>
		<p>　　Boost库是一个经过千锤百炼、可移植、提供源代码的C++库，作为标准库的后<br />备，是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起<br />，在C++社区中影响甚大，其成员已近2000人。 Boost库为我们带来了最新、最酷、<br />最实用的技术，是不折不扣的“准”标准库。</p>
		<p>　　Boost中比较有名气的有这么几个库：</p>
		<p>　　Regex</p>
		<p>　　正则表达式库</p>
		<p>　　Spirit</p>
		<p>　　LL parser framework，用C++代码直接表达EBNF</p>
		<p>　　Graph</p>
		<p>　　图组件和算法</p>
		<p>　　Lambda</p>
		<p>　　在调用的地方定义短小匿名的函数对象，很实用的functional功能</p>
		<p>　　concept check</p>
		<p>　　检查泛型编程中的concept</p>
		<p> </p>
		<p>　　Mpl</p>
		<p>　　用模板实现的元编程框架</p>
		<p> </p>
		<p>　　Thread</p>
		<p>　　可移植的C++多线程库</p>
		<p> </p>
		<p>　　Python</p>
		<p>　　把C++类和函数映射到Python之中</p>
		<p>　　Pool</p>
		<p>　　内存池管理</p>
		<p> </p>
		<p>　　smart_ptr</p>
		<p>　　5个智能指针，学习智能指针必读，一份不错的参考是来自CUJ的文章：</p>
		<p>　　Smart Pointers in Boost，哦，这篇文章可以查到，CUJ是提供在线浏览的。<br />中文版见笔者在《Dr. Dobb's Journal软件研发杂志》第7辑上的译文。</p>
		<p>　　Boost总体来说是实用价值很高，质量很高的库。并且由于其对跨平台的强调，<br />对标准C++的强调，是编写平台无关，现代C++的开发者必备的工具。但是Boost中也<br />有很多是实验性质的东西，在实际的开发中实用需要谨慎。并且很多Boost中的库功<br />能堪称对语言功能的扩展，其构造用尽精巧的手法，不要贸然的花费时间研读。Bo<br />ost另外一面，比如Graph这样的库则是具有工业强度，结构良好，非常值得研读的<br />精品代码，并且也可以放心的在产品代码中多多利用。</p>
		<p>　　5.3 GUI</p>
		<p>　　在众多C++的库中，GUI部分的库算是比较繁荣，也比较引人注目的。在实际开<br />发中，GUI库的选择也是非常重要的一件事情，下面我们综述一下可选择的GUI库，<br />各自的特点以及相关工具的支持。</p>
		<p>　　(1) MFC</p>
		<p>　　大名鼎鼎的微软基础类库（Microsoft Foundation Class）。大凡学过VC++的<br />人都应该知道这个库。虽然从技术角度讲，MFC是不大漂亮的，但是它构建于Windo<br />ws API 之上，能够使程序员的工作更容易,编程效率高，减少了大量在建立 Windo<br />ws 程序时必须编写的代码，同时它还提供了所有一般 C++ 编程的优点，例如继承<br />和封装。MFC 编写的程序在各个版本的Windows操作系统上是可移植的，例如，在<br />Windows 3.1下编写的代码可以很容易地移植到 Windows NT 或 Windows 95 上。但<br />是在最近发展以及官方支持上日渐势微。</p>
		<p>　　(2) QT</p>
		<p>　　参考网站：<a href="http://www.trolltech.com/"><u><font color="#0000ff">http://www.trolltech.com/</font></u></a></p>
		<p>　　Qt是Trolltech公司的一个多平台的C++图形用户界面应用程序框架。它提供给<br />应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的<br />很容易扩展，并且允许真正地组件编程。自从1996年早些时候，Qt进入商业领域，<br />它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环<br />境KDE 的基础，同时它还支持Windows、Macintosh、Unix/X11等多种平台。</p>
		<p>　　(3) WxWindows</p>
		<p>　　参考网站：<a href="http://www.wxwindows.org/"><u><font color="#0000ff">http://www.wxwindows.org/</font></u></a></p>
		<p>　　跨平台的GUI库。因为其类层次极像MFC，所以有文章介绍从MFC到WxWindows的<br />代码移植以实现跨平台的功能。通过多年的开发也是一个日趋完善的GUI库，支持同<br />样不弱于前面两个库。并且是完全开放源代码的。新近的C++ Builder X的GUI设计<br />器就是基于这个库的。</p>
		<p>　　(4) Fox</p>
		<p>　　参考网站：<a href="http://www.fox-toolkit.org/"><u><font color="#0000ff">http://www.fox-toolkit.org/</font></u></a></p>
		<p>　　开放源代码的GUI库。作者从自己亲身的开发经验中得出了一个理想的GUI库应<br />该是什么样子的感受出发，从而开始了对这个库的开发。有兴趣的可以尝试一下。</p>
		<p>
				<br />　　(5) WTL</p>
		<p>　　基于ATL的一个库。因为使用了大量ATL的轻量级手法，模板等技术，在代码尺<br />寸，以及速度优化方面做得非常到位。主要面向的使用群体是开发COM轻量级供网络<br />下载的可视化控件的开发者。</p>
		<p>　　(6) GTK</p>
		<p>　　参考网站：<a href="http://gtkmm.sourceforge.net/"><u><font color="#0000ff">http://gtkmm.sourceforge.net/</font></u></a></p>
		<p>　　GTK是一个大名鼎鼎的C的开源GUI库。在Linux世界中有Gnome这样的杀手应用。<br />而GTK就是这个库的C++封装版本。</p>
		<p>　　5.4 网络通信</p>
		<p>　　(1) ACE</p>
		<p>　　参考网站：<a href="http://www.cs.wustl.edu/~schmidt/ACE.html"><u><font color="#0000ff">http://www.cs.wustl.edu/~schmidt/ACE.html</font></u></a></p>
		<p>　　C++库的代表，超重量级的网络通信开发框架。ACE自适配通信环境（Adaptive<br /> Communication Environment）是可以自由使用、开放源代码的面向对象框架，在<br />其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++包<br />装外观（Wrapper Facade）和框架组件，可跨越多种平台完成通用的通信软件任务<br />，其中包括：事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通<br />信、共享内存管理、消息路由、分布式服务动态（重）配置、并发执行和同步，等<br />等。</p>
		<p>　　(2) StreamModule</p>
		<p>　　参考网站：<a href="http://www.omnifarious.org/StrMod/"><u><font color="#0000ff">http://www.omnifarious.org/StrMod/</font></u></a></p>
		<p>　　设计用于简化编写分布式程序的库。尝试着使得编写处理异步行为的程序更容<br />易，而不是用同步的外壳包起异步的本质。</p>
		<p>　　(3) SimpleSocket</p>
		<p>　　参考网站：<a href="http://home.hetnet.nl/~lcbokkers/simsock.htm"><u><font color="#0000ff">http://home.hetnet.nl/~lcbokkers/simsock.htm</font></u></a></p>
		<p>　　这个类库让编写基于socket的客户/服务器程序更加容易。</p>
		<p>　　(4) A Stream Socket API for C++</p>
		<p>　　参考网站：<a href="http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.h"><u><font color="#0000ff">http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.h</font></u></a><br />tml</p>
		<p>　　又一个对Socket的封装库。</p>
		<p>　　5.5 XML</p>
		<p>　　(1) Xerces</p>
		<p>　　参考网站：<a href="http://xml.apache.org/xerces-c/"><u><font color="#0000ff">http://xml.apache.org/xerces-c/</font></u></a></p>
		<p>　　Xerces-C++ 是一个非常健壮的XML解析器，它提供了验证，以及SAX和DOM API<br />。XML验证在文档类型定义(Document Type Definition，DTD)方面有很好的支持，<br />并且在2001年12月增加了支持W3C XML Schema 的基本完整的开放标准。</p>
		<p>　　(2) XMLBooster</p>
		<p>　　参考网站：<a href="http://www.xmlbooster.com/"><u><font color="#0000ff">http://www.xmlbooster.com/</font></u></a></p>
		<p>　　这个库通过产生特制的parser的办法极大的提高了XML解析的速度，并且能够产<br />生相应的GUI程序来修改这个parser。在DOM和SAX两大主流XML解析办法之外提供了<br />另外一个可行的解决方案。</p>
		<p>　　(3) Pull Parser</p>
		<p>　　参考网站：<a href="http://www.extreme.indiana.edu/xgws/xsoap/xpp/"><u><font color="#0000ff">http://www.extreme.indiana.edu/xgws/xsoap/xpp/</font></u></a></p>
		<p>　　这个库采用pull方法的parser。在每个SAX的parser底层都有一个pull的parse<br />r，这个xpp把这层暴露出来直接给大家使用。在要充分考虑速度的时候值得尝试。</p>
		<p>
				<br />　　(4) Xalan</p>
		<p>　　参考网站：<a href="http://xml.apache.org/xalan-c/"><u><font color="#0000ff">http://xml.apache.org/xalan-c/</font></u></a></p>
		<p>　　Xalan是一个用于把XML文档转换为HTML，纯文本或者其他XML类型文档的XSLT处<br />理器。</p>
		<p>　　(5) CMarkup</p>
		<p>　　参考网站：<a href="http://www.firstobject.com/xml.htm"><u><font color="#0000ff">http://www.firstobject.com/xml.htm</font></u></a></p>
		<p>　　这是一种使用EDOM的XML解析器。在很多思路上面非常灵活实用。值得大家在D<br />OM和SAX之外寻求一点灵感。</p>
		<p>　　(6) libxml++</p>
		<p>　　<a href="http://libxmlplusplus.sourceforge.net/"><u><font color="#0000ff">http://libxmlplusplus.sourceforge.net/</font></u></a></p>
		<p>　　libxml++是对著名的libxml XML解析器的C++封装版本</p>
		<p>　　5.6 科学计算</p>
		<p>　　(1) Blitz++</p>
		<p>　　参考网站：<a href="http://www.oonumerics.org/blitz/"><u><font color="#0000ff">http://www.oonumerics.org/blitz/</font></u></a></p>
		<p>　　Blitz++ 是一个高效率的数值计算函数库，它的设计目的是希望建立一套既具<br />像C++ 一样方便，同时又比Fortran速度更快的数值计算环境。通常，用C++所写出<br />的数值程序，比 Fortran慢20%左右，因此Blitz++正是要改掉这个缺点。方法是利<br />用C++的template技术，程序执行甚至可以比Fortran更快。Blitz++目前仍在发展中<br />，对于常见的SVD，FFTs，QMRES等常见的线性代数方法并不提供，不过使用者可以<br />很容易地利用Blitz++所提供的函数来构建。</p>
		<p>　　(2) POOMA</p>
		<p>　　参考网站：<a href="http://www.codesourcery.com/pooma/pooma"><u><font color="#0000ff">http://www.codesourcery.com/pooma/pooma</font></u></a></p>
		<p>　　POOMA是一个免费的高性能的C++库，用于处理并行式科学计算。POOMA的面向对<br />象设计方便了快速的程序开发，对并行机器进行了优化以达到最高的效率，方便在<br />工业和研究环境中使用。</p>
		<p>　　(3) MTL</p>
		<p>　　参考网站：<a href="http://www.osl.iu.edu/research/mtl/"><u><font color="#0000ff">http://www.osl.iu.edu/research/mtl/</font></u></a></p>
		<p>　　Matrix Template Library(MTL)是一个高性能的泛型组件库，提供了各种格式<br />矩阵的大量线性代数方面的功能。在某些应用使用高性能编译器的情况下，比如In<br />tel的编译器，从产生的汇编代码可以看出其与手写几乎没有两样的效能。</p>
		<p>　　(4) CGAL</p>
		<p>　　参考网站：<a href="http://www.cgal.org/"><u><font color="#0000ff">www.cgal.org</font></u></a></p>
		<p>　　Computational Geometry Algorithms Library的目的是把在计算几何方面的大<br />部分重要的解决方案和方法以C++库的形式提供给工业和学术界的用户。</p>
		<p>　　5.7 游戏开发</p>
		<p>　　(1) Audio/Video 3D C++ Programming Library</p>
		<p>　　参考网站：<a href="http://www.galacticasoftware.com/products/av/"><u><font color="#0000ff">http://www.galacticasoftware.com/products/av/</font></u></a></p>
		<p>　　***3D是一个跨平台，高性能的C++库。主要的特性是提供3D图形，声效支持（S<br />B,以及S3M），控制接口（键盘，鼠标和遥感），XMS。</p>
		<p>　　(2) KlayGE</p>
		<p>　　参考网站：<a href="http://home.g365.net/enginedev/"><u><font color="#0000ff">http://home.g365.net/enginedev/</font></u></a></p>
		<p>　　国内游戏开发高手自己用C++开发的游戏引擎。KlayGE是一个开放源代码、跨平<br />台的游戏引擎，并使用Python作脚本语言。KlayGE在LGPL协议下发行。感谢龚敏敏<br />先生为中国游戏开发事业所做出的贡献。</p>
		<p>　　(3) OGRE</p>
		<p>　　参考网站：<a href="http://www.ogre3d.org/"><u><font color="#0000ff">http://www.ogre3d.org</font></u></a></p>
		<p>　　OGRE（面向对象的图形渲染引擎）是用C++开发的，使用灵活的面向对象3D引擎<br />。它的目的是让开发者能更方便和直接地开发基于3D硬件设备的应用程序或游戏。<br />引擎中的类库对更底层的系统库（如：Direct3D和OpenGL）的全部使用细节进行了<br />抽象，并提供了基于现实世界对象的接口和其它类。</p>
		<p>　　5.8 线程</p>
		<p>　　(1) C++ Threads</p>
		<p>　　参考网站：<a href="http://threads.sourceforge.net/"><u><font color="#0000ff">http://threads.sourceforge.net/</font></u></a></p>
		<p>　　这个库的目标是给程序员提供易于使用的类，这些类被继承以提供在Linux环境<br />中很难看到的大量的线程方面的功能。</p>
		<p>　　(2) ZThreads</p>
		<p>　　参考网站：<a href="http://zthread.sourceforge.net/"><u><font color="#0000ff">http://zthread.sourceforge.net/</font></u></a></p>
		<p>　　一个先进的面向对象，跨平台的C++线程和同步库。</p>
		<p>　　5.9 序列化</p>
		<p>　　(1) s11n</p>
		<p>　　参考网站：<a href="http://s11n.net/"><u><font color="#0000ff">http://s11n.net/</font></u></a></p>
		<p>　　一个基于STL的C++库，用于序列化POD，STL容器以及用户定义的类型。</p>
		<p>　　(2) Simple XML Persistence Library</p>
		<p>　　参考网站：<a href="http://sxp.sourceforge.net/"><u><font color="#0000ff">http://sxp.sourceforge.net/</font></u></a></p>
		<p>　　这是一个把对象序列化为XML的轻量级的C++库。</p>
		<p>　　5.10 字符串</p>
		<p>　　(1) C++ Str Library</p>
		<p>　　参考网站：<a href="http://www.utilitycode.com/str/"><u><font color="#0000ff">http://www.utilitycode.com/str/</font></u></a></p>
		<p>　　操作字符串和字符的库，支持Windows和支持gcc的多种平台。提供高度优化的<br />代码，并且支持多线程环境和Unicode，同时还有正则表达式的支持。</p>
		<p>　　(2) Common Text Transformation Library</p>
		<p>　　参考网站：<a href="http://cttl.sourceforge.net/"><u><font color="#0000ff">http://cttl.sourceforge.net/</font></u></a></p>
		<p>　　这是一个解析和修改STL字符串的库。CTTL substring类可以用来比较，插入，<br />替换以及用EBNF的语法进行解析。</p>
		<p>　　(3) GRETA</p>
		<p>　　参考网站：<a href="http://research.microsoft.com/projects/greta/"><u><font color="#0000ff">http://research.microsoft.com/projects/greta/</font></u></a></p>
		<p>　　这是由微软研究院的研究人员开发的处理正则表达式的库。在小型匹配的情况<br />下有非常优秀的表现。</p>
		<p>　　5.11 综合</p>
		<p>　　(1) P::Classes</p>
		<p>　　参考网站：<a href="http://pclasses.com/"><u><font color="#0000ff">http://pclasses.com/</font></u></a></p>
		<p>　　一个高度可移植的C++应用程序框架。当前关注类型和线程安全的signal/slot<br />机制，i/o系统包括基于插件的网络协议透明的i/o架构，基于插件的应用程序消息<br />日志框架，访问sql数据库的类等等。</p>
		<p>　　(2) ACDK - Artefaktur Component Development Kit</p>
		<p>　　参考网站：<a href="http://acdk.sourceforge.net/"><u><font color="#0000ff">http://acdk.sourceforge.net/</font></u></a></p>
		<p>　　这是一个平台无关的C++组件框架，类似于Java或者.NET中的框架（反射机制，<br />线程，Unicode，废料收集，I/O，网络，实用工具，XML，等等），以及对Java, P<br />erl, Python, TCL, Lisp, COM 和 CORBA的集成。</p>
		<p>　　(3) dlib C++ library</p>
		<p>　　参考网站：<a href="http://www.cis.ohio-state.edu/~kingd/dlib/"><u><font color="#0000ff">http://www.cis.ohio-state.edu/~kingd/dlib/</font></u></a></p>
		<p>　　各种各样的类的一个综合。大整数，Socket，线程，GUI，容器类,以及浏览目<br />录的API等等。</p>
		<p>　　(4) Chilkat C++ Libraries</p>
		<p>　　参考网站：<a href="http://www.chilkatsoft.com/cpp_libraries.asp"><u><font color="#0000ff">http://www.chilkatsoft.com/cpp_libraries.asp</font></u></a></p>
		<p>　　这是提供zip，e-mail，编码，S/MIME，XML等方面的库。</p>
		<p>　　(5) C++ Portable Types Library (PTypes)</p>
		<p>　　参考网站：<a href="http://www.melikyan.com/ptypes/"><u><font color="#0000ff">http://www.melikyan.com/ptypes/</font></u></a></p>
		<p>　　这是STL的比较简单的替代品，以及可移植的多线程和网络库。</p>
		<p>　　(6) LFC</p>
		<p>　　参考网站：<a href="http://lfc.sourceforge.net/"><u><font color="#0000ff">http://lfc.sourceforge.net/</font></u></a></p>
		<p>　　哦，这又是一个尝试提供一切的C++库</p>
		<p>　　5.12 其他库</p>
		<p>　　(1) Loki</p>
		<p>　　参考网站：<a href="http://www.moderncppdesign.com/"><u><font color="#0000ff">http://www.moderncppdesign.com/</font></u></a></p>
		<p>　　哦，你可能抱怨我早该和Boost一起介绍它，一个实验性质的库。作者在loki中<br />把C++模板的功能发挥到了极致。并且尝试把类似设计模式这样思想层面的东西通过<br />库来提供。同时还提供了智能指针这样比较实用的功能。</p>
		<p>　　(2) ATL</p>
		<p>　　ATL(Active Template Library)</p>
		<p>　　是一组小巧、高效、灵活的类，这些类为创建可互操作的COM组件提供了基本的<br />设施。</p>
		<p>　　(3) FC++: The Functional C++ Library</p>
		<p>　　这个库提供了一些函数式语言中才有的要素。属于用库来扩充语言的一个代表<br />作。如果想要在OOP之外寻找另一分的乐趣，可以去看看函数式程序设计的世界。大<br />师Peter Norvig在 “Teach Yourself Programming in Ten Years”一文中就将函<br />数式语言列为至少应当学习的6类编程语言之一。</p>
		<p>　　(4) FACT!</p>
		<p>　　参考网站：<a href="http://www.kfa-juelich.de/zam/FACT/start/index.html"><u><font color="#0000ff">http://www.kfa-juelich.de/zam/FACT/start/index.html</font></u></a></p>
		<p>　　另外一个实现函数式语言特性的库</p>
		<p>　　(5) Crypto++</p>
		<p>　　提供处理密码，消息验证，单向hash，公匙加密系统等功能的免费库。</p>
		<p>　　还有很多非常激动人心或者是极其实用的C++库，限于我们的水平以及文章的篇<br />幅不能包括进来。在对于这些已经包含近来的库的介绍中，由于并不是每一个我们<br />都使用过，所以难免有偏颇之处，请读者见谅。</p>
		<p>------------------------------------------------------------------------<br />--------</p>
		<p>　　6，书籍</p>
		<p>　　以前熊节先生曾撰文评论相对于Java程序设计语言，C++的好书多如牛毛。荣耀<br />先生在《程序员》杂志上撰文《C++程序设计之四书五经》也将本领域内几乎所有的<br />经典书籍作了全面的介绍,任何关于书的评论此时看来便是很多余的了。个人浅见，<br />除非你打算以C++作为唯一兴趣或者生存之本，一般读者确实没有足够的时间和必要<br />将20余本书籍全部阅读。更有参考价值的是荣耀先生的另一篇文章：《至少应该阅<br />读的九本C++著作》，可以从下面的地址浏览到此文：</p>
		<p>　　<a href="http://www.royaloo.com/articles/articles_2003/9CppBooks.htm"><u><font color="#0000ff">http://www.royaloo.com/articles/articles_2003/9CppBooks.htm</font></u></a></p>
		<p>　　下面几本书对于走在C++初学之路上的读者是我们最愿意推荐给大家的：</p>
		<p>　　(1) 《C++ Primer》</p>
		<p>　　哦，也许你会抱怨我们为什么不先介绍TCPL,但对于走在学习之路上的入门者，<br />本书内容更为全面，更为详细易懂，我们称它为“C++的超级宝典”并不过分。配有<br />一本不错的习题解答《C++ Primer Answer Book》可以辅助你的学习之路。</p>
		<p>　　(2) 《Essential C++》</p>
		<p>　　如果说《C++ Primer》是C++领域的超级宝典，那么此书作为掌握C++的大局观<br />当之无愧。正如《.NET大局观》一书能够让读者全揽.NET，本书讲述了C++中最核心<br />的全部主题。书虽不厚，内容精炼，不失为《C++ Primer》读者茶余饭后的主题回<br />顾之作。</p>
		<p>　　(3) 《The C++ Programming Language》</p>
		<p>　　Bjarne为你带来的C++教程，真正能够告诉你怎么用才叫真正的C++的唯一一本<br />书。虽然如同“某某程序设计语言”这样的书籍会给大家一个内容全揽，入门到精<br />通的感觉，但本书确实不太适合初学者阅读。如果你自认为是一名很有经验的C++程<br />序员，那至少也要反复咀嚼Bjarne先生所强调的若干内容。</p>
		<p>　　(4) 《Effective C++》，《More Effective C++》</p>
		<p>　　是的，正如一些C++爱好者经常以读过与没有读过上述两本作品来区分你是否是<br />C++高手。我们也极力推崇这两本著作。在各种介绍C++专家经验的书籍里面，这两<br />本是最贴近语言本质，看后最能够有脱胎换骨感觉的书，读此书你需每日三省汝身<br />。</p>
		<p>　　技术书籍仁者见仁，过多的评论反无太多意义，由读者喜好选择最适合自己的<br />书方为上策。</p>
		<p>------------------------------------------------------------------------<br />--------</p>
		<p>　　7，资源网站</p>
		<p>　　正如我们可以通过计算机历史上的重要人物了解计算机史的发展，C++相关人物<br />的网站也可以使我们得到最有价值的参考与借鉴，下面的人物我们认为没有介绍的<br />必要，只因下面的人物在C++领域的地位众所周知，我们只将相关的资源进行罗列以<br />供读者学习，他们有的工作于贝尔实验室，有的工作于知名编译器厂商，有的在不<br />断推进语言的标准化，有的为读者撰写了多部千古奇作……<br />　　(1) Bjarne Stroustrup<br />　　<a href="http://www.research.att.com/~bs/"><u><font color="#0000ff">http://www.research.att.com/~bs/</font></u></a></p>
		<p>　　(2) Stanley B. Lippman<br />　　<a href="http://blogs.msdn.com/slippman/"><u><font color="#0000ff">http://blogs.msdn.com/slippman/</font></u></a><br />　　中文版 <a href="http://www.zengyihome.net/slippman/index.htm"><u><font color="#0000ff">http://www.zengyihome.net/slippman/index.htm</font></u></a></p>
		<p>　　(3) Scott Meyers<br />　　<a href="http://www.aristeia.com/"><u><font color="#0000ff">http://www.aristeia.com/</font></u></a></p>
		<p>　　(4) David Musser<br />　　<a href="http://www.cs.rpi.edu/~musser/"><u><font color="#0000ff">http://www.cs.rpi.edu/~musser/</font></u></a></p>
		<p>　　(5) Bruce Eckel<br />　　<a href="http://www.bruceeckel.com/"><u><font color="#0000ff">http://www.bruceeckel.com</font></u></a></p>
		<p>　　(6) Nicolai M. Josuttis<br />　　<a href="http://www.josuttis.com/"><u><font color="#0000ff">http://www.josuttis.com/</font></u></a></p>
		<p>　　(7) Herb Sutter<br />　　<a href="http://www.gotw.ca/"><u><font color="#0000ff">http://www.gotw.ca/</font></u></a></p>
		<p>　　(8) Andrei Alexandrescu<br />　　<a href="http://www.coderncppdesign.com/"><u><font color="#0000ff">http://www.coderncppdesign.com/</font></u></a></p>
		<p>　　(9) 侯捷先生<br />　　<a href="http://www.jjhou.com/"><u><font color="#0000ff">http://www.jjhou.com</font></u></a></p>
		<p>　　(10) 孟岩先生<br />　　先生繁忙于工作，痴迷于技术，暂无个人主页，关于先生的作品可以通过CSDN<br />的专栏和侯先生的主页访问到。</p>
		<p>　　(11) 荣耀先生<br />　　<a href="http://www.royaloo.com/"><u><font color="#0000ff">http://www.royaloo.com/</font></u></a></p>
		<p>　　(12) 潘爱民先生<br />　　<a href="http://www.icst.pku.edu.cn/panaimin/pam_homepage.htm"><u><font color="#0000ff">http://www.icst.pku.edu.cn/panaimin/pam_homepage.htm</font></u></a></p>
		<p>　　除了上述大师的主页外，以下的综合类C++学习参考站点是我们非常愿意向大家<br />推荐的：</p>
		<p>　　(1) CodeProject<br />　　<a href="http://www.codeproject.com/"><u><font color="#0000ff">http://www.codeproject.com</font></u></a></p>
		<p>　　(2) CodeGuru<br />　　<a href="http://www.codeguru.com/"><u><font color="#0000ff">http://www.codeguru.com</font></u></a></p>
		<p>　　(3) Dr. Dobb's Journal<br />　　<a href="http://www.ddj.com/"><u><font color="#0000ff">http://www.ddj.com</font></u></a></p>
		<p>　　(4) C/C++ Users Journal<br />　　<a href="http://www.cuj.com/"><u><font color="#0000ff">http://www.cuj.com</font></u></a></p>
		<p>　　(5) C维视点<br />　　<a href="http://www.c-view.org/"><u><font color="#0000ff">http://www.c-view.org</font></u></a></p>
		<p>　　(6) allaboutprogram<br />　　<a href="http://www.allaboutprogram.com/"><u><font color="#0000ff">http://www.allaboutprogram.com</font></u></a><br />　　其他资料</p>
		<p>　　(1) ISO IEC JTC1/SC22/WG21 - C++：标准C++的权威参考<br />　　<a href="http://anubis.dkuug.dk/jtc1/sc22/wg21/"><u><font color="#0000ff">http://anubis.dkuug.dk/jtc1/sc22/wg21/</font></u></a></p>
		<p>　　(2) C++ FAQ LITE — Frequently Asked Questions: 最为全面的C++FAQ<br />　　<a href="http://www.sunistudio.com/cppfaq/index.html"><u><font color="#0000ff">http://www.sunistudio.com/cppfaq/index.html</font></u></a><br />　　C/C++ 新闻组：<br />　　你不妨尝试从这里提问和回答问题，很多不错的Q&amp;A资源......</p>
		<p>　　(1) .alt.comp.lang.learn.c-c++<br />　　这个简单些，如果你和我一样是个菜鸟</p>
		<p>　　(2) .comp.lang.c++.moderated<br />    嗯，这个显然水平高一些</p>
		<p>　　(3) .comp.std.c++<br />　　如果你需要讨论标准C++相关话题的话</p>
		<p>------------------------------------------------------------------------<br />--------</p>
		<p>　　8，不得不写的结束语</p>
		<p>　　结束的时候也是总结现状，展望未来的时候。虽然C++从脱胎于C开始，一路艰<br />难坎坷的走过来，但是无论如何C++已经取得了工业基础的地位。文章列举的大量相关<br />资源就是最好的证明，而业界的大量用C++写成的产品代码以及大量的C++职业工程<br />师则是最直接的证明。同时，我们可以看到各个高校的计算机专业都开设有C++这门<br />课程，网络上对于C++的学习讨论也从来都没有停过。但是，在Java和.NET两大企业<br />开发平台的围攻下，给人的感觉是C++越来越“不行”了。</p>
		<p>　　C++在面向企业的软件开发中，在开发便捷性等方面的确要比Java和C#差很多，<br />其中一个问题是C++语言本身比较复杂，学习曲线比较陡峭，另外一个问题是C++标<br />准化的时间太长，丧失了很多的壮大机会，耗费了很多精力在厂商的之间的斗争上<br />，而C++的标准库离一个完善的程序开发框架还缺少太多太多的内容，各个第三方的<br />类库和框架又在一致性和完整性上没法和随平台提供的框架相提并论。难道C++真的<br />要退出历史舞台了？</p>
		<p>　　从C++目前的活跃程度，以及应用现状来说是完全能够肯定C++仍然是软件工业<br />的基础，也不会退出历史舞台的。另外从Boost，Loki这些库中我们也能够看到C++<br />的发展非常活跃，对于新技术新思维非常激进，C++仍然广泛受到关注。从ACE在高<br />性能通信领域的应用，以及MTL这样的库在数值计算领域的出色表现，我们可以看到<br />C++在高性能应用场合下的不可替代的作用，而嵌入式系统这样的内存受限开发平台<br />，比如Symbian OS上，C++已经发挥着并且将发挥更大的作用。可以预见的是以后的<br />软件无论上层的应用怎么变，它的底层核心都会是由C/C++这样的系统级软件编写的<br />，比如Java虚拟机，.NET Framwork。因为只有这样的系统级软件才能完全彻底的发<br />挥机器的功能。</p>
		<p>　　需要看到的是两个趋势，一个趋势是C++变得更加复杂，更加学院派，通过模板<br />等有潜力的语法因素构造越来越精巧的库成为了现代C++的热点，虽然在利用库实现<br />新的编程范式，乃至设计模式等方面很有开创意义，也确实产生了一些能够便捷开<br />发的工具，但是更多的是把C++变得更加强大，更加复杂，也更加难懂，似乎也更加<br />学院派，不得不说它正在向边缘化道路发展。另一个趋势是C++在主流的企业应用开<br />发中已经逐渐退出了，ERP这样的企业软件开发中基本上不会考虑C++，除非需要考<br />虑性能或者和遗留代码的集成这些因素。C++退守到系统级别语言，成为软件工业的<br />基础是大势所趋。然而反思一下，真的是退守么？自从STL出现，无数的人风起云涌<br />的开始支持C++,他们狂呼“我看到深夜消失了，目标软件工程的出现。我看到了可<br />维护的代码。”是的，STL在可维护性下做得如此出色。但是又怎样呢？STL为C++铺<br />平了现代软件工程的道路，而在上层应用程序软件开发领域这块场地早不单独属于<br />C++,很多程序设计语言都做得很出色，疯狂的支持者会毫不犹豫地说我们应当支持<br />C++,因为它是世界上最棒的语言。而坦率地说，你的腰杆真的那么硬么？也许只是<br />在逃避一些事实。C++是优秀的，这不可否认，STL的出现让C++一度走上了最辉煌的<br />时刻，然而现在看来……我的一位恩师曾言：真正能够将STL应用得淋漓尽致的人很<br />保守地说国内也不超过200人，或许不加入STL能够使C++向着它应当发展的方向发展<br />的更好，而现在看来，C++也应当回首到真正属于他的那一片圣地上……</p>
		<br />
<img src ="http://www.cppblog.com/singohgod/aggbug/17770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/singohgod/" target="_blank">大宝天天见</a> 2007-01-19 09:20 <a href="http://www.cppblog.com/singohgod/archive/2007/01/19/17770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>