﻿<?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++博客-lynch</title><link>http://www.cppblog.com/lynch/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 03 Apr 2026 18:27:59 GMT</lastBuildDate><pubDate>Fri, 03 Apr 2026 18:27:59 GMT</pubDate><ttl>60</ttl><item><title>listen()的backlog参数小结</title><link>http://www.cppblog.com/lynch/archive/2012/12/30/196855.html</link><dc:creator>董三</dc:creator><author>董三</author><pubDate>Sun, 30 Dec 2012 07:52:00 GMT</pubDate><guid>http://www.cppblog.com/lynch/archive/2012/12/30/196855.html</guid><wfw:comment>http://www.cppblog.com/lynch/comments/196855.html</wfw:comment><comments>http://www.cppblog.com/lynch/archive/2012/12/30/196855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lynch/comments/commentRss/196855.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lynch/services/trackbacks/196855.html</trackback:ping><description><![CDATA[<p>&nbsp; <div><span style="word-wrap: break-word; font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp; listen函数是网络编程一个基本的函数，而且它的backlog参数却是和TCP协议息息相关的。我们来看一下一个backlog参数到底有多少秘密。</span></div>&nbsp; </p><p><strong><font size="4">一、 为了理解backlog参数，我们必须首先认识listen函数。</font></strong></p><pre class="brush: cpp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;"><strong><font size="4">#include&lt;sys/socket.h&gt;
int listen(int sockfd, int backlog);</font></strong></pre>
<blockquote>
<p>listen函数仅由TCP服务器调用，它做两件事情：</p></blockquote>
<p>1、当socket函数创建一个套接口时，它被假设为一个主动套装口，也就是说，它是一个将调用connet发起连接的客户套接口。listen函数把一个未连接的套接口转换成一个被动套接口，指示内核应接受指向该套接口的连接请求。根据TCP状态转换图，调用listen导致套接口从CLOSED状态转换到LISTEN状态。
</p><p>2、本函数的第二个参数规定了内核应该为相应套接口排队的最大连接个数。
</p><p>为了更好的理解backlog参数，我们必须认识到内核为任何一个给定的监听套接口维护两个队列：
</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">1、未完成连接队列（incomplete connection queue），</font>每个这样的SYN分节对应其中一项：已由某个客户发出并到达服务器，而服务器正在等待完成相应的TCP三路握手过程。这些套接口处于SYN_RCVD状态。
</p><p>&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">2、已完成连接队列（completed connection queue），</font>每个已完成TCP三路握手过程的客户对应其中一项。这些套接口处于ESTABLISHED状态。
</p><p>当来自客户的SYN到达时，TCP在未完成连接队列中创建一个新项，然后响应以三路握手的第二个分节：服务器的SYN响应，其中稍带对客户SYN的ACK（即SYN+ACK）。这一项一直保留在未完成连接队列中，直到三路握手的第三个分节（客户对服务器SYN的ACK）到达或者该项超时为止（曾经源自Berkeley的实现为这些未完成连接的项设置的超时值为75秒）。如果三路握手正常完成，该项就从未完成连接队列移到已完成连接队列的队尾。当进程调用accept时，已完成连接队列中的队头项将返回给进程，或者如果该队列为空，那么进程将被投入睡眠，直到TCP在该队列中放入一项才唤醒它。
</p><p><strong><font size="4">二、查看man手册。看看man listen怎么说</font></strong>
</p><p><a href="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/listenbacklog_DEE6/clip_image002%5B1%5D.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="clip_image002[1]" alt="clip_image002[1]" src="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/listenbacklog_DEE6/clip_image002%5B1%5D_thumb.jpg" border="0" height="218" width="730" /></a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以看到man手册是这样描述backlog参数的：&#8220;backlog参数确定了connection队列可以增长的最大长度&#8221;，如果connection队列已满（达到backlog确定的长度），那么新的connection请求到来时，客户端会得到一个ECONNREFUSED error，或者，如果底层协议支持重发，那么这个请求会被服务器忽略而使客户端重新发送connection请求。
</p><p><a href="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/listenbacklog_DEE6/clip_image004%5B1%5D.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="clip_image004[1]" alt="clip_image004[1]" src="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/listenbacklog_DEE6/clip_image004%5B1%5D_thumb.jpg" border="0" height="223" width="732" /></a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在backlog用来确定已完成队列（完成三次握手等待accept）的长度，而不再是已完成队列和未完成连接队列之和（linux 2.2之前）。
</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 未完成队列（incomplete connection queue）的长度现在由/proc/sys/net/ipv4/tcp_max_syn_backlog设置，在现在大多数最新linux内核都是默认512，这个设置有效的前提是系统的syncookies功能被禁用，如果系统的syncookies功能被启用，那么这个设置是无效的。Syncookies是在内核编译的时候设置的，查看syncookies是否启动：
</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cat /proc/sys/net/ipv4/tcp_syncookies
</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果是&#8220;1&#8221;说明已启用，为&#8220;0&#8221;说明未启用。
</p><p>&nbsp;&nbsp;&nbsp;&nbsp; 那么为syncookies是做什么的呢，为什么它会和未完成队列有关系。简单的说它是为防范SYN Flood攻击的设计。具体请参考&#8220;syncookies介绍&#8221;（http://baike.baidu.com/view/9033755.htm）。
</p><p>继续看backlog，如果我们给listen的backlog参数设值超过了/proc/sys/net/core/somaxconn，那么backlog参数的值为自动被改写为/proc/sys/net/core/somaxconn的值，它的默认大小为128.
</p><p>&nbsp; </p><p>&nbsp; </p><p><font color="#ff0000"><strong>更多资料可以查看</strong></font>
</p><p>1、 man tcp
</p><p>2、 man listen
</p><p>3、 《unix网络编程卷一》
</p><p>4、 百度百科syncookies介绍：http://baike.baidu.com/view/9033755.htm
 </p><img src ="http://www.cppblog.com/lynch/aggbug/196855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lynch/" target="_blank">董三</a> 2012-12-30 15:52 <a href="http://www.cppblog.com/lynch/archive/2012/12/30/196855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ UML小结</title><link>http://www.cppblog.com/lynch/archive/2012/12/21/196518.html</link><dc:creator>董三</dc:creator><author>董三</author><pubDate>Fri, 21 Dec 2012 14:09:00 GMT</pubDate><guid>http://www.cppblog.com/lynch/archive/2012/12/21/196518.html</guid><wfw:comment>http://www.cppblog.com/lynch/comments/196518.html</wfw:comment><comments>http://www.cppblog.com/lynch/archive/2012/12/21/196518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lynch/comments/commentRss/196518.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lynch/services/trackbacks/196518.html</trackback:ping><description><![CDATA[<p>在UML类图中,类与类之间有几种常见关系:依赖、关联、聚合、组合、泛化。  </p><p><strong>1、依赖（Dependency）</strong></p><p><strong><br /></strong>  </p><blockquote> <p>依赖是一种很有用的关系，它用来表述一个类A&#8220;use&#8221;了另一个类B。A可以是通过任何方式&#8220;use&#8221;类B，如：</p></blockquote> <blockquote> <p><font color="#c0504d">1）A的成员函数的返回值为B；</font></p></blockquote> <blockquote> <p><font color="#c0504d">2）A的成员函数使用B作为函数参数；</font></p></blockquote> <blockquote> <p><font color="#c0504d">3）A的成员函数的内部实现使用了B；</font></p></blockquote> <blockquote> <p>依赖关系通常使用虚线箭头&#8220;----&gt;&#8221;表示，箭头指向被&#8220;use&#8221;的类。  </p><p><a href="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_16.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_thumb_7.png" border="0" height="170" width="300" /></a></p></blockquote> <blockquote> <p>在C++代码中，依赖关系是这样对应的：</p><pre class="brush: cpp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">class A

