﻿<?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++博客-Prayer-随笔分类-面向对象</title><link>http://www.cppblog.com/prayer/category/10273.html</link><description>在一般中寻求卓越</description><language>zh-cn</language><lastBuildDate>Thu, 24 Dec 2009 18:51:24 GMT</lastBuildDate><pubDate>Thu, 24 Dec 2009 18:51:24 GMT</pubDate><ttl>60</ttl><item><title>文档生成工具doxygen+图像生成工具GraphViz</title><link>http://www.cppblog.com/prayer/archive/2009/12/24/103989.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 24 Dec 2009 13:57:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/12/24/103989.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/103989.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/12/24/103989.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/103989.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/103989.html</trackback:ping><description><![CDATA[<div id="article_body">
<p>虽然jdk自带的javadoc也很好用，不过使用doxygen+GraphViz
的组合可以生成许多强大的图（类图、协作图、文件包含/被包含图、函数调用/被调用图、类继承体系图等），另外，doxygen支持直接生成chm文档，
支持LaTeX公式，如果你有一个支持php的服务器，生成的html还可以加入一个搜索框。<br>
<br>
doxygen是开源的C语言软体，可以在它的官方网站上下载到软体和源码：<br>
<a  href="http://www.stack.nl/%7Edimitri/doxygen" target="_blank">http://www.stack.nl/~dimitri/doxygen</a><br>
<br>
使用它的doxyWizard很是方便^^ 具体用法我写在了附件的文档中（不过注释是C++版，doxygen是可以使用默认的javadoc注释的，你只需要将设定改成output for Java）。<br>
它还可以自定义css/head/foot，由于用于内部交流于是就没有设定，可以在Export的HTML选项卡中修改，传说中MySQL的文档就是doxygen生成的。。。<br>
<br>
doxygen内置了生成类图的功能，只需要设定Diagram的项。<br>
要生成更多图的请下载GraphViz。<br>
它是一款强大的可以生成很多种图像的软件，同样也是开源的：<a  href="http://www.graphviz.org/" target="_blank">http://www.graphviz.org/</a>。<br>
它还提供了Java支持，有一个纯java编写的子项目Grappa。按照上面的说明，似乎java程序可以通过Grappa库来实现GraphViz的功能（Grappa调用GraphViz的接口）。<br>
<br>
大家有兴趣可以尝试一下 挺好玩的说^^<br>
附件是一个Doxygen使用简介.docx，里面包含了我这几天玩得doxyWizard的简单使用说明。<br>
以及 一个使用doxyWizard生成的chm文件，只用了类图、文件包含图和类继承体系图。</p>
<p>【<a  href="http://yoyo.is-programmer.com/user_files/yoyo/File/Doxygen%E4%BD%BF%E7%94%A8%E7%AE%80%E4%BB%8B.docx">Doxygen使用简介.docx</a>】&nbsp;【<a  href="http://yoyo.is-programmer.com/user_files/yoyo/File/DBOp.chm">DBOp.chm</a>】</p>
<p>生成图演示：</p>
<ul>
    <li>类图<br>
    <img  src="http://yoyo.is-programmer.com/user_files/yoyo/Image/GraphViz/class.JPG" alt=""></li>
    <li>协作图<br>
    <img  src="http://yoyo.is-programmer.com/user_files/yoyo/Image/GraphViz/collaboration.JPG" alt="" height="521" width="389"></li>
    <li>文件包含图<br>
    <img  src="http://yoyo.is-programmer.com/user_files/yoyo/Image/GraphViz/include.JPG" style="cursor: pointer;" title="在新窗口打开图片" alt="" height="247" width="400"></li>
    <li>函数调用图<br>
    <img  src="http://yoyo.is-programmer.com/user_files/yoyo/Image/GraphViz/call.JPG" style="cursor: pointer;" title="在新窗口打开图片" alt="" height="36" width="400"></li>
    <li>类继承体系图<br>
    <img  src="http://yoyo.is-programmer.com/user_files/yoyo/Image/GraphViz/cegui_class_hierarchy.JPG" style="cursor: pointer;" title="在新窗口打开图片" alt="" height="193" width="400"></li>
</ul>
</div><img src ="http://www.cppblog.com/prayer/aggbug/103989.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-12-24 21:57 <a href="http://www.cppblog.com/prayer/archive/2009/12/24/103989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>doxygen使用手记  下载路径 ftp://ftp.stack.nl/pub/users/dimitri/</title><link>http://www.cppblog.com/prayer/archive/2009/12/24/103988.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 24 Dec 2009 13:42:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/12/24/103988.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/103988.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/12/24/103988.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/103988.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/103988.html</trackback:ping><description><![CDATA[ftp://ftp.stack.nl/pub/users/dimitri/<br>很多，自己选吧<br><br><img src ="http://www.cppblog.com/prayer/aggbug/103988.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-12-24 21:42 <a href="http://www.cppblog.com/prayer/archive/2009/12/24/103988.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用Doxygen</title><link>http://www.cppblog.com/prayer/archive/2009/12/24/103959.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 24 Dec 2009 08:39:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/12/24/103959.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/103959.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/12/24/103959.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/103959.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/103959.html</trackback:ping><description><![CDATA[<div class=cnt id=blog_text>
<div class=postTitle><a href="http://blog.donews.com/sunnyair/archive/2007/05/15/1165242.aspx"><u><font color=#0000ff>如何使用Doxygen</font></u></a></div>
<div class=postText>
<h4>Doxygen是什么？</h4>
<p>&nbsp;&nbsp;&nbsp; Doxygen是一种开源跨平台的，以类似JavaDoc风格描述的文档系统，完全支持C、C++、Java、Objective-C和IDL语言，部分支持PHP、C#。注释的语法与Qt-Doc、KDoc和JavaDoc兼容。<a name=baidusnap2></a><strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">Doxgen</strong>可以从一套归档源文件开始，生成HTML格式的在线类浏览器，或离线的LATEX、RTF参考手册。对于未归档的源文件，也可以通过配置Doxygen来提取代码结构。或者借助自动生成的包含依赖图（include dependency graphs）、继承图（<a name=baidusnap0></a><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">inheritance</strong> <a name=baidusnap1></a><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">diagram</strong>）以及协作图（collaboration <strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">diagram</strong>）来可视化文档之间的关系。Doxygen生成的帮助文档的格式可以是CHM、RTF、PostScript、PDF、HTML和Unix man page等。</p>
<p>&nbsp;&nbsp; Doxygen在Linux上开发，但也可以在其它的Unix平台下运行。而且，Windows 9x/NT平台下也有对应的可执行版本。</p>
<h4>安装Doxygen</h4>
<p>&nbsp;&nbsp;&nbsp; 首先，去Doxygen网站上找到最新版本的Doxygen。有二进制或源码两种版本，如果不想重头编译，下载二进制版本安装即可。在Linux下，源码编译需要perl和Gnu工具flex、bison、make的支持。在Windows下，二进制版本勿需安装，而源码编译所需支持工具较多。我们仅讲述Linux下的Doxygen的源码编译以及二进制版本安装过程。</p>
<p><strong>编译源码</strong></p>
<table class=grey4 cellSpacing=0 cellPadding=10 border=0>
    <tbody>
        <tr>
            <td>
            <pre>gunzip doxygen-$VERSION.src.tar.gztar xf doxygen-$VERSION.src.tarsh ./configure，或者configure --platform platform-type（略去直接使用configure需要平台检测的过程，平台类型在PLATFORMS文件中列出），configure --with-doxywizard（GUI前端选项）make，或者make docs（创建HTML格式的手册），make pdf（创建PDF格式的手册）</pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><strong>安装二进制版本</strong></p>
<table class=grey4 cellSpacing=0 cellPadding=10 border=0>
    <tbody>
        <tr>
            <td>
            <pre>./configuremake install</pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>&nbsp;&nbsp;&nbsp; 二进制文件安装目录是&lt;prefix&gt;/bin，其中&lt;prefix&gt;缺省为/usr，可以通过configure的参数--prefix修改其值。使用make install_docs可以把文档和例子安装在目录&lt;docdir&gt;/doxygen，其中&lt;docdir&gt;缺省为&lt;prefix&gt;/share/doc/packages，可以通过configure的参数--docdir修改其值。doxygen是bin目录下的一个命令行程序，它是Doxygen的核心工具，完成文档的转换和生成工作。</p>