{ public: B returns_a_B();

void has_a_B_argument(B);

void has_a_B_in_its_implementation();

};

A::void has_a_B_in_its_implementation(){ B b; }
</pre>
</blockquote>
<p><strong>2、关联（Association）</strong> 
</p><blockquote>
<p>关联可以表述成一个类&#8220;知道&#8221;另一个类。如何&#8220;知道&#8221;呢？在C++中，类A&#8220;知道&#8221;类B一般是通过指针实现的（也可以使用引用或者值），即类A有一个成员变量是指向B的指针（或者引用、值）。</p></blockquote>
<p>关联可以分为双向关联、单向关联、自身关联。 
</p><p>1）双向关联 
</p><blockquote>
<p>双向关联A-B：双方都&#8220;知道&#8221;对方，都可以调用对方的公共属性和方法。 
</p><p align="center"><a href="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_14.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_thumb_6.png" border="0" height="128" width="524" /></a></p></blockquote>
<blockquote>
<p>对应的C++代码为：</p><pre class="brush: cpp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">class A {

public:

B* pB;

};

class B {

public:

A* pA;

};
</pre></blockquote>
<p>2）单向关联 
</p><blockquote>
<p>单向关联A-&gt;B：表示A&#8220;知道&#8221;B，A可以调用B的公共属性和方法。没有生命周期的依赖。 
</p><p align="center"><a href="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_12.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_thumb_5.png" border="0" height="136" width="504" /></a></p></blockquote>
<blockquote>
<p>对应的C++代码为：</p><pre class="brush: cpp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">class A {

public:

B* pB;

};

class B {

};
</pre></blockquote>
<p>3）自身关联 
</p><blockquote>
<p>自身关联：自己引用自己，这个在链表中非常常见。</p></blockquote>
<blockquote>
<p>可以看到，上面的Object类，就是一个自身关联的应用，它有一个自己指向自己的指针，用来实现链表。 
</p><p><a href="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_10.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_thumb_4.png" border="0" height="184" width="442" /></a></p></blockquote>
<blockquote>
<p>对应的C++代码为：</p><pre class="brush: cpp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">class Object {

public:

int data;

Object* next;

};

class ObjectList {

public:

Object* first;

ObjectList();

void insert(Object* obj);

void print() const;

};
</pre>
</blockquote>
<p><strong>3、聚合（Aggregation）和组合（Composition）</strong> 
</p><blockquote>
<p>聚合和组合都是用在表述整体-部分关系的时候，二者只是在生命周期问题上有差异。</p></blockquote>
<blockquote>
<p>1）聚合通常可以理解成&#8220;has a&#8221;关系。如果类A聚合类B，那么类A&#8220;has a&#8221;类B，同时，在A的生命周期结束后类B必须依然存在或者有意义。比如房间有一张桌子，那么房间和桌子的关系就是聚合：即使房间没有了，那张桌子还是存在的，桌子是可以脱离房间而存在的。 
</p><p><a href="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_8.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_thumb_3.png" border="0" height="149" width="334" /></a></p></blockquote>
<blockquote>
<p>对应的C++代码：</p><pre class="brush: cpp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">class Table {

};

class Room {

public:

Table aTable;

};
</pre>
</blockquote>
<blockquote>
<p>2）组合通常可以理解为&#8220;is a part of&#8221;。和聚合不同的是，如果类A组合类B，那么当A生命周期结束后，类B也随之结束，也就是说B不能脱离类A而存在。就如同鸟都有两只翅膀一样，当鸟消失了，翅膀也随之不存在了。 
</p><p><a href="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_6.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_thumb_2.png" border="0" height="141" width="336" /></a></p></blockquote>
<blockquote>
<p>对应的C++代码：</p><pre class="brush: cpp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">class Wing {

};

class Bird{

public:

Wing leftWing;

Wing rightWing;

};
</pre>
</blockquote>
<blockquote>
<p><strong><font color="#ff0000">可以发现，如果单纯从C++代码来看，聚合关系和组合关系没有什么不同，要区分聚合和组合，只能从语义分析。</font></strong></p></blockquote>
<p><font color="#ff0000"><strong>补充：</strong></font> 
</p><blockquote>
<p>组合关系还有另一层含义：&#8220;is a&#8221;。不过这种含义，仅仅用来角色方面，即&#8220;is a&#8221;角色。比如一个人，是丈夫角色。那也可以看做组合；手机可以看做&#8220;Camera&#8221;、&#8220;Music Player&#8221;等。 
</p><p><a href="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_4.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_thumb_1.png" border="0" height="197" width="343" /></a></p></blockquote>
<p>
</p><blockquote>
<p>从上图我们可以看出，Battery和Smart Phone是聚合关系，因为电池是手机的一部分，但是电池可以脱离手机而存在。而IMEI Number和Smart Phone是组合关系，一般情况下一个Smart Phone只有一个IMEI Number,手机消失后，IMEI跟着消失。而我们知道现在的手机可以拍照、上网、播放音乐，因此手机可以扮演相机、web冲浪、音乐播放器的角色，所以Smart phone和Camera、Web Browser、Music Player是组合的关系。</p></blockquote>
<p><strong>4、泛化（Realization）</strong> 
</p><blockquote>
<p>泛化关系也被常用作继承（inherit）关系，是用来表述&#8220;Is-a&#8221;这种关系的，比如Car和Police-Car的关系，Police-Car &#8220;is a&#8221; Car。 
</p><p><a href="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_2.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" alt="image" src="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/a3fe8013b5ff_13089/image_thumb.png" border="0" height="204" width="244" /></a></p></blockquote>
<blockquote>
<p>对应的C++代码为：</p><pre class="brush: cpp; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">class Car {

};