<h4>Doxygen的处理流程</h4>
<p>图1是Doxygen网站上给出的Doxygen处理工具以及它们之间的信息流。</p>
<p>&nbsp;&nbsp;&nbsp; 从图中可以看出，Doxygen可执行程序位于正中，所有的流程都围绕着它进行。左侧图标表示Doxygen的输入可以是源文件，或者是定制的头文件、图像、注解等。Doxygen图标上部是配置文件，由Doxywizard处理，下部是Tag文件，由Doxytag处理。后面是Doxygen输出文件的类型，依次是XML、Latex、Man pages、RTF和HTML，可处理类型图标之后是进行进一步转换所需的工具。</p>
<p align=center><img height=579 src="http://java.chinaitlab.com/UploadFiles_8734/200607/20060718142808757.jpg" width=656 border=0></p>
<p align=center>图1&nbsp;&nbsp; Doxygen网站上给出的Doxygen信息流图</p>
<h4>配置文件</h4>
<p>&nbsp;&nbsp;&nbsp; 每一个Doxygen工程都有一个后缀为.cfg的配置文件，用来保存所有的设置。配置文件的格式与autoexec.bat、config.sys等文件相似，是由名称/值对组成的ASCII码，会由doxygen命令来解析。为了简化创建和修改配置文件，Doxygen可以在命令行方式下加上参数-g自动创建模板文件。</p>
<p>doxygen -g &lt;config-file&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 忽略&lt;config-file&gt;将会生成一个名为Doxyfile的缺省文件，如果&lt;config-file&gt;已经存在，会被Doxygen改名为&lt;config-file&gt;.bak。</p>
<p>&nbsp;&nbsp; 实际上，我们根本就不需要用一般的编辑器来编辑配置文件，Doxygen提供了一个辅助工具Doxywizard。Doxywizard是Doxygen的GUI前台，用户可以能过它来读写配置文件，省却了手工配置的麻烦。基本上，在Doxywizard中可以完成Doxygen的绝大多数工作，而且Doxygen也可以在由Doxywizard启动，这样就使得整个过程比较连贯。</p>
<p>&nbsp;&nbsp;&nbsp; 虽然如此，我们还是要理解常见的各个Tag的含义。在Doxywizard中，可以看到这些Tag以自明的方式命名，我们大致可以从名称中看出其作用。这些Tag被Doxywizard大致分为几类，其中HTML到PerlMod是输出文件种类设置，Project是Doxygen工程设置，Build是编译类选项，Messages为出错或异常选项，Input为输入源选项，等等。</p>
<p align=center><img height=364 src="http://java.chinaitlab.com/UploadFiles_8734/200607/20060718142812770.jpg" width=467 border=0></p>
<p align=center>图2&nbsp;&nbsp; Doxywizard</p>
<h4>注释</h4>
<p>&nbsp;&nbsp;&nbsp; Doxygen规定了进行注释的一些格式，正确的注释才能使Doxygen生成文档。第一个代码条目，都有两种描述：简要描述和详细描述，两者都是可选的。简要描述只有一行，而详细描述则提供更长、更仔细的描述，Doxygen只允许有一个简要描述和详细描述。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 在Doxygen中，一般只会处理与程序结构相关的注释，函数内部的注释通常不做处理。对于详细描述来说，有下面几种表示方式。</p>
<table class=grey4 cellSpacing=0 cellPadding=10 border=0>
    <tbody>
        <tr>
            <td>
            <pre>JavaDoc风格，中间的"*"号可选。/*** 注释*/Qt风格，中间的"*"号可选。/*!* 注释*/C++风格的变体，或者最后一个"/"改为"！"也可以。/// 单行注释/// 注释///更加显著的表示。////////////////////////////////////////////// 注释///////////////////////////////////////////简要描述亦有多种表示方式。在上述注释块中使用\brief命令，详细注释在空行之后开始。/*! \brief 简要描述*   继续** 详细注释*/JAVADOC_AUTOBRIEF设置为YES后，在JavaDoc风格的注释中，第一个点号之前的内容被自动设置为简要描述。对于多行C++变体，这个选项亦会起到相同的作用。/** 简要描述.详细描述* 注释*/C++变体风格。/// 简要描述/* 详细描述 */</pre>
            <pre>
            <h4>命令</h4>
            <p>&nbsp;&nbsp;&nbsp;  Doxygen支持的指令非常多，主要作用是控制输出文档的排版格式。命令以"\"或"@"号开始。</p>
            <p>一些命令可以有多个参数，一些命令只有一个参数。参数周围的括号使用是有含义的：</p>
            <ul>
                <li>&lt;&gt;号表示参数是单个词。
                <li>()号表示参数一直会到行尾。
                <li>{}号表示参数会扩展到下一段落。
                <li>[]号表示参数是可选的。</li>
            </ul>
            <p>下面章节中也涉及到一些命令的使用，其它的命令可以查阅Doxygen用户手册。</p>
            <h4>列表</h4>
            <p>Doxygen有许多方法可以创建项目列表。</p>
            <table class=grey4 cellSpacing=0 cellPadding=10 border=0>
                <tbody>
                    <tr>
                        <td>
                        <pre>使用"-"在每行开始之前打头，使用"."可以结束一个列表，开始新的段落。使用这种方法要严格对齐。/***  - 表项一*    - 子项一*    - 子项二*    .*  .*/在文档块中使用HTML命令。这种方法不需要严格对齐。/*!*  &lt;ul&gt;*  &lt;li&gt; 表项一*  &lt;ol&gt;*     &lt;li&gt; 子项一*     &lt;li&gt; 子项二*     &lt;/ol&gt;*  &lt;li&gt; 表项二*  &lt;/ul&gt;*/</pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <h4>分组</h4>
            <p>&nbsp;&nbsp;&nbsp;  Doxygen有两种分组机制。第一种是全局地为每一个组创建一个网页，此时分组被称为"module"；第二种是用于复合实体中的成员列表，此时分组被称为"member group"。Module是一种把内容在单个网页上分组的方法。分组可以包括files，namespace，classes，functions，variables，enums，typedefs和defines，也可以包含其它分组。复合实体（compound entities）如类、文件、命名空间等可以分布在多个分组中，而成员实体（member）如变量、函数、typedef等只能归属于一个分组。</p>
            <p>定义分组的方法是在特殊注释块中使用命令\defgroup和\addtogroup。 defgroup的格式如下：</p>
            <p>\defgroup &lt;唯一标识名&gt; （中间可以有空格的标题）</p>
            <p>&nbsp;&nbsp;&nbsp;  两次使用同一标识名，在doxygen解析的时候会出现错误。命令addtogroup与defgroup不同的地方在于，如果使用了同一标识，则会在改组中加入新的项，如果标识不重复，则会创建分组。addtogroup中的标题是可选的。</p>
            <p>&nbsp;&nbsp;&nbsp;  声明分组之后，如果要使某个实体归属某一分组，需要使用ingroup命令。避免在每个成员之前都使用ingroup命令，可以将member用@{和@}封装起来。</p>
            <table class=grey4 cellSpacing=0 cellPadding=10 border=0>
                <tbody>
                    <tr>
                        <td>
                        <pre>/** * \ingroup A */extern int VarInA;/** * \defgroup IntVariables Global integer variables *//*@{*//** an integer variable */extern int IntegerVariable;/*@}*/..../** * \defgroup Variables Global variables *//*@{*//** a variable in group A */int VarInA;int IntegerVariable;/*@}*/</pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>&nbsp;&nbsp;&nbsp;  上面这些命令都是有优先级的，doxygen会根据优先级将实体放入具有最高优先级的分组之中。它们的优先级顺序是：ingroup，defgroup，addtogroup，weakgroup。weakgroup类似一个低优先级的addtogroup。在.h文件中可以使用高优先级的命令定义层次结构，在.c文件中\weakgroup就不需要准确遵循.h文件中定义的层次结构。</p>
            <p>如果要把不同的类型归入同一分组内，就要使用Member group，它的定义方法如下：</p>
            <table class=grey4 cellSpacing=0 cellPadding=10 border=0>
                <tbody>
                    <tr>
                        <td>
                        <pre>//@{   ...//@}或者/*@{*/   ... /*@}*/</pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>Member group不可以嵌套。</p>
            <h4>图表</h4>
            <p>&nbsp;&nbsp;&nbsp;  Doxygen里有内置生成C++类层次图的功能。它使用贝尔实验室开发的graphviz 1.5中的工具"dot"来生成更高级的图表。使用这个工具时，要将配置选项HAVE_DOT设为YES。</p>
            <ul>
                <li>当GRAPHICAL_HIERARCHY设置为YES时，将会绘制一个图形表示的类图结构。
                <li>当CLASS_GRAPH设置为YES时，会为每个归档的类创建一张图表示其直接或间接的继承关系。
                <li>当INCLUDE_GRAPH设置为YES时，会为每个归档文件创建一幅包含依赖图，此功能目前仅有HTML和RTF格式支持。
                <li>当COLLABORATION_GRAPH设置为YES时，会为每个归档类或结构绘制基类继承关系图和使用关系图。
                <li>当CALL_GRAPH设置为YES时，会为每个函数显示一幅直接或间接调用关系图。
                </li>
            </ul>
            <p>更具体的信息可以参考Doxygen的手册。</p>
            <h4>公式</h4>
            <p>&nbsp;&nbsp;&nbsp;  Doxygen可以把LaTeX格式的公式输出出来。要在HTML文档里包含公式，需要安装下面的工具：latex（LaTeX编译器）、dvips（将DVI文件转换为PS文件）、gs（将PS文件转换为位图）。</p>
            <p>包含公式的方法有两种：</p>
            <table class=grey4 cellSpacing=0 cellPadding=10 border=0>
                <tbody>
                    <tr>
                        <td>
                        <pre>使用\f$命令对表示文本中间的公式，遵循LaTeX格式。\f$(x_1, y_1)\f$  (x1,y1)位于独立一行上未编号的公式，应放在命令\f[和\f]之间。\f[    |I_2|=\left| \psi(t)           \right|\f]对应的输出是|I2|=|&#968;(t)|。</pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <h4>中文文档</h4>
            <p>&nbsp;&nbsp;&nbsp;  Doxygen支持多种语言，输出中文文档的时候，只需要将配置文件中的OUTPUT_LANGUAGE标签设置为Chinese即可（用Doxywizard修改更方便）。</p>
            <p>&nbsp;&nbsp;&nbsp;  有一个需要注意的问题是，在Windows下的浏览器浏览中文HTML文档时，英文字母会变得很难看，解决的办法是将doxygen_cn.css下载到本地硬盘，并将配置文件中的HTML_STYLESHEET修改为这个文件的位置。</p>
            <p>HTML_STYLESHEET=c:\doxygen\doxygen.css</p>
            <h4>运行doxygen</h4>
            <p>在命令行下运行doxygen是很简单的，只需要指定配置文件即可。</p>
            <p>doxygen project.cfg</p>
            <p>或者，也可以使用Doxywizard在配置完后直接运行doxygen。</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<img src ="http://www.cppblog.com/prayer/aggbug/103959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-12-24 16:39 <a href="http://www.cppblog.com/prayer/archive/2009/12/24/103959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下使用doxygen阅读和分析C/C++代码</title><link>http://www.cppblog.com/prayer/archive/2009/12/24/103958.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 24 Dec 2009 08:37:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/12/24/103958.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/103958.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/12/24/103958.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/103958.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/103958.html</trackback:ping><description><![CDATA[虽然使用各种IDE或者Source Insight 可以方便地在windows下阅读和分析C/C++代码，但是一步步Go to Definetion 实在令人痛苦。Doxygen能够生成函数调用关系图，所有的函数调用关系可以一目了然，另外他还能统计文档中所有的类，成员变量，成员函数等。总的来说，Doxygen不但能从局部把握代码，还能从全局审视代码，后者是一般IDE和Source Insight 不能做到的。所以，使用doxygen阅读分析代码可以达到事半功倍的效果。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doxygen的安装很简单，到官方网站下载doxygen的windows安装程序即可。除了安装doxygen外，还需要安装graphviz，因为doxygen需要使用graphviz的dot.exe生成调用图。graphviz在它的官方网站上也可以下载到安装程序。不过我下载的安装程序在安装时老是报cab文件错误。最后我下载了graphviz的release文件，即安装程序下面的zip压缩文件，下载完成后解压缩即可。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安装完doxygen后即可进行适当的配置，然后运行doxyfile生成文档。基本的配置前人早有说明，不再赘述。需要注意的是：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.要勾选Dot选项卡下面的HAVE_DOT、CALL_GRAPH 、CALLER_GRAPH 选项。并在DOT_PATH下面填入dot.exe的路径，也就是graphviz安装目录下的bin文件夹。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.勾选Wizard-&gt;Project选项卡下面的Scan recursively！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.勾选Build选项卡下面的EXTRACT_ALL、EXTRACT_PRIVATE、EXTRACT_STATIC、EXTRACT_LOCAL_CLASSES、EXTRACT_LOCAL_METHODS选项</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.如果程序里面有中文，将Project选项卡下的DOXYFILE_ENCODING和Input选项卡下面的INPUT_ENCODING改为GBK</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.可以勾掉LATEX输出，这样节省编译时间</p>