class Police_Car{

};
</pre></blockquote><img src ="http://www.cppblog.com/lynch/aggbug/196518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lynch/" target="_blank">董三</a> 2012-12-21 22:09 <a href="http://www.cppblog.com/lynch/archive/2012/12/21/196518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu安装libevent</title><link>http://www.cppblog.com/lynch/archive/2012/12/21/196504.html</link><dc:creator>董三</dc:creator><author>董三</author><pubDate>Fri, 21 Dec 2012 06:35:00 GMT</pubDate><guid>http://www.cppblog.com/lynch/archive/2012/12/21/196504.html</guid><wfw:comment>http://www.cppblog.com/lynch/comments/196504.html</wfw:comment><comments>http://www.cppblog.com/lynch/archive/2012/12/21/196504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lynch/comments/commentRss/196504.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lynch/services/trackbacks/196504.html</trackback:ping><description><![CDATA[<blockquote> <p>1、./configure</p></blockquote> <blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; make</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sudo make install</p> <p>2、通过gcc echo.c&nbsp;&nbsp; -levent可以编译成功，但是一运行就报错：&#8220;error while loading shared libraries: libevent-1.4.so.2: cannot open shared&#8221;</p> <p>3、解决方法，查找libevent-1.4.so.2库，find / &#8211;name &#8216;libevent-1.4.so.2&#8217;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 发现所在路径为/usr/local/lib/libevent-1.4.so.2</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 建立一个符号链接到/usr/lib/libevent-1.4.so.2</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ln -s /usr/local/lib/libevent-1.4.so.2 /usr/local/</p> <p><a href="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/ubuntulibevent_C9C2/Libevent%20_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Libevent " alt="Libevent " src="http://www.cppblog.com/images/cppblog_com/lynch/Windows-Live-Writer/ubuntulibevent_C9C2/Libevent%20_thumb.jpg" border="0" height="837" width="934" /></a></p></blockquote><img src ="http://www.cppblog.com/lynch/aggbug/196504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lynch/" target="_blank">董三</a> 2012-12-21 14:35 <a href="http://www.cppblog.com/lynch/archive/2012/12/21/196504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>统计代码行数</title><link>http://www.cppblog.com/lynch/archive/2012/12/16/196343.html</link><dc:creator>董三</dc:creator><author>董三</author><pubDate>Sat, 15 Dec 2012 16:18:00 GMT</pubDate><guid>http://www.cppblog.com/lynch/archive/2012/12/16/196343.html</guid><wfw:comment>http://www.cppblog.com/lynch/comments/196343.html</wfw:comment><comments>http://www.cppblog.com/lynch/archive/2012/12/16/196343.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lynch/comments/commentRss/196343.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lynch/services/trackbacks/196343.html</trackback:ping><description><![CDATA[<span style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px; white-space: pre;">	</span><span style="font-family: 'Times New Roman'; line-height: 18.200000762939453px;">在我们平时写代码过程中，有时候想知道我们完成的程序到底有多少行代码（据说很多面试的童鞋会被面试官问到这个问题）。在这里，我分享一下我自己统计代码的方法。</span><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><span style="word-wrap: break-word; white-space: pre;">	</span>我们这里以统计&#8220;.h&#8221;和&#8220;.cpp&#8221;为后缀的源码文件为例，但是同样可以用于统计&#8220;.hpp&#8221;、&#8220;.cc&#8221;、&#8220;.c&#8221;、&#8220;.py&#8221;、&#8220;.java&#8221;、&#8220;.html&#8221;等所有后缀名文件。</div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><span style="word-wrap: break-word; white-space: pre;">	</span>首先看一下目录结构</div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><a href="http://blog.chinaunix.net/attachment/201212/15/24782829_1355586341P7ax.jpg" style="word-wrap: break-word;"><span style="word-wrap: break-word; white-space: pre;">	<img src="http://www.cppblog.com/images/cppblog_com/lynch/8.jpg" border="0" alt="" width="318" height="213" /></span></a></div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><span style="word-wrap: break-word; white-space: pre;">	</span>要统计代码行数，我们需要用到wc命令。&#8220;wc -l filename&#8221;可以用来统计filename的行数。比如</div><div id="codeText" style="word-wrap: break-word; border: 1px solid #dddddd; width: 645.816650390625px; overflow: auto; margin: 0px 0px 1.1em; word-break: break-all; background-color: #ffffff; font-size: 12px; line-height: normal; font-family: Consolas, monospace;"><ol start="1" style="word-wrap: break-word; margin: 0px 1px 0px 0px; color: #5c5c5c; line-height: 1.3; padding: 5px 0pt;"><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #000000; white-space: pre;">	</span>wc&nbsp;<span style="word-wrap: break-word; color: #0000cc;">-</span>l test<span style="word-wrap: break-word; color: #0000cc;">.</span>cpp</li></ol></div><span style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px; white-space: pre;">	<img src="http://www.cppblog.com/images/cppblog_com/lynch/9.jpg" border="0" alt="" width="383" height="65" /></span><br style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;" /><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><span style="word-wrap: break-word; white-space: pre;">	</span>要统计所有的&#8220;.h&#8221;和".cpp"的文件行数，还需要使用find命令。</div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"></div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><strong style="word-wrap: break-word;">方法一：</strong></div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><span style="word-wrap: break-word; white-space: pre;">	</span>分别统计&#8220;.h&#8221;和&#8220;.cpp&#8221;的行数，再把它们加起来。</div><div id="codeText" style="word-wrap: break-word; border: 1px solid #dddddd; width: 645.816650390625px; overflow: auto; margin: 0px 0px 1.1em; word-break: break-all; background-color: #ffffff; font-size: 12px; line-height: normal; font-family: Consolas, monospace;"><ol start="1" style="word-wrap: break-word; margin: 0px 1px 0px 0px; color: #5c5c5c; line-height: 1.3; padding: 5px 0pt;"><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #000000; white-space: pre;">	</span>wc&nbsp;<span style="word-wrap: break-word; color: #0000cc;">-</span>l `find&nbsp;<span style="word-wrap: break-word; color: #0000cc;">.</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">-</span>name&nbsp;<span style="word-wrap: break-word; color: #ff00ff;">'*.h'</span><span style="word-wrap: break-word; color: #ff00ff;">`</span><span style="word-wrap: break-word; color: #ff00ff;">;</span>&nbsp;wc&nbsp;<span style="word-wrap: break-word; color: #0000cc;">-</span>l `find&nbsp;<span style="word-wrap: break-word; color: #0000cc;">.</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">-</span>name&nbsp;<span style="word-wrap: break-word; color: #ff00ff;">'*.cpp'</span><span style="word-wrap: break-word; color: #ff00ff;">`</span></li></ol></div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><span style="word-wrap: break-word; white-space: pre;">	</span>结果如下：<span style="word-wrap: break-word; white-space: pre;">	</span></div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><a href="http://blog.chinaunix.net/attachment/201212/15/24782829_1355587046Xr1x.jpg" style="word-wrap: break-word;"><span style="word-wrap: break-word; white-space: pre;">	<img src="http://www.cppblog.com/images/cppblog_com/lynch/10.jpg" border="0" alt="" width="728" height="167" /></span></a></div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><span style="word-wrap: break-word; white-space: pre;">	</span>虽然得到了结果，但是&#8220;.h&#8221;、&#8220;.cpp&#8221;代码行数是分别统计的。</div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><strong style="word-wrap: break-word;">方法二：</strong></div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><span style="word-wrap: break-word; color: #333333; font-family: Georgia, 'Times New Roman', Times, sans-serif; line-height: 25px; background-color: #ffffff;"><span style="word-wrap: break-word; white-space: pre;">	</span>使用-or命令连接多个表达式。</span></div><div id="codeText" style="word-wrap: break-word; border: 1px solid #dddddd; width: 645.816650390625px; overflow: auto; margin: 0px 0px 1.1em; word-break: break-all; background-color: #ffffff; font-size: 12px; line-height: normal; font-family: Consolas, monospace;"><ol start="1" style="word-wrap: break-word; margin: 0px 1px 0px 0px; color: #5c5c5c; line-height: 1.3; padding: 5px 0pt;"><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #000000; white-space: pre;">	</span>wc&nbsp;<span style="word-wrap: break-word; color: #0000cc;">-</span>l `find&nbsp;<span style="word-wrap: break-word; color: #0000cc;">.</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">-</span>name&nbsp;<span style="word-wrap: break-word; color: #ff00ff;">'*.h'</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">-</span><span style="word-wrap: break-word; color: #0000ff;">or</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">-</span>name&nbsp;<span style="word-wrap: break-word; color: #ff00ff;">'*.cpp'</span><span style="word-wrap: break-word; color: #ff00ff;">`</span></li></ol></div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><span style="word-wrap: break-word; white-space: pre;">	</span>结果如下：</div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><span style="word-wrap: break-word; white-space: pre;">	<img src="http://www.cppblog.com/images/cppblog_com/lynch/11.jpg" border="0" alt="" width="742" height="144" /></span></div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><strong style="word-wrap: break-word;">方法三：</strong></div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><span style="word-wrap: break-word; white-space: pre;">	</span>使用正则表达式。</div><div id="codeText" style="word-wrap: break-word; border: 1px solid #dddddd; width: 645.816650390625px; overflow: auto; margin: 0px 0px 1.1em; word-break: break-all; background-color: #ffffff; font-size: 12px; line-height: normal; font-family: Consolas, monospace;"><ol start="1" style="word-wrap: break-word; margin: 0px 1px 0px 0px; color: #5c5c5c; line-height: 1.3; padding: 5px 0pt;"><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #000000; white-space: pre;">	</span>wc&nbsp;<span style="word-wrap: break-word; color: #0000cc;">-</span>l `find&nbsp;<span style="word-wrap: break-word; color: #0000cc;">.</span><span style="word-wrap: break-word; color: #0000cc;">/</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">-</span>name&nbsp;<span style="word-wrap: break-word; color: #ff00ff;">"*.[hc]*"</span>&nbsp;`</li></ol></div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><span style="word-wrap: break-word; white-space: pre;">	</span>结果如下：</div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"><span style="word-wrap: break-word; white-space: pre;">	<img src="http://www.cppblog.com/images/cppblog_com/lynch/12.jpg" border="0" alt="" width="721" height="137" /></span></div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;"></div><div style="word-wrap: break-word; font-family: 'Times New Roman'; line-height: 18.200000762939453px;">附常用正则表达式意义：<br style="word-wrap: break-word;" /><div style="word-wrap: break-word;"><div style="word-wrap: break-word; background-image: none; background-attachment: scroll; background-color: #f2f2f2; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #dddddd; font-size: 12px; line-height: 25px; font-weight: bold; height: 25px; width: 645.816650390625px; background-position: 0px 0px; background-repeat: repeat repeat;"><p style="word-wrap: break-word; padding: 0px 0px 0px 30px;">点击(<span style="word-wrap: break-word; cursor: pointer; color: red;">此处</span>)折叠或打开</p></div><div id="code726" style="word-wrap: break-word; border: 1px solid #dddddd; width: 645.816650390625px; overflow: auto; margin: 0px 0px 1.1em; word-break: break-all; letter-spacing: 0.1px; background-color: #ffffff; font-size: 12px; line-height: normal; font-family: Consolas, monospace;"><ol start="1" style="word-wrap: break-word; margin: 0px 1px 0px 0px; color: #5c5c5c; line-height: 1.3; padding-left: 40px;"><li style="word-wrap: break-word; padding-left: 10px;">\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性，^ 也匹配 &#8217;\n&#8217; 或 &#8217;\r&#8217; 之后的位置。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">$ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性，$ 也匹配 &#8217;\n&#8217; 或 &#8217;\r&#8217; 之前的位置。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">*</span>&nbsp;匹配前面的子表达式零次或多次。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">+</span>&nbsp;匹配前面的子表达式一次或多次。<span style="word-wrap: break-word; color: #0000cc;">+</span>&nbsp;等价于&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span>1<span style="word-wrap: break-word; color: #0000cc;">,</span><span style="word-wrap: break-word; color: #0000cc;">}</span>。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">? 匹配前面的子表达式零次或一次。? 等价于&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span>0<span style="word-wrap: break-word; color: #0000cc;">,</span>1<span style="word-wrap: break-word; color: #0000cc;">}</span>。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">{</span>n<span style="word-wrap: break-word; color: #0000cc;">}</span>&nbsp;n 是一个非负整数，匹配确定的n 次。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">{</span>n<span style="word-wrap: break-word; color: #0000cc;">,</span><span style="word-wrap: break-word; color: #0000cc;">}</span>&nbsp;n 是一个非负整数，至少匹配n 次。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">{</span>n<span style="word-wrap: break-word; color: #0000cc;">,</span>m<span style="word-wrap: break-word; color: #0000cc;">}</span>&nbsp;m 和 n 均为非负整数，其中n&nbsp;<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">=</span>&nbsp;m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">? 当该字符紧跟在任何一个其他限制符&nbsp;<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">*</span><span style="word-wrap: break-word; color: #0000cc;">,</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">+</span><span style="word-wrap: break-word; color: #0000cc;">,</span>&nbsp;?<span style="word-wrap: break-word; color: #0000cc;">,</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span>n<span style="word-wrap: break-word; color: #0000cc;">}</span><span style="word-wrap: break-word; color: #0000cc;">,</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span>n<span style="word-wrap: break-word; color: #0000cc;">,</span><span style="word-wrap: break-word; color: #0000cc;">}</span><span style="word-wrap: break-word; color: #0000cc;">,</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span>n<span style="word-wrap: break-word; color: #0000cc;">,</span>m<span style="word-wrap: break-word; color: #0000cc;">}</span><span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">.</span>&nbsp;匹配除 &#8220;\n&#8221; 之外的任何单个字符。要匹配包括 &#8217;\n&#8217; 在内的任何字符，请使用象 &#8217;<span style="word-wrap: break-word; color: #0000cc;">[</span><span style="word-wrap: break-word; color: #0000cc;">.</span><span style="word-wrap: break-word; color: #0000cc;">\</span>n<span style="word-wrap: break-word; color: #0000cc;">]</span>&#8217; 的模式。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">(</span>pattern<span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;匹配pattern 并获取这一匹配。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">?</span><span style="word-wrap: break-word; color: #0000cc;">:</span>pattern<span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;匹配pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">?</span><span style="word-wrap: break-word; color: #0000cc;">=</span>pattern<span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">?</span>!pattern<span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;负向预查，与<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">?</span><span style="word-wrap: break-word; color: #0000cc;">=</span>pattern<span style="word-wrap: break-word; color: #0000cc;">)</span>作用相反&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">x<span style="word-wrap: break-word; color: #0000cc;">|</span>y 匹配 x 或 y。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">[</span>xyz<span style="word-wrap: break-word; color: #0000cc;">]</span>&nbsp;字符集合。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">[</span><span style="word-wrap: break-word; color: #0000cc;">^</span>xyz<span style="word-wrap: break-word; color: #0000cc;">]</span>&nbsp;负值字符集合。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">[</span>a-z<span style="word-wrap: break-word; color: #0000cc;">]</span>&nbsp;字符范围，匹配指定范围内的任意字符。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">[</span><span style="word-wrap: break-word; color: #0000cc;">^</span>a-z<span style="word-wrap: break-word; color: #0000cc;">]</span>&nbsp;负值字符范围，匹配任何不在指定范围内的任意字符。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\b 匹配一个单词边界，也就是指单词和空格间的位置。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\B 匹配非单词边界。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\cx 匹配由x指明的控制字符。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\d 匹配一个数字字符。等价于&nbsp;<span style="word-wrap: break-word; color: #0000cc;">[</span>0-9<span style="word-wrap: break-word; color: #0000cc;">]</span>。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\D 匹配一个非数字字符。等价于&nbsp;<span style="word-wrap: break-word; color: #0000cc;">[</span><span style="word-wrap: break-word; color: #0000cc;">^</span>0-9<span style="word-wrap: break-word; color: #0000cc;">]</span>。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\f 匹配一个换页符。等价于 \x0c 和 \cL。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\n 匹配一个换行符。等价于 \x0a 和 \cJ。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\r 匹配一个回车符。等价于 \x0d 和 \cM。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\s 匹配任何空白字符，包括空格、制表符、换页符等等。等价于<span style="word-wrap: break-word; color: #0000cc;">[</span>&nbsp;\f\n\r\t\v<span style="word-wrap: break-word; color: #0000cc;">]</span>。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\S 匹配任何非空白字符。等价于&nbsp;<span style="word-wrap: break-word; color: #0000cc;">[</span><span style="word-wrap: break-word; color: #0000cc;">^</span>&nbsp;\f\n\r\t\v<span style="word-wrap: break-word; color: #0000cc;">]</span>。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\t 匹配一个制表符。等价于 \x09 和 \cI。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\w 匹配包括下划线的任何单词字符。等价于&#8217;<span style="word-wrap: break-word; color: #0000cc;">[</span>A-Za-z0-9_<span style="word-wrap: break-word; color: #0000cc;">]</span>&#8217;。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\W 匹配任何非单词字符。等价于 &#8217;<span style="word-wrap: break-word; color: #0000cc;">[</span><span style="word-wrap: break-word; color: #0000cc;">^</span>A-Za-z0-9_<span style="word-wrap: break-word; color: #0000cc;">]</span>&#8217;。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\xn 匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\num 匹配 num，其中num是一个正整数。对所获取的匹配的引用。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为后向引用。否则，如果 n 为八进制数字&nbsp;<span style="word-wrap: break-word; color: #0000cc;">(</span>0-7<span style="word-wrap: break-word; color: #0000cc;">)</span>，则 n 为一个八进制转义值。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式，则 nm 为后向引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字&nbsp;<span style="word-wrap: break-word; color: #0000cc;">(</span>0-7<span style="word-wrap: break-word; color: #0000cc;">)</span>，则 \nm 将匹配八进制转义值 nm。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\nml 如果 n 为八进制数字&nbsp;<span style="word-wrap: break-word; color: #0000cc;">(</span>0-3<span style="word-wrap: break-word; color: #0000cc;">)</span>，且 m 和 l 均为八进制数字&nbsp;<span style="word-wrap: break-word; color: #0000cc;">(</span>0-7<span style="word-wrap: break-word; color: #0000cc;">)</span>，则匹配八进制转义值 nml。&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">\un 匹配 n，其中 n 是一个用四个十六进制数字表示的Unicode字符。</li></ol></div></div></div><img src ="http://www.cppblog.com/lynch/aggbug/196343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lynch/" target="_blank">董三</a> 2012-12-16 00:18 <a href="http://www.cppblog.com/lynch/archive/2012/12/16/196343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下使用mysql的C语言API</title><link>http://www.cppblog.com/lynch/archive/2012/12/15/196331.html</link><dc:creator>董三</dc:creator><author>董三</author><pubDate>Sat, 15 Dec 2012 14:54:00 GMT</pubDate><guid>http://www.cppblog.com/lynch/archive/2012/12/15/196331.html</guid><wfw:comment>http://www.cppblog.com/lynch/comments/196331.html</wfw:comment><comments>http://www.cppblog.com/lynch/archive/2012/12/15/196331.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lynch/comments/commentRss/196331.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lynch/services/trackbacks/196331.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/lynch/archive/2012/12/15/196331.html'>阅读全文</a><img src ="http://www.cppblog.com/lynch/aggbug/196331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lynch/" target="_blank">董三</a> 2012-12-15 22:54 <a href="http://www.cppblog.com/lynch/archive/2012/12/15/196331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让C++支持interface</title><link>http://www.cppblog.com/lynch/archive/2012/12/14/196250.html</link><dc:creator>董三</dc:creator><author>董三</author><pubDate>Fri, 14 Dec 2012 06:21:00 GMT</pubDate><guid>http://www.cppblog.com/lynch/archive/2012/12/14/196250.html</guid><wfw:comment>http://www.cppblog.com/lynch/comments/196250.html</wfw:comment><comments>http://www.cppblog.com/lynch/archive/2012/12/14/196250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lynch/comments/commentRss/196250.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lynch/services/trackbacks/196250.html</trackback:ping><description><![CDATA[<em style="word-wrap: break-word; font-family: Simsun; line-height: 18.200000762939453px;">&nbsp; &nbsp; 在正题的展开前，我们先来看一段C++代码：</em><br style="word-wrap: break-word; font-family: Simsun; line-height: 18.200000762939453px;" /><div id="codeText" style="word-wrap: break-word; border: 1px solid #dddddd; width: 645.816650390625px; overflow: auto; margin: 0px 0px 1.1em; word-break: break-all; background-color: #ffffff; font-size: 12px; line-height: normal; font-family: Consolas, monospace;"><ol start="1" style="word-wrap: break-word; margin: 0px 1px 0px 0px; color: #5c5c5c; line-height: 1.3; padding-left: 40px;"><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000ff;">class</span>&nbsp;IX&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">&nbsp; public:</span></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;virtual void Fx1<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">=</span>&nbsp;0<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;virtual void Fx2<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">=</span>&nbsp;0<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">}</span><span style="word-wrap: break-word; color: #0000cc;">;</span></li></ol></div><span style="font-family: Simsun; line-height: 18.200000762939453px;">&nbsp; &nbsp; 这是一段简单的接口声明代码：IX是用于实现接口的纯抽象基类。纯抽象基类指的是仅包括纯虚函数的基类。纯虚函数是指用=0标记的虚函数，我们往往把=0称作纯虚函数指示符。</span><div style="word-wrap: break-word; font-family: Simsun; line-height: 18.200000762939453px;">&nbsp; &nbsp; 虚基类是不能实例化的，换句话说，虚基类只是提供一个interface的功能，它并不实现这些纯虚函数。这让我们想起C#/Java语言里面的interface关键字，interface和class不同，interface仅有接口声明，而且所有的声明默认的访问权限是public而非private，这让我们可以用C++的struct来模拟interface，因为struct默认的访问权限也是public。</div><div style="word-wrap: break-word; font-family: Simsun; line-height: 18.200000762939453px;">&nbsp; &nbsp; 让我们简单的加一个约定：</div><div id="codeText" style="word-wrap: break-word; border: 1px solid #dddddd; width: 645.816650390625px; overflow: auto; margin: 0px 0px 1.1em; word-break: break-all; background-color: #ffffff; font-size: 12px; line-height: normal; font-family: Consolas, monospace;"><ol start="1" style="word-wrap: break-word; margin: 0px 1px 0px 0px; color: #5c5c5c; line-height: 1.3; padding-left: 40px;"><li style="word-wrap: break-word; padding-left: 10px;">#define interface struct</li></ol></div><span style="font-family: Simsun; line-height: 18.200000762939453px;">&nbsp; &nbsp; 使用struct的原因在于struct的成员将自动具有公有的属性，因此不需要另外在定义加上public关键字。去掉public关键字可以减少一些混乱。根据这个约定，我们开始的代码可以重新定义如下：</span><br style="word-wrap: break-word; font-family: Simsun; line-height: 18.200000762939453px;" /><div id="codeText" style="word-wrap: break-word; border: 1px solid #dddddd; width: 645.816650390625px; overflow: auto; margin: 0px 0px 1.1em; word-break: break-all; background-color: #ffffff; font-size: 12px; line-height: normal; font-family: Consolas, monospace;"><ol start="1" style="word-wrap: break-word; margin: 0px 1px 0px 0px; color: #5c5c5c; line-height: 1.3; padding-left: 40px;"><li style="word-wrap: break-word; padding-left: 10px;">interface IX&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;virtual void Fx1<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">=</span>&nbsp;0<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;virtual void Fx2<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">=</span>&nbsp;0<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">}</span><span style="word-wrap: break-word; color: #0000cc;">;</span></li></ol></div><span style="font-family: Simsun; line-height: 18.200000762939453px;">&nbsp; &nbsp;可以看到，少了public，减少了混乱。同时interface可以透露出，这不是一个普通的class，而是一个接口。</span><div style="word-wrap: break-word; font-family: Simsun; line-height: 18.200000762939453px;"></div><div style="word-wrap: break-word; font-family: Simsun; line-height: 18.200000762939453px;">&nbsp; &nbsp;下面我们模拟一个有两个接口的组件component的简单访问</div><br style="word-wrap: break-word; font-family: Simsun; line-height: 18.200000762939453px;" /><div id="codeText" style="word-wrap: break-word; border: 1px solid #dddddd; width: 645.816650390625px; overflow: auto; margin: 0px 0px 1.1em; word-break: break-all; background-color: #ffffff; font-size: 12px; line-height: normal; font-family: Consolas, monospace;"><ol start="1" style="word-wrap: break-word; margin: 0px 1px 0px 0px; color: #5c5c5c; line-height: 1.3; padding-left: 40px;"><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">/</span><span style="word-wrap: break-word; color: #0000cc;">/</span>Filename<span style="word-wrap: break-word; color: #0000cc;">:</span>&nbsp;base<span style="word-wrap: break-word; color: #0000cc;">.</span>hpp<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">#define interface struct</li></ol></div><br style="word-wrap: break-word; font-family: Simsun; line-height: 18.200000762939453px;" /><div id="codeText" style="word-wrap: break-word; border: 1px solid #dddddd; width: 645.816650390625px; overflow: auto; margin: 0px 0px 1.1em; word-break: break-all; background-color: #ffffff; font-size: 12px; line-height: normal; font-family: Consolas, monospace;"><ol start="1" style="word-wrap: break-word; margin: 0px 1px 0px 0px; color: #5c5c5c; line-height: 1.3; padding-left: 40px;"><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">/</span><span style="word-wrap: break-word; color: #0000cc;">/</span>Filename<span style="word-wrap: break-word; color: #0000cc;">:</span>&nbsp;IFace<span style="word-wrap: break-word; color: #0000cc;">.</span>cpp<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">#include<span style="word-wrap: break-word; color: #0000cc;">&lt;</span>iostream<span style="word-wrap: break-word; color: #0000cc;">&gt;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">#include<span style="word-wrap: break-word; color: #ff00ff;">"base.hpp"</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #ff00ff;"><br style="word-wrap: break-word;" /></span></li><li style="word-wrap: break-word; padding-left: 10px;">//在linux终端以红色打印pMsg字符串</li><li style="word-wrap: break-word; padding-left: 10px;">void trace<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000ff;">const</span>&nbsp;char<span style="word-wrap: break-word; color: #0000cc;">*</span>&nbsp;pMsg<span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span>&nbsp;std<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>cout<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #ff00ff;">"\033[0;31m"</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span>&nbsp;pMsg&nbsp;<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #ff00ff;">"\033[0m"</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span>std<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>endl<span style="word-wrap: break-word; color: #0000cc;">;</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">}</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">/</span><span style="word-wrap: break-word; color: #0000cc;">/</span>&nbsp;Abstract Interfaces<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">interface IX&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;virtual void Fx1<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">=</span>&nbsp;0<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;virtual void Fx2<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">=</span>&nbsp;0<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">}</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">interface IY&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;virtual void Fy1<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">=</span>&nbsp;0<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;virtual void Fy2<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">=</span>&nbsp;0<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">}</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">/</span><span style="word-wrap: break-word; color: #0000cc;">/</span>&nbsp;Interface implementation<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000ff;">class</span>&nbsp;CA&nbsp;<span style="word-wrap: break-word; color: #0000cc;">:</span>&nbsp;<span style="word-wrap: break-word; color: #0000ff;">public</span>&nbsp;IX<span style="word-wrap: break-word; color: #0000cc;">,</span><span style="word-wrap: break-word; color: #0000ff;">public</span>&nbsp;IY&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="word-wrap: break-word; color: #0000ff;">public</span><span style="word-wrap: break-word; color: #0000cc;">:</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="word-wrap: break-word; color: #0000cc;">/</span><span style="word-wrap: break-word; color: #0000cc;">/</span>&nbsp;Implement interface IX<span style="word-wrap: break-word; color: #0000cc;">.</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtual void Fx1<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span>&nbsp;std<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>cout<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span>&nbsp;<span style="word-wrap: break-word; color: #ff00ff;">"CA::Fx1"</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span>std<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>endl<span style="word-wrap: break-word; color: #0000cc;">;</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">}</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtual void Fx2<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span>&nbsp;std<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>cout<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span>&nbsp;<span style="word-wrap: break-word; color: #ff00ff;">"CA::Fx2"</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span>std<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>endl<span style="word-wrap: break-word; color: #0000cc;">;</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">}</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="word-wrap: break-word; color: #0000cc;">/</span><span style="word-wrap: break-word; color: #0000cc;">/</span>Implement interface IY<span style="word-wrap: break-word; color: #0000cc;">.</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtual void Fy1<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span>&nbsp;std<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>cout<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span>&nbsp;<span style="word-wrap: break-word; color: #ff00ff;">"CA::Fy1"</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span>std<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>endl<span style="word-wrap: break-word; color: #0000cc;">;</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">}</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtual void Fy2<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span>&nbsp;std<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>cout<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span>&nbsp;<span style="word-wrap: break-word; color: #ff00ff;">"CA::Fy2"</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">&lt;</span><span style="word-wrap: break-word; color: #0000cc;">&lt;</span>std<span style="word-wrap: break-word; color: #0000cc;">:</span><span style="word-wrap: break-word; color: #0000cc;">:</span>endl<span style="word-wrap: break-word; color: #0000cc;">;</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">}</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">}</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">/</span><span style="word-wrap: break-word; color: #0000cc;">/</span>client<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #ff0000;">int</span>&nbsp;main<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span>&nbsp;<span style="word-wrap: break-word; color: #0000cc;">{</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;trace<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #ff00ff;">"Client:Create an instance of the component."</span><span style="word-wrap: break-word; color: #0000cc;">)</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;CA&nbsp;<span style="word-wrap: break-word; color: #0000cc;">*</span>pA&nbsp;<span style="word-wrap: break-word; color: #0000cc;">=</span>&nbsp;new CA<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="word-wrap: break-word; color: #0000cc;">/</span><span style="word-wrap: break-word; color: #0000cc;">/</span><span style="word-wrap: break-word; color: #0000ff;">Get</span>&nbsp;an IX pointer<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;IX<span style="word-wrap: break-word; color: #0000cc;">*</span>&nbsp;pIX&nbsp;<span style="word-wrap: break-word; color: #0000cc;">=</span>&nbsp;pA<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;trace<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #ff00ff;">"Client: Use the IX interface."</span><span style="word-wrap: break-word; color: #0000cc;">)</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;pIX<span style="word-wrap: break-word; color: #0000cc;">-</span><span style="word-wrap: break-word; color: #0000cc;">&gt;</span>Fx1<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;pIX<span style="word-wrap: break-word; color: #0000cc;">-</span><span style="word-wrap: break-word; color: #0000cc;">&gt;</span>Fx2<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="word-wrap: break-word; color: #0000cc;">/</span><span style="word-wrap: break-word; color: #0000cc;">/</span><span style="word-wrap: break-word; color: #0000ff;">Get</span>&nbsp;an IY pointer<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;IY<span style="word-wrap: break-word; color: #0000cc;">*</span>&nbsp;pIY&nbsp;<span style="word-wrap: break-word; color: #0000cc;">=</span>&nbsp;pA<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;trace<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #ff00ff;">"Client: Use the IY interface."</span><span style="word-wrap: break-word; color: #0000cc;">)</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;pIY<span style="word-wrap: break-word; color: #0000cc;">-</span><span style="word-wrap: break-word; color: #0000cc;">&gt;</span>Fy1<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;pIY<span style="word-wrap: break-word; color: #0000cc;">-</span><span style="word-wrap: break-word; color: #0000cc;">&gt;</span>Fy2<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #0000cc;">)</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;trace<span style="word-wrap: break-word; color: #0000cc;">(</span><span style="word-wrap: break-word; color: #ff00ff;">"Client: Delete the component."</span><span style="word-wrap: break-word; color: #0000cc;">)</span><span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;<br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;">&nbsp;&nbsp;&nbsp;&nbsp;return 0<span style="word-wrap: break-word; color: #0000cc;">;</span><br style="word-wrap: break-word;" /></li><li style="word-wrap: break-word; padding-left: 10px;"><span style="word-wrap: break-word; color: #0000cc;">}</span></li></ol></div><span style="font-family: Simsun; line-height: 18.200000762939453px;">&nbsp; &nbsp; &nbsp;程序运行结果：</span><p>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/lynch/1.jpg" border="0" alt="" width="428" height="169" /></p><div style="word-wrap: break-word; font-family: Simsun; line-height: 18.200000762939453px;">&nbsp; &nbsp; &nbsp; &nbsp;<img src="file:///C:\Users\Dariuskylin\AppData\Roaming\Tencent\Users\876670110\QQ\WinTemp\RichOle\SJN}RZGTJ$DH3SFK@@(2`TO.jpg" alt="" /><p>&nbsp;</p></div><div><div> <img src="file:///C:\Users\Dariuskylin\AppData\Roaming\Tencent\Users\876670110\QQ\WinTemp\RichOle\SJN}RZGTJ$DH3SFK@@(2`TO.jpg" alt="" /></div></div><img src ="http://www.cppblog.com/lynch/aggbug/196250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lynch/" target="_blank">董三</a> 2012-12-14 14:21 <a href="http://www.cppblog.com/lynch/archive/2012/12/14/196250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++  libxml2编程基础(Ubuntu系统)</title><link>http://www.cppblog.com/lynch/archive/2012/12/14/196249.html</link><dc:creator>董三</dc:creator><author>董三</author><pubDate>Fri, 14 Dec 2012 06:08:00 GMT</pubDate><guid>http://www.cppblog.com/lynch/archive/2012/12/14/196249.html</guid><wfw:comment>http://www.cppblog.com/lynch/comments/196249.html</wfw:comment><comments>http://www.cppblog.com/lynch/archive/2012/12/14/196249.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lynch/comments/commentRss/196249.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lynch/services/trackbacks/196249.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; &nbsp; Libxml2 是一个xml c语言版的解析器，本来是为Gnome项目开发的工具，是一个基于MIT License的免费开源软件。它除了支持c语言版以外，还支持c++、PHP、Pascal、Ruby、Tcl等语言的绑定，能在Windows、Linux、Solaris、MacOsX等平台上运行。功能还是相当强大的，相信满足一般用户需求没有任何问题。&nbsp; &nbsp...&nbsp;&nbsp;<a href='http://www.cppblog.com/lynch/archive/2012/12/14/196249.html'>阅读全文</a><img src ="http://www.cppblog.com/lynch/aggbug/196249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lynch/" target="_blank">董三</a> 2012-12-14 14:08 <a href="http://www.cppblog.com/lynch/archive/2012/12/14/196249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Posix  Pthread学习资料</title><link>http://www.cppblog.com/lynch/archive/2012/11/28/195763.html</link><dc:creator>董三</dc:creator><author>董三</author><pubDate>Wed, 28 Nov 2012 05:21:00 GMT</pubDate><guid>http://www.cppblog.com/lynch/archive/2012/11/28/195763.html</guid><wfw:comment>http://www.cppblog.com/lynch/comments/195763.html</wfw:comment><comments>http://www.cppblog.com/lynch/archive/2012/11/28/195763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lynch/comments/commentRss/195763.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lynch/services/trackbacks/195763.html</trackback:ping><description><![CDATA[<div>https://computing.llnl.gov/tutorials/pthreads/<br /><div>http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html<br /><div>http://www.sourceware.org/pthreads-win32/</div></div></div><img src ="http://www.cppblog.com/lynch/aggbug/195763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lynch/" target="_blank">董三</a> 2012-11-28 13:21 <a href="http://www.cppblog.com/lynch/archive/2012/11/28/195763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式全解析</title><link>http://www.cppblog.com/lynch/archive/2011/09/30/157239.html</link><dc:creator>董三</dc:creator><author>董三</author><pubDate>Fri, 30 Sep 2011 08:53:00 GMT</pubDate><guid>http://www.cppblog.com/lynch/archive/2011/09/30/157239.html</guid><wfw:comment>http://www.cppblog.com/lynch/comments/157239.html</wfw:comment><comments>http://www.cppblog.com/lynch/archive/2011/09/30/157239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lynch/comments/commentRss/157239.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lynch/services/trackbacks/157239.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/lynch/archive/2011/09/30/157239.html'>阅读全文</a><img src ="http://www.cppblog.com/lynch/aggbug/157239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lynch/" target="_blank">董三</a> 2011-09-30 16:53 <a href="http://www.cppblog.com/lynch/archive/2011/09/30/157239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下编译安装protobuf 【ubuntu10.04+protobuf-2.4.1.tar.gz】</title><link>http://www.cppblog.com/lynch/archive/2011/07/31/152129.html</link><dc:creator>董三</dc:creator><author>董三</author><pubDate>Sun, 31 Jul 2011 02:37:00 GMT</pubDate><guid>http://www.cppblog.com/lynch/archive/2011/07/31/152129.html</guid><wfw:comment>http://www.cppblog.com/lynch/comments/152129.html</wfw:comment><comments>http://www.cppblog.com/lynch/archive/2011/07/31/152129.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lynch/comments/commentRss/152129.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lynch/services/trackbacks/152129.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/lynch/archive/2011/07/31/152129.html'>阅读全文</a><img src ="http://www.cppblog.com/lynch/aggbug/152129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lynch/" target="_blank">董三</a> 2011-07-31 10:37 <a href="http://www.cppblog.com/lynch/archive/2011/07/31/152129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>