<img src ="http://www.cppblog.com/prayer/aggbug/103958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-12-24 16:37 <a href="http://www.cppblog.com/prayer/archive/2009/12/24/103958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Doxygen为C\C++代码写文档 </title><link>http://www.cppblog.com/prayer/archive/2009/12/24/103956.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 24 Dec 2009 08:36:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/12/24/103956.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/103956.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/12/24/103956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/103956.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/103956.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Doxygen是这样的一个工具，在我们写代码的同时，加上特定的注释，然后，Doxygen就利用这些注释生成漂亮的程序文档。Doxygen是GPL众多优秀软件中的一员，当然，不仅仅在Linux平台有Doxygen，Doxygen还有Windows版本，而且他还提供了一个图形界面Doxywizard,使得使用Docxygen 更加方便。按照Doxywizard的步骤，首先，我们要生成配置文件，可以采用...&nbsp;&nbsp;<a href='http://www.cppblog.com/prayer/archive/2009/12/24/103956.html'>阅读全文</a><img src ="http://www.cppblog.com/prayer/aggbug/103956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-12-24 16:36 <a href="http://www.cppblog.com/prayer/archive/2009/12/24/103956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 rose 将 c++代码转换为 uml 类图</title><link>http://www.cppblog.com/prayer/archive/2009/12/24/103954.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 24 Dec 2009 08:25:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/12/24/103954.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/103954.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/12/24/103954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/103954.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/103954.html</trackback:ping><description><![CDATA[<p>阅读本文章，你需要对 uml 有简单的了解，懂得以下术语：</p>
<p>类图(&nbsp;class diagram&nbsp;) 即 c++ 中的 class 。</p>
<p>聚合(&nbsp;<font face=Verdana>Aggregation</font> ) 即我们c++中的引用。表现为 class 头文件中的一个或多个指针成员。</p>
<p>组合( <font face=Verdana>Composition</font> ) 即 c++ 中的成员对象。表现为class 头文件中的一个或多个对象成员。（也可以表现为指针成员，但需要在类中实例化此对象 ）。</p>
<p>泛化( <font face=Verdana>Generalization</font>&nbsp;) 即继承。</p>
<p><font style="COLOR: #c0c0c0" face=Verdana>双向关联(Bidirectional Associations)&nbsp;　轻量级的 聚合 与 组合。的即c++中的交叉引用。</font></p>
<p><span style="COLOR: #c0c0c0"><span style="COLOR: #c0c0c0">依赖（&nbsp;Dependency ) 从另一个维度表述 组合 和 聚合。即在class A 中使用 class B的方法或操作 class B 的成员。</span></span></p>
<p>&nbsp;</p>
<p>用例视图( user case view&nbsp;)、逻辑视图(&nbsp;logical view&nbsp;)、组件视图(&nbsp;component view&nbsp;)、部署视图(&nbsp;deployment view&nbsp;)。</p>
<p>要了解相关的知识，可以参考 ＜<font face=Verdana>UML Distilled</font>&nbsp;&gt;　一书 <font face=Verdana>Chapter 3. Class Diagrams: The Essentials</font> 。(类图：基本知识)　及 <font face=Verdana>Chapter 5. Class Diagrams: Advanced Concepts</font> （类图：高级概念）</p>
<p>（注：此书中译本叫＜UML精粹＞，不过翻译得甚为艰涩，文言文学得不错的可以考虑。繁体版叫＜uml 精华＞，赵光正译。熟悉台湾术语的可以考虑。)。</p>
<fieldset><legend>uml精粹详细信息</legend>
<p>&nbsp;<font face=Verdana>UML Distilled: A Brief Guide to the Standard Object Modeling Language, Third Edition <br>By Martin Fowler <br>&nbsp;&nbsp; <br>Publisher : Addison Wesley <br>Pub Date : September 15, 2003 <br>ISBN : 0-321-19368-7 <br>Pages : 208 <br></font></p>
</fieldset>
<p>rose&nbsp;提供了 reserver engineer （逆向设计）的功能，用于将 c++ 类文件转化为类图，并描述类与类之间的关系。&nbsp;</p>
<p>用 rose 逆向一组 c++ class 的一般步骤是：</p>
<p>1、新建一个空白工程</p>
<p>2、添加一个组件，用于容纳一组类文件。</p>
<p>3、设置 组件属性。指定解析 类文件使用的插件，以及逆向出的类使用的包名称。</p>
<p>4、解析，在 逻辑视图中的指定包(&nbsp;package )中生成相应的类图。</p>
<p>5、将关注的类拖到指定的视图中，观察其结构以及与其它成员的关系。</p>
<p>1、新建一个空白工程。完成后工程信息如下:</p>
<p>图中 untitled 表示这是一个未命名的文档。 四个大文件夹分别表示 用例视图、逻辑视图、组件视图、部署视图。每个大文件夹下面有个 main 结点。这是用来显示该视图内容的&#8220;桌布&#8221;。双击此结点，便会在主窗口中打开此桌布。结点可以添加、重命名。</p>
<p><img height=286 alt="" src="http://images.cnblogs.com/cnblogs_com/diylab/roseview.png" width=393 border=0></p>
<p>2、新建组件，指定其相关属性。</p>
<p>在工程的 compnent view (组件视图)结点上单击，选择 new -&gt; component。便创建了一个新的组件。右键此组件，选择"open specifition"(属性设置)。在弹出的 component （组件属性）窗口的 general 选项卡上，更改其name(名字)属性和 language&nbsp;属性。name 任意， language 选择 ANSI c++。（默认为 analysys）。点&#8220;确定&#8221;。这里，我们将其名称命名为 "constol"</p>
<p>3、&nbsp;指定相关的类文件。</p>
<p>右键 constol 组件，选择&#8220;open ANSI c++ specifition &#8221;，在出现的&nbsp; 属性窗口中 file选项卡中，更改 Reverse engineering root package 项，（默认为 c++ reverse Engineered。）名称随意。这里我们改为 constol。指定&nbsp;project files（&nbsp;项目文件）。把要解析的 c++源文件都包含进来。点&#8220;确定&#8221;。</p>
<p>4、回到工程视图。在 component 中的 constol 上，右键，&#8220;ANSI c++&#8221;-&gt; &#8220;reverse engineer&#8221;，点&#8220;确定&#8221;。这时会在 logical view 下生成一个新的文件夹结点，结点名称为 我们在第3步中　Reverse engineering root package 项中添的内容。结点下面包含了由源代码中解析出的类。</p>
<p>5、在 logical view 中，双击 main 结点。便打开了一个 main 逻辑视图。挨个把 logical view -&gt; constol 结点下&nbsp;的所有类结点拖到 main 视图中。则类的成员、类的关系会在视图中显示出来。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div id=MySignature><span style="COLOR: #6a7376"><br>范晨鹏<br>------------------<br>软件是一种态度<br>成功是一种习惯<br>东软&#183;大连&#183;电信事业部<br>p_168@163.com</span><br><br></div>
<img src ="http://www.cppblog.com/prayer/aggbug/103954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-12-24 16:25 <a href="http://www.cppblog.com/prayer/archive/2009/12/24/103954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rational Rose由代码生成类图 </title><link>http://www.cppblog.com/prayer/archive/2009/12/24/103953.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 24 Dec 2009 08:24:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/12/24/103953.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/103953.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/12/24/103953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/103953.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/103953.html</trackback:ping><description><![CDATA[<p>一，正向工程&nbsp;&nbsp; <br>&nbsp; 1、设置默认语言为Java，Tools-&gt;Options-&gt;Notation-&gt;default：选择Java。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 2、设置环境变量ClassPath，Tools-&gt;Java/j2ee-&gt;Project&nbsp;&nbsp; Specification-&gt;ClassPath：具体路径设置为正向工程生成java文件要保存的目录，一般为项目的src目录。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 3、打开设计好的类图，选中要生成的Java文件的类，然后通过Tools-&gt;Java/J2ee-&gt;General&nbsp;&nbsp; Code生成java文件.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 4、正向工程注意事项：&nbsp;&nbsp; <br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）.生成代码前将Project&nbsp;&nbsp; Specifiction属性页Code&nbsp;&nbsp; Generation标签项中的Generate&nbsp;&nbsp; Rose&nbsp;&nbsp; ID&nbsp;&nbsp; 和&nbsp;&nbsp; Generate&nbsp;&nbsp; Default&nbsp;&nbsp; Return&nbsp;&nbsp; Line两个复选框的默认选中状态去掉，以免生成一些我们不需要的信息&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2）.设计model等值对象时,不必为其设计getter(),setter()方法，将对应字段属性设置为：proerty&nbsp;&nbsp; type:simple&nbsp;&nbsp; 即可，正向工程会自动生成其getter,setter方法。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3）.类之间调用关系的设计：&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般A类调用B类，最终代码中经常以在A类里初始化一个b类的变量。在设计时，不要在A类中设计一个B类类型的属性。这种关系要在Association&nbsp;&nbsp; Specification中通过为Role&nbsp;&nbsp; A指定值来实现。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4）.类设计时要按开发规范写好类和方法的注释，正向工程会将注释生成到代码中，开发过程中注释如有改动，可通过逆向工程将类图和代码保持同步。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; </p>
<p><br>&nbsp; 二、逆向工程操作流程</p>
<p>&nbsp; 1.点击Tools-&gt;Java/J2ee-&gt;Reverse&nbsp;&nbsp; Engineer，调出Java&nbsp;&nbsp; Reverse&nbsp;&nbsp; Engineer对话框。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 2、在此页面添加要进行逆向工程的Java文件，并选中，然后点击Reverse按钮即可。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; 3、关于逆向工程的一点说明。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 逆向工程操作更为简单，试验进行逆向工程主要是看代码开发完进行逆向同步设计会不会出问题，以及信息会不会丢失，已经用物价查询模块的代码进行了逆向工程的测试，基本符合我们项目的要求，有两点需要注意一下&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）.进行逆向时，若有关联的类（包括我们框架的类或别的模块的类）不存在，则逆向会报错，无法进行&nbsp;&nbsp; </p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/wangyi1015/archive/2009/06/04/4241897.aspx">http://blog.csdn.net/wangyi1015/archive/2009/06/04/4241897.aspx</a></p>
<img src ="http://www.cppblog.com/prayer/aggbug/103953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-12-24 16:24 <a href="http://www.cppblog.com/prayer/archive/2009/12/24/103953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>运行时变更fields内容</title><link>http://www.cppblog.com/prayer/archive/2009/04/17/80292.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Fri, 17 Apr 2009 12:31:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/17/80292.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/80292.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/17/80292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/80292.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/80292.html</trackback:ping><description><![CDATA[　运行时变更fields内容<br>
<div class=spctrl></div>
　　与先前两个动作相比，&#8220;变更field内容&#8221;轻松多了，因为它不需要参数和自变量。首先调用Class的getField()并指定field名称。获得特定的Field object之后便可直接调用Field的get()和set()，如图9。<br>
<div class=spctrl></div>
　　#001 public class Test {<br>
<div class=spctrl></div>
　　#002 public double d;<br>
<div class=spctrl></div>
　　#003<br>
<div class=spctrl></div>
　　#004 public static void main(String args[])<br>
<div class=spctrl></div>
　　#005 {<br>
<div class=spctrl></div>
　　#006 Class c = Class.forName("Test");<br>
<div class=spctrl></div>
　　#007 Field f = c.getField("d"); //指定field 名称<br>
<div class=spctrl></div>
　　#008 Test obj = new Test();<br>
<div class=spctrl></div>
　　#009 System.out.println("d= " + (Double)f.get(obj));<br>
<div class=spctrl></div>
　　#010 f.set(obj, 12.34);<br>
<div class=spctrl></div>
　　#011 System.out.println("d= " + obj.d);<br>
<div class=spctrl></div>
　　#012 }<br>
<div class=spctrl></div>
　　#013 }<br>
<img src ="http://www.cppblog.com/prayer/aggbug/80292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-17 20:31 <a href="http://www.cppblog.com/prayer/archive/2009/04/17/80292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Class.class.getClass()</title><link>http://www.cppblog.com/prayer/archive/2009/04/17/80286.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Fri, 17 Apr 2009 11:42:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/17/80286.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/80286.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/17/80286.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/80286.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/80286.html</trackback:ping><description><![CDATA[<div class=bvMsg id=msgcns!F8BFA8AA9D591749!132>
<div>前几天朋友问一个问题<strong>Class.class.getClass(),</strong>只知道是java的反射机制。具体讲不清楚，上网查了一下与大家共享：</div>
<div>&nbsp;</div>
<div>Class与class都继承自Object,class实体来代表java运行时的class和interface等等，</div>
<div>Class.class就是得到或者生成这个Class类的Class Object；</div>
<div>而.getClass()本就是返回一个类对应的Class &nbsp; Object&nbsp;&nbsp;，</div>
<div>所以Class.class.getClass()最后还是返回Class &nbsp; Object</div>
<div>&nbsp;</div>
<div>总结如下（转）：</div>
<div>&nbsp; Class类是为了保存JAVA虚拟机运行时(RTTI)对所有对象进行类型识别的信息而设立的. &nbsp; <br>&nbsp; 当然Class也是继承自Object类的,每个类都有Class对象,想得到一个类的Class对象共有三种方法. &nbsp; <br>&nbsp; 1:<strong>调用getClass()</strong>&nbsp;&nbsp;&nbsp;<br>&nbsp; Employee emp; &nbsp; <br>&nbsp; Class &nbsp; cls=emp.getClass(); &nbsp; <br>&nbsp; 2:<strong>静态方法forName(String &nbsp; )</strong>&nbsp;&nbsp;&nbsp;<br>&nbsp; String &nbsp; className="Employee"; &nbsp; <br>&nbsp; Class &nbsp; cls=Class.forName(className); &nbsp; <br>&nbsp; 3:<strong>class成员变量法</strong> &nbsp; <br>&nbsp; Class &nbsp; cls=Employee.class;&nbsp;&nbsp;&nbsp;</div>
<div><br>&nbsp; Class.class.getClass()的意思应该很清楚了</div>
<div>&nbsp; Class.class返回一个Class类的Class对象,</div>
<div>&nbsp; 在调用getClass()又一次返回Class的对象。</div>
</div>
<img src ="http://www.cppblog.com/prayer/aggbug/80286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-17 19:42 <a href="http://www.cppblog.com/prayer/archive/2009/04/17/80286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String..::.Split 方法 </title><link>http://www.cppblog.com/prayer/archive/2009/04/17/80285.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Fri, 17 Apr 2009 11:34:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/04/17/80285.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/80285.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/04/17/80285.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/80285.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/80285.html</trackback:ping><description><![CDATA[<p>返回的字符串数组包含此实例中的子字符串（由指定字符串或 Unicode 字符数组的元素分隔）。 </p>
<img src ="http://www.cppblog.com/prayer/aggbug/80285.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-04-17 19:34 <a href="http://www.cppblog.com/prayer/archive/2009/04/17/80285.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>