﻿<?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++博客-嵌入式</title><link>http://www.cppblog.com/cxf20090520biancheng/</link><description>编程与应用</description><language>zh-cn</language><lastBuildDate>Mon, 06 Apr 2026 03:53:02 GMT</lastBuildDate><pubDate>Mon, 06 Apr 2026 03:53:02 GMT</pubDate><ttl>60</ttl><item><title>打印函数调用堆栈</title><link>http://www.cppblog.com/cxf20090520biancheng/archive/2012/05/18/175338.html</link><dc:creator>陈显锋</dc:creator><author>陈显锋</author><pubDate>Fri, 18 May 2012 14:39:00 GMT</pubDate><guid>http://www.cppblog.com/cxf20090520biancheng/archive/2012/05/18/175338.html</guid><wfw:comment>http://www.cppblog.com/cxf20090520biancheng/comments/175338.html</wfw:comment><comments>http://www.cppblog.com/cxf20090520biancheng/archive/2012/05/18/175338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cxf20090520biancheng/comments/commentRss/175338.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxf20090520biancheng/services/trackbacks/175338.html</trackback:ping><description><![CDATA[<font face="Tahoma">在编写Java程序时，Exception类的printStacktrace()可以打印异常堆栈，这个小工具极大的提高了调试效率；虽然不是一个好习惯，却很实用。习惯了Java编程，很希望 C/C++里也有这样的小工具可以帮助调试程序.</font> 
<div><span style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; border-collapse: separate; font: 14px Tahoma; white-space: normal; orphans: 2; color: #000000; word-spacing: 0px">经过几天查找，发现其实每个系统都提供了打印调用堆栈的函数；这些函数是系统相关，这里仅以Linux下的函数作说明.</span></div>
<div><span style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; border-collapse: separate; font: 14px Tahoma; white-space: normal; orphans: 2; color: #000000; word-spacing: 0px">Linux中共提供了三个函数用于打印调用堆栈：
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_0_111_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_111_Open_Text.style.display='none'; Codehighlighter1_0_111_Closed_Image.style.display='inline'; Codehighlighter1_0_111_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_0_111_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_111_Closed_Text.style.display='none'; Codehighlighter1_0_111_Open_Image.style.display='inline'; Codehighlighter1_0_111_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_0_111_Closed_Text">/**/</span><span id="Codehighlighter1_0_111_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;<br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;函数说明：&nbsp;取得当前函数的调用堆栈&nbsp;<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;参数：&nbsp;<br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer：用于存储函数地址的数组&nbsp;<br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size：buffer数组的长度&nbsp;<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;返回值：&nbsp;<br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;存储到数组中的函数个数&nbsp;<br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;backtrace(</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">**</span><span style="color: #000000">buffer,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;size);&nbsp;<br /></span><span style="color: #008080">10</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img id="Codehighlighter1_157_287_Open_Image" onclick="this.style.display='none'; Codehighlighter1_157_287_Open_Text.style.display='none'; Codehighlighter1_157_287_Closed_Image.style.display='inline'; Codehighlighter1_157_287_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_157_287_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_157_287_Closed_Text.style.display='none'; Codehighlighter1_157_287_Open_Image.style.display='inline'; Codehighlighter1_157_287_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_157_287_Closed_Text">/**/</span><span id="Codehighlighter1_157_287_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;<br /></span><span style="color: #008080">12</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;<br /></span><span style="color: #008080">13</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;函数说明：将一组函数地址转换为字符串&nbsp;<br /></span><span style="color: #008080">14</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;参数:&nbsp;&nbsp;<br /></span><span style="color: #008080">15</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer:&nbsp;经由backtrace得到的函数地址&nbsp;<br /></span><span style="color: #008080">16</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size:&nbsp;buffer数组的长度&nbsp;<br /></span><span style="color: #008080">17</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;返回值:&nbsp;&nbsp;<br /></span><span style="color: #008080">18</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;函数在系统中对应用字符串&nbsp;<br /></span><span style="color: #008080">19</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /></span><span style="color: #008080">20</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">**</span><span style="color: #000000">backtrace_symbols(</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">buffer,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;size);&nbsp;<br /></span><span style="color: #008080">21</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;<br /></span><span style="color: #008080">22</span><span style="color: #000000"><img id="Codehighlighter1_350_468_Open_Image" onclick="this.style.display='none'; Codehighlighter1_350_468_Open_Text.style.display='none'; Codehighlighter1_350_468_Closed_Image.style.display='inline'; Codehighlighter1_350_468_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_350_468_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_350_468_Closed_Text.style.display='none'; Codehighlighter1_350_468_Open_Image.style.display='inline'; Codehighlighter1_350_468_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_350_468_Closed_Text">/**/</span><span id="Codehighlighter1_350_468_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;<br /></span><span style="color: #008080">23</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;函数说明：将一组函数地址转换为字符串&nbsp;<br /></span><span style="color: #008080">24</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;参数:&nbsp;&nbsp;<br /></span><span style="color: #008080">25</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer:&nbsp;经由backtrace得到的函数地址&nbsp;<br /></span><span style="color: #008080">26</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size:&nbsp;buffer数组的长度&nbsp;<br /></span><span style="color: #008080">27</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd:&nbsp;输出结果文件描述符&nbsp;<br /></span><span style="color: #008080">28</span><span style="color: #008000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" /></span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /></span><span style="color: #008080">29</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;backtrace_symbols_fd(</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">buffer,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;size,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;fd);&nbsp;<br /></span><span style="color: #008080">30</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /></span><span style="color: #008080">31</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /></span><span style="color: #008080">32</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;示例程序：<br /></span><span style="color: #008080">33</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /></span><span style="color: #008080">34</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">?</span><span style="color: #000000">1</span><span style="color: #000000"><br /></span><span style="color: #008080">35</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">2</span><span style="color: #000000"><br /></span><span style="color: #008080">36</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">3</span><span style="color: #000000"><br /></span><span style="color: #008080">37</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">4</span><span style="color: #000000"><br /></span><span style="color: #008080">38</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">5</span><span style="color: #000000"><br /></span><span style="color: #008080">39</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">6</span><span style="color: #000000"><br /></span><span style="color: #008080">40</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">7</span><span style="color: #000000"><br /></span><span style="color: #008080">41</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">8</span><span style="color: #000000"><br /></span><span style="color: #008080">42</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">9</span><span style="color: #000000"><br /></span><span style="color: #008080">43</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">10</span><span style="color: #000000"><br /></span><span style="color: #008080">44</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">11</span><span style="color: #000000"><br /></span><span style="color: #008080">45</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">12</span><span style="color: #000000"><br /></span><span style="color: #008080">46</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">13</span><span style="color: #000000"><br /></span><span style="color: #008080">47</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">14</span><span style="color: #000000"><br /></span><span style="color: #008080">48</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">15</span><span style="color: #000000"><br /></span><span style="color: #008080">49</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">16</span><span style="color: #000000"><br /></span><span style="color: #008080">50</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">17</span><span style="color: #000000"><br /></span><span style="color: #008080">51</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">18</span><span style="color: #000000"><br /></span><span style="color: #008080">52</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">19</span><span style="color: #000000"><br /></span><span style="color: #008080">53</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">20</span><span style="color: #000000"><br /></span><span style="color: #008080">54</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">21</span><span style="color: #000000"><br /></span><span style="color: #008080">55</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">22</span><span style="color: #000000"><br /></span><span style="color: #008080">56</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">23</span><span style="color: #000000"><br /></span><span style="color: #008080">57</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">24</span><span style="color: #000000"><br /></span><span style="color: #008080">58</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">25</span><span style="color: #000000"><br /></span><span style="color: #008080">59</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">26</span><span style="color: #000000"><br /></span><span style="color: #008080">60</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">27</span><span style="color: #000000"><br /></span><span style="color: #008080">61</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">28</span><span style="color: #000000">&nbsp;#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">execinfo.h</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br /></span><span style="color: #008080">62</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br /></span><span style="color: #008080">63</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br /></span><span style="color: #008080">64</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">unistd.h</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br /></span><span style="color: #008080">65</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;<br /></span><span style="color: #008080">66</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;myfunc3(</span><span style="color: #0000ff">void</span><span style="color: #000000">)&nbsp;<br /></span><span style="color: #008080">67</span><span style="color: #000000"><img id="Codehighlighter1_731_981_Open_Image" onclick="this.style.display='none'; Codehighlighter1_731_981_Open_Text.style.display='none'; Codehighlighter1_731_981_Closed_Image.style.display='inline'; Codehighlighter1_731_981_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_731_981_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_731_981_Closed_Text.style.display='none'; Codehighlighter1_731_981_Open_Image.style.display='inline'; Codehighlighter1_731_981_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_731_981_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_731_981_Open_Text"><span style="color: #000000">{&nbsp;<br /></span><span style="color: #008080">68</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j,&nbsp;nptrs;&nbsp;<br /></span><span style="color: #008080">69</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;SIZE&nbsp;100&nbsp;</span><span style="color: #000000"><br /></span><span style="color: #008080">70</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">buffer[</span><span style="color: #000000">100</span><span style="color: #000000">];&nbsp;<br /></span><span style="color: #008080">71</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">**</span><span style="color: #000000">strings;&nbsp;<br /></span><span style="color: #008080">72</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;<br /></span><span style="color: #008080">73</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;nptrs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;backtrace(buffer,&nbsp;SIZE);&nbsp;<br /></span><span style="color: #008080">74</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">backtrace()&nbsp;returned&nbsp;%d&nbsp;addresses\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;nptrs);&nbsp;<br /></span><span style="color: #008080">75</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;<br /></span><span style="color: #008080">76</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;backtrace_symbols_fd(buffer,&nbsp;nptrs,&nbsp;STDOUT_FILENO);&nbsp;<br /></span><span style="color: #008080">77</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br /></span><span style="color: #008080">78</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;<br /></span><span style="color: #008080">79</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;myfunc(</span><span style="color: #0000ff">void</span><span style="color: #000000">)&nbsp;<br /></span><span style="color: #008080">80</span><span style="color: #000000"><img id="Codehighlighter1_1006_1025_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1006_1025_Open_Text.style.display='none'; Codehighlighter1_1006_1025_Closed_Image.style.display='inline'; Codehighlighter1_1006_1025_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1006_1025_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1006_1025_Closed_Text.style.display='none'; Codehighlighter1_1006_1025_Open_Image.style.display='inline'; Codehighlighter1_1006_1025_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1006_1025_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1006_1025_Open_Text"><span style="color: #000000">{&nbsp;<br /></span><span style="color: #008080">81</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;myfunc3();&nbsp;<br /></span><span style="color: #008080">82</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br /></span><span style="color: #008080">83</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;<br /></span><span style="color: #008080">84</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">argv[])&nbsp;<br /></span><span style="color: #008080">85</span><span style="color: #000000"><img id="Codehighlighter1_1065_1098_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1065_1098_Open_Text.style.display='none'; Codehighlighter1_1065_1098_Closed_Image.style.display='inline'; Codehighlighter1_1065_1098_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1065_1098_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1065_1098_Closed_Text.style.display='none'; Codehighlighter1_1065_1098_Open_Image.style.display='inline'; Codehighlighter1_1065_1098_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1065_1098_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1065_1098_Open_Text"><span style="color: #000000">{&nbsp;<br /></span><span style="color: #008080">86</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;myfunc();&nbsp;<br /></span><span style="color: #008080">87</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;<br /></span><span style="color: #008080">88</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br /></span><span style="color: #008080">89</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div></span></div><span style="font-size: 14px"><strong>程序运行结果：</strong></span> 
<div><span style="font-size: 14px">[dma@bp860-10 ~]$ g++ -rdynamic t.cpp -o t #这里的参数 -rdynamic 是必须</span></div>
<div><span style="font-size: 14px">[dma@bp860-10 ~]$ ./t</span><br /><span style="font-size: 14px">backtrace() returned 5 addresses</span><br /><span style="font-size: 14px">./t(_Z7myfunc3v+0x1c)[0x4008c4]</span><br /><span style="font-size: 14px">./t(_Z6myfuncv+0x9)[0x4008f9]</span><br /><span style="font-size: 14px">./t(main+0x14)[0x400910]</span><br /><span style="font-size: 14px">/lib64/tls/libc.so.6(__libc_start_main+0xdb)[0x3f37c1c40b]</span><br /><span style="font-size: 14px">./t(__gxx_personality_v0+0x3a)[0x40081a]</span><br /><span style="font-size: 14px">[dma@bp860-10 ~]$</span></div>
<div></div>
<div><span style="font-size: 14px">虽然现在的程序可以输出函数调用的堆栈，但是函数多了一些前缀，比如：./t(_Z7myfunc3v+0x1c)；这个问题可以通过c++fileter这个工具来解决：</span></div>
<div><span style="font-size: 14px">[dma@bp860-10 ~]$ ./t | c++filt</span><br /><span style="font-size: 14px">./t(myfunc3()+0x1c)[0x4008c4]</span><br /><span style="font-size: 14px">./t(myfunc()+0x9)[0x4008f9]</span><br /><span style="font-size: 14px">./t(main+0x14)[0x400910]</span><br /><span style="font-size: 14px">/lib64/tls/libc.so.6(__libc_start_main+0xdb)[0x3f37c1c40b]</span><br /><span style="font-size: 14px">./t(__gxx_personality_v0+0x3a)[0x40081a]</span><br /><span style="font-size: 14px">backtrace() returned 5 addresses</span></div><br /><img src ="http://www.cppblog.com/cxf20090520biancheng/aggbug/175338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxf20090520biancheng/" target="_blank">陈显锋</a> 2012-05-18 22:39 <a href="http://www.cppblog.com/cxf20090520biancheng/archive/2012/05/18/175338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux C 长跳转setjmp/longjump以及sigsetjump/siglongjump</title><link>http://www.cppblog.com/cxf20090520biancheng/archive/2012/05/14/174833.html</link><dc:creator>陈显锋</dc:creator><author>陈显锋</author><pubDate>Mon, 14 May 2012 02:28:00 GMT</pubDate><guid>http://www.cppblog.com/cxf20090520biancheng/archive/2012/05/14/174833.html</guid><wfw:comment>http://www.cppblog.com/cxf20090520biancheng/comments/174833.html</wfw:comment><comments>http://www.cppblog.com/cxf20090520biancheng/archive/2012/05/14/174833.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cxf20090520biancheng/comments/commentRss/174833.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxf20090520biancheng/services/trackbacks/174833.html</trackback:ping><description><![CDATA[<p>setjmp()和longjmp()<br />＃include&lt;setjmp.h&gt;<br />int setjmp(jmp_buf envbuf)<br />------------------------------------------------<br />------------------------------------------------<br />宏函数setjmp()在缓冲区envbuf中保存系统堆栈里的内容，供longjmp()以后使用,setjmp()必须使用头文件setjmp.h。<br />调用setjmp()宏时，返回值为0，然而longjmp()把一个变原传(一个确认用于从那里返回的整形参数int status)递给setjmp(),该值（恒不为0）就是调用longjmp()后出现的setjmp()的值void longjmp(jmp_buf envbuf,int status);<br />** 函数longjmp()使程序在最近一次调用setjmp()处重新执行。<br />&nbsp; setjmp()和longjmp()提供了一种在函数间调转的手段，必须使用头部文件setjmp.h。<br />&nbsp; 函数longjmp()通过把堆栈复位成envbuf中描述的状态进行操作，envbuf的设置是由预先调用setjmp()生成的。这样使程序的执行在setjmp()调用后的下一个语句从新开始，使计算机认为从未离开调用setjmp()的函数。从效果上看，longjmp()函数似乎&#8220;绕&#8221;过了时间和空间（内存）回到程序的原点，不必执行正常的函数返回过程。<br />&nbsp;&nbsp;&nbsp;&nbsp; 缓冲区envbuf具有&lt;setjmp.h&gt;中定义的buf_jmp类型，它必须调用longjmp()前通过调用setjmp()来设置好。<br />&nbsp;&nbsp;&nbsp; 值status变成setjmp()的返回值，由此确定长调转的来处。不允许的唯一值是0，0是程序直接调用函数setjmp()时由该函数返回的，不是间接通过执行函数longjmp()返回的。<br />&nbsp;&nbsp;&nbsp;&nbsp; longjmp()函数最常用于在一个错误发生时，从一组深层嵌套的实用程序中返回。</p>
<p><br />&nbsp;例子<br />这个例子输出&#8220;1&nbsp;&nbsp; 2&nbsp;&nbsp; 3&#8220;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">＃i&nbsp;nclude</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />＃i&nbsp;nclude&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">setjmp.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />jmp_buf&nbsp;ebuf;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f2(</span><span style="color: #0000ff">void</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br /><img id="Codehighlighter1_86_234_Open_Image" onclick="this.style.display='none'; Codehighlighter1_86_234_Open_Text.style.display='none'; Codehighlighter1_86_234_Closed_Image.style.display='inline'; Codehighlighter1_86_234_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_86_234_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_86_234_Closed_Text.style.display='none'; Codehighlighter1_86_234_Open_Image.style.display='inline'; Codehighlighter1_86_234_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_86_234_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_86_234_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />printf(</span><span style="color: #000000">"</span><span style="color: #000000">1</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">setjmp(ebuf);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(i</span><span style="color: #000000">==</span><span style="color: #000000">0</span><span style="color: #000000">)<br /><img id="Codehighlighter1_143_202_Open_Image" onclick="this.style.display='none'; Codehighlighter1_143_202_Open_Text.style.display='none'; Codehighlighter1_143_202_Closed_Image.style.display='inline'; Codehighlighter1_143_202_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_143_202_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_143_202_Closed_Text.style.display='none'; Codehighlighter1_143_202_Open_Image.style.display='inline'; Codehighlighter1_143_202_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_143_202_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_143_202_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f2();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;will&nbsp;not&nbsp;be&nbsp;printed.</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,i);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f2(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br /><img id="Codehighlighter1_250_288_Open_Image" onclick="this.style.display='none'; Codehighlighter1_250_288_Open_Text.style.display='none'; Codehighlighter1_250_288_Closed_Image.style.display='inline'; Codehighlighter1_250_288_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_250_288_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_250_288_Closed_Text.style.display='none'; Codehighlighter1_250_288_Open_Image.style.display='inline'; Codehighlighter1_250_288_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_250_288_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_250_288_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">2</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;longjmp(ebuf,</span><span style="color: #000000">3</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p><br /><br />-------------------------------------------------<br />sigsetjmp/siglongjmp<br />-------------------------------------------------<br />在信号处理函数调用之前，系统自动阻塞当前被处理的信号以防止接下来发生的该类信号中断信号处理函数，<br />这使得使用longjmp从信号处理函数返回时，出现是否恢复信号掩码的问题。有些系统恢复，有些系统不恢复，<br />POSIX.1对此没有指示，而是提供了另外两个函数sigsetjmp和siglongjmp。当从信号处理函数跳出时，应该使用siglongjmp函数。</p>
<p>&nbsp;&nbsp;&nbsp; int sigsetjmp( sigjmp_buf * env, int savemask );</p>
<p>&nbsp;&nbsp;&nbsp; void siglongjmp ( sigjmp_buf * env, int val );</p>
<p>&nbsp;&nbsp;&nbsp; 当调用sigsetjmp时，参数savemask指示是否将当前进程的信号掩码存储在env中；</p>
<p>&nbsp;&nbsp;&nbsp; 在调用siglongjmp时，若env中有之前存储的信号掩码，则恢复进程的信号掩码。</p>
<p>&nbsp;&nbsp;&nbsp; 在信号处理函数中调用siglongjmp时，需要特殊的保护方案：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通常在sigsetjmp调用之前部署信号处理函数，若在sigsetjmp初始化sigjmp_buf之前，信号发生，信号处理函数中的siglongjmp被调用，这将会出错。需要提供一种保护机制，保证在sigsetjmp完成之前，信号处理函数中的siglongjmp不会被调用。ISO C提供了一种sig_automic_t可以原子的写。全局定义一个sig_atomic_t类型的数据canjmp，初始值为0，在sigsetjmp完成之后将其值修改为1，在信号处理函数里面当且仅当canjmp不为0时，才回调用siglongjmp，这样就确保了在sigsetjmp调用之后才会对siglongjmp调用。通常也将canjmp限定为volatile（它被两个线程同时访问：主线程和信号处理函数）。</p>
<p><br />longjmp有一个问题，当捕捉到一个信号时，进入信号捕捉函数，此时当前信号被自动的加到进程的信号屏蔽字中。这阻止了后来产生的这种信号中断该信号处理程序。</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">assert.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">signal.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">setjmp.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />sigjmp_buf&nbsp;main_env;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;trigger_cnt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;segv_cnt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />segv_trigger(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_195_296_Open_Image" onclick="this.style.display='none'; Codehighlighter1_195_296_Open_Text.style.display='none'; Codehighlighter1_195_296_Closed_Image.style.display='inline'; Codehighlighter1_195_296_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_195_296_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_195_296_Closed_Text.style.display='none'; Codehighlighter1_195_296_Open_Image.style.display='inline'; Codehighlighter1_195_296_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_195_296_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_195_296_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">SIGSEGV&nbsp;tigger&nbsp;%d.\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;trigger_cnt</span><span style="color: #000000">++</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />segv_handler(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;signum)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_332_475_Open_Image" onclick="this.style.display='none'; Codehighlighter1_332_475_Open_Text.style.display='none'; Codehighlighter1_332_475_Closed_Image.style.display='inline'; Codehighlighter1_332_475_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_332_475_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_332_475_Closed_Text.style.display='none'; Codehighlighter1_332_475_Open_Image.style.display='inline'; Codehighlighter1_332_475_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_332_475_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_332_475_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert(signum&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;SIGSEGV);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">SIGSEGV&nbsp;has&nbsp;been&nbsp;catched&nbsp;%d&nbsp;times.\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;segv_cnt</span><span style="color: #000000">++</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;siglongjmp(main_env,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />main(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_496_1137_Open_Image" onclick="this.style.display='none'; Codehighlighter1_496_1137_Open_Text.style.display='none'; Codehighlighter1_496_1137_Closed_Image.style.display='inline'; Codehighlighter1_496_1137_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_496_1137_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_496_1137_Closed_Text.style.display='none'; Codehighlighter1_496_1137_Open_Image.style.display='inline'; Codehighlighter1_496_1137_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_496_1137_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_496_1137_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;sigaction&nbsp;segv_act;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">volatile</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;longjmp_cnt;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;segv_act.sa_handler&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;segv_handler;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sigemptyset(</span><span style="color: #000000">&amp;</span><span style="color: #000000">segv_act.sa_mask);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;segv_act.sa_flags&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img id="Codehighlighter1_739_825_Open_Image" onclick="this.style.display='none'; Codehighlighter1_739_825_Open_Text.style.display='none'; Codehighlighter1_739_825_Closed_Image.style.display='inline'; Codehighlighter1_739_825_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_739_825_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_739_825_Closed_Text.style.display='none'; Codehighlighter1_739_825_Open_Image.style.display='inline'; Codehighlighter1_739_825_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(sigaction(SIGSEGV,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">segv_act,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_739_825_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_739_825_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000">"</span><span style="color: #000000">sigaction</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;longjmp_cnt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img id="Codehighlighter1_897_1051_Open_Image" onclick="this.style.display='none'; Codehighlighter1_897_1051_Open_Text.style.display='none'; Codehighlighter1_897_1051_Closed_Image.style.display='inline'; Codehighlighter1_897_1051_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_897_1051_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_897_1051_Closed_Text.style.display='none'; Codehighlighter1_897_1051_Open_Image.style.display='inline'; Codehighlighter1_897_1051_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(sigsetjmp(main_env,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_897_1051_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_897_1051_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Long&nbsp;jump&nbsp;%d.\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;longjmp_cnt</span><span style="color: #000000">++</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(longjmp_cnt&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_SUCCESS);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;segv_trigger();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img id="Codehighlighter1_1089_1105_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1089_1105_Open_Text.style.display='none'; Codehighlighter1_1089_1105_Closed_Image.style.display='inline'; Codehighlighter1_1089_1105_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1089_1105_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1089_1105_Closed_Text.style.display='none'; Codehighlighter1_1089_1105_Open_Image.style.display='inline'; Codehighlighter1_1089_1105_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1089_1105_Closed_Text">/**/</span><span id="Codehighlighter1_1089_1105_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;UNREACHABLE&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_SUCCESS);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p><br />&nbsp;</p><img src ="http://www.cppblog.com/cxf20090520biancheng/aggbug/174833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxf20090520biancheng/" target="_blank">陈显锋</a> 2012-05-14 10:28 <a href="http://www.cppblog.com/cxf20090520biancheng/archive/2012/05/14/174833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打印函数调用堆栈并具体位置</title><link>http://www.cppblog.com/cxf20090520biancheng/archive/2012/04/23/172464.html</link><dc:creator>陈显锋</dc:creator><author>陈显锋</author><pubDate>Mon, 23 Apr 2012 08:34:00 GMT</pubDate><guid>http://www.cppblog.com/cxf20090520biancheng/archive/2012/04/23/172464.html</guid><wfw:comment>http://www.cppblog.com/cxf20090520biancheng/comments/172464.html</wfw:comment><comments>http://www.cppblog.com/cxf20090520biancheng/archive/2012/04/23/172464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cxf20090520biancheng/comments/commentRss/172464.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxf20090520biancheng/services/trackbacks/172464.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">execinfo.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;print_trace(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;funcC()<br /></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;打印调用堆栈，看看谁调用了本函数&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;print_trace();<br /></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">}<br /></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;funcB()<br /></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;{<br /></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;funcC();<br /></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;}<br /></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;funcA()<br /></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;{<br /></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;funcB();<br /></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;}<br /></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main&nbsp;(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br /></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;{<br /></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;funcA();<br /></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;}<br /></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;print_trace(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br /></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;{<br /></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;<br /></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;MAX_CALLSTACK_DEPTH&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">32</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;需要打印堆栈的最大深度&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">traceback[MAX_CALLSTACK_DEPTH];&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;用来存储调用堆栈中的地址&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;利用&nbsp;addr2line&nbsp;命令可以打印出一个函数地址所在的源代码位置<br /></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;调用格式为：&nbsp;addr2line&nbsp;-f&nbsp;-e&nbsp;/tmp/a.out&nbsp;0x400618<br /></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;使用前，源代码编译时要加上&nbsp;-rdynamic&nbsp;-g&nbsp;选项<br /></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;cmd[</span><span style="color: #000000;">512</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">addr2line&nbsp;-f&nbsp;-e&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">prog&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cmd&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;strlen(cmd);<br /></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;得到当前可执行程序的路径和文件名&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;r&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;readlink(</span><span style="color: #000000;">"</span><span style="color: #000000;">/proc/self/exe</span><span style="color: #000000;">"</span><span style="color: #000000;">,prog,</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(cmd)</span><span style="color: #000000;">-</span><span style="color: #000000;">(prog</span><span style="color: #000000;">-</span><span style="color: #000000;">cmd)</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;popen会fork出一个子进程来调用/bin/sh,&nbsp;并执行cmd字符串中的命令，<br /></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;同时，会创建一个管道，由于参数是'w',&nbsp;管道将与标准输入相连接，<br /></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;并返回一个FILE的指针fp指向所创建的管道，以后只要用fp往管理里写任何内容，<br /></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;内容都会被送往到标准输入，<br /></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;在下面的代码中，会将调用堆栈中的函数地址写入管道中，<br /></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;addr2line程序会从标准输入中得到该函数地址，然后根据地址打印出源代码位置和函数名。<br /></span><span style="color: #008080;">41</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /></span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;FILE&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">fp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;popen(cmd,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">w</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;得到当前调用堆栈中的所有函数地址，放到traceback数组中&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /></span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;depth&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;backtrace(traceback,&nbsp;MAX_CALLSTACK_DEPTH);<br /></span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;depth;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br /></span><span style="color: #008080;">46</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080;">47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;得到调用堆栈中的函数的地址，然后将地址发送给&nbsp;addr2line&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /></span><span style="color: #008080;">48</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(fp,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">%p/n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;traceback[i]);<br /></span><span style="color: #008080;">49</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;addr2line&nbsp;命令在收到地址后，会将函数地址所在的源代码位置打印到标准输出&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /></span><span style="color: #008080;">50</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">51</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);<br /></span><span style="color: #008080;">52</span>&nbsp;<span style="color: #000000;">}</span></div><img src ="http://www.cppblog.com/cxf20090520biancheng/aggbug/172464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxf20090520biancheng/" target="_blank">陈显锋</a> 2012-04-23 16:34 <a href="http://www.cppblog.com/cxf20090520biancheng/archive/2012/04/23/172464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>函数声明  conflicting types</title><link>http://www.cppblog.com/cxf20090520biancheng/archive/2012/04/20/172158.html</link><dc:creator>陈显锋</dc:creator><author>陈显锋</author><pubDate>Fri, 20 Apr 2012 09:08:00 GMT</pubDate><guid>http://www.cppblog.com/cxf20090520biancheng/archive/2012/04/20/172158.html</guid><wfw:comment>http://www.cppblog.com/cxf20090520biancheng/comments/172158.html</wfw:comment><comments>http://www.cppblog.com/cxf20090520biancheng/archive/2012/04/20/172158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cxf20090520biancheng/comments/commentRss/172158.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxf20090520biancheng/services/trackbacks/172158.html</trackback:ping><description><![CDATA[今天编写代码，函数声明出现<div>error：conflicting types<br /><br />百思不得其解<br />查阅资料得： 结构体必须放在函数声明之前。。。晕倒！！</div><img src ="http://www.cppblog.com/cxf20090520biancheng/aggbug/172158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxf20090520biancheng/" target="_blank">陈显锋</a> 2012-04-20 17:08 <a href="http://www.cppblog.com/cxf20090520biancheng/archive/2012/04/20/172158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对齐方式demo</title><link>http://www.cppblog.com/cxf20090520biancheng/archive/2012/04/15/171464.html</link><dc:creator>陈显锋</dc:creator><author>陈显锋</author><pubDate>Sun, 15 Apr 2012 06:18:00 GMT</pubDate><guid>http://www.cppblog.com/cxf20090520biancheng/archive/2012/04/15/171464.html</guid><wfw:comment>http://www.cppblog.com/cxf20090520biancheng/comments/171464.html</wfw:comment><comments>http://www.cppblog.com/cxf20090520biancheng/archive/2012/04/15/171464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cxf20090520biancheng/comments/commentRss/171464.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxf20090520biancheng/services/trackbacks/171464.html</trackback:ping><description><![CDATA[<div>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_20_290_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_290_Open_Text.style.display='none'; Codehighlighter1_20_290_Closed_Image.style.display='inline'; Codehighlighter1_20_290_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_20_290_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_20_290_Closed_Text.style.display='none'; Codehighlighter1_20_290_Open_Image.style.display='inline'; Codehighlighter1_20_290_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_20_290_Closed_Text">/**/</span><span id="Codehighlighter1_20_290_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;对齐方式<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;*&nbsp;&nbsp;#pragma&nbsp;pack(push)&nbsp;&nbsp;&nbsp;//保存当前对齐方式，未保存时，保存的为系统定义的对齐方式<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;*&nbsp;&nbsp;#pragma&nbsp;pack(int&nbsp;n)&nbsp;&nbsp;//以n字节对齐<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;*&nbsp;&nbsp;#pragma&nbsp;pack(pop)&nbsp;&nbsp;&nbsp;&nbsp;//恢复保存的对齐方式<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;*&nbsp;&nbsp;#prama&nbsp;pack()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//恢复系统定义的对齐方式&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;*&nbsp;&nbsp;#pragma&nbsp;pack(int&nbsp;n)&nbsp;作用范围为到下一个#pragma&nbsp;pack(int&nbsp;n)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;*&nbsp;&nbsp;良好的编程习惯是先保存当前对齐方式，设定完后，恢复保存的对齐方式<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;SIZE_ALINE&nbsp;&nbsp;&nbsp;&nbsp;4</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;ALINE(size)&nbsp;&nbsp;&nbsp;(size&nbsp;+&nbsp;(SIZE_ALINE-1))&amp;~(SIZE_ALINE-1)</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#pragma&nbsp;pack(</span><span style="color: #000000">2</span><span style="color: #000000">)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#pragma&nbsp;pack(push)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;&nbsp;AA<br /><img id="Codehighlighter1_426_458_Open_Image" onclick="this.style.display='none'; Codehighlighter1_426_458_Open_Text.style.display='none'; Codehighlighter1_426_458_Closed_Image.style.display='inline'; Codehighlighter1_426_458_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_426_458_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_426_458_Closed_Text.style.display='none'; Codehighlighter1_426_458_Open_Image.style.display='inline'; Codehighlighter1_426_458_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_426_458_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_426_458_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;a;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;&nbsp;b;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;c;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#pragma&nbsp;pack(</span><span style="color: #000000">1</span><span style="color: #000000">)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;&nbsp;BB<br /><img id="Codehighlighter1_489_521_Open_Image" onclick="this.style.display='none'; Codehighlighter1_489_521_Open_Text.style.display='none'; Codehighlighter1_489_521_Closed_Image.style.display='inline'; Codehighlighter1_489_521_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_489_521_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_489_521_Closed_Text.style.display='none'; Codehighlighter1_489_521_Open_Image.style.display='inline'; Codehighlighter1_489_521_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_489_521_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_489_521_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;a;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;&nbsp;b;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;c;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#pragma&nbsp;pack()<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;&nbsp;CC<br /><img id="Codehighlighter1_551_583_Open_Image" onclick="this.style.display='none'; Codehighlighter1_551_583_Open_Text.style.display='none'; Codehighlighter1_551_583_Closed_Image.style.display='inline'; Codehighlighter1_551_583_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_551_583_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_551_583_Closed_Text.style.display='none'; Codehighlighter1_551_583_Open_Image.style.display='inline'; Codehighlighter1_551_583_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_551_583_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_551_583_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;a;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;&nbsp;b;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;c;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br /><img id="Codehighlighter1_598_701_Open_Image" onclick="this.style.display='none'; Codehighlighter1_598_701_Open_Text.style.display='none'; Codehighlighter1_598_701_Closed_Image.style.display='inline'; Codehighlighter1_598_701_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_598_701_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_598_701_Closed_Text.style.display='none'; Codehighlighter1_598_701_Open_Image.style.display='inline'; Codehighlighter1_598_701_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_598_701_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_598_701_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(AA));<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(BB));<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(CC));<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div></div><img src ="http://www.cppblog.com/cxf20090520biancheng/aggbug/171464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxf20090520biancheng/" target="_blank">陈显锋</a> 2012-04-15 14:18 <a href="http://www.cppblog.com/cxf20090520biancheng/archive/2012/04/15/171464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MTD</title><link>http://www.cppblog.com/cxf20090520biancheng/archive/2012/03/25/168894.html</link><dc:creator>陈显锋</dc:creator><author>陈显锋</author><pubDate>Sun, 25 Mar 2012 07:11:00 GMT</pubDate><guid>http://www.cppblog.com/cxf20090520biancheng/archive/2012/03/25/168894.html</guid><wfw:comment>http://www.cppblog.com/cxf20090520biancheng/comments/168894.html</wfw:comment><comments>http://www.cppblog.com/cxf20090520biancheng/archive/2012/03/25/168894.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cxf20090520biancheng/comments/commentRss/168894.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxf20090520biancheng/services/trackbacks/168894.html</trackback:ping><description><![CDATA[<div class="card-summary-content">
<p>MTD(memory technology device内存技术设备)是用于访问memory设备（ROM、flash）的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单，为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有<a href="http://baike.baidu.com/view/60376.htm" target="_blank">源代码</a>在/drivers/mtd子目录下。CFI接口的MTD设备分为四层（从设备节点直到底层硬件驱动），这四层从上到下依次是：设备节点、MTD设备层、MTD原始设备层和硬件驱动层。</p></div>
<div class="clear"></div>
<div id="lemmaContent-0" class="lemma-main-content">　　<strong>MTD原始设备描述</strong> 
<div class="spctrl"></div>　　所有组成<a href="http://baike.baidu.com/view/1741385.htm" target="_blank">MTD</a>原始设备的<a href="http://baike.baidu.com/view/7641.htm" target="_blank">Flash</a>芯片必须是同类型（无论是interleave还是地址相连），在描述MTD原始设备<a href="http://baike.baidu.com/view/9900.htm" target="_blank">数据结构</a>中采用同一结构描述组成Flash芯片。每个MTD原始设备有一个mtd_info结构，其中的priv指针指向一个map_info结构，map_info结构中的fldrv_priv指向一个cfi_private结构，cfi_private结构的cfiq指针指向一个cfi_ident结构，<a href="http://baike.baidu.com/view/382859.htm" target="_blank">chips</a>指针指向一个flchip结构的<a href="http://baike.baidu.com/view/209670.htm" target="_blank">数组</a>。其中mtd_info、map_info和cfi_private结构用于描述MTD原始设备，因为组成MTD原始设备的<a href="http://baike.baidu.com/view/64532.htm" target="_blank">NOR</a>型Flash相同，cfi_ident结构用于描述Flash芯片信息；而flchip结构用于描述每个Flash芯片专有信息。 
<div class="spctrl"></div>　　根文件系统 
<div class="spctrl"></div>　　文件系统 
<div class="spctrl"></div>　　字符设备节点 
<div class="spctrl"></div>　　MTD字符设备 
<div class="spctrl"></div>　　MTD块设备 
<div class="spctrl"></div>　　MTD原始设备 
<div class="spctrl"></div>　　FLASH硬件驱动 
<div class="spctrl"></div>　　块设备节点 
<div class="spctrl"></div>　　一、Flash硬件驱动层：硬件驱动层负责在init时驱动Flash硬件，Linux MTD设备的NOR　Flash芯片驱动遵循CFI接口标准，其驱动程序位于drivers/mtd/chips子目录下。NAND型Flash的驱动程序则位于/drivers/mtd/nand子目录下 
<div class="spctrl"></div>　　二、MTD原始设备：原始设备层有两部分组成，一部分是MTD原始设备的通用代码，另一部分是各个特定的Flash的数据，例如分区。 
<div class="spctrl"></div>　　用于描述MTD原始设备的数据结构是mtd_info，这其中定义了大量的关于MTD的数据和操作函数。mtd_table（mtdcore.c）则是所有MTD原始设备的列表，mtd_part（mtd_part.c）是用于表示MTD原始设备分区的结构，其中包含了mtd_info，因为每一个分区都是被看成一个MTD原始设备加在mtd_table中的，mtd_part.mtd_info中的大部分数据都从该分区的主分区mtd_part-&gt;master中获得。 
<div class="spctrl"></div>　　在drivers/mtd/maps/子目录下存放的是特定的flash的数据，每一个文件都描述了一块板子上的flash。其中调用add_mtd_device()、del_mtd_device()建立/删除 mtd_info结构并将其加入/删除mtd_table（或者调用add_mtd_partition()、del_mtd_partition() （mtdpart.c）建立/删除mtd_part结构并将mtd_part.mtd_info加入/删除mtd_table 中）。 
<div class="spctrl"></div>　　三、MTD设备层：基于MTD原始设备，<a href="http://baike.baidu.com/view/96045.htm" target="_blank">linux系统</a>可以定义出MTD的块设备（主设备号31）和字符设备（设备号90）。MTD字符设备的定义在mtdchar.c中实现，通过注册一系列file operation函数（lseek、open、close、read、write）。MTD块设备则是定义了一个描述MTD块设备的结构 mtdblk_dev，并声明了一个名为mtdblks的<a href="http://baike.baidu.com/view/2072881.htm" target="_blank">指针数组</a>，这数组中的每一个mtdblk_dev和mtd_table中的每一个 mtd_info一一对应。 
<div class="spctrl"></div>　　四、设备节点：通过mknod在/dev子目录下建立MTD字符设备节点（主设备号为90）和MTD块设备节点（主设备号为31），通过访问此设备节点即可访问MTD字符设备和块设备。 
<div class="spctrl"></div>　　五、根文件系统：在Bootloader中将JFFS（或JFFS2）的文件系统映像jffs.image（或jffs2.img）烧到flash的某一个分区中，在/arch/arm/mach-your/arch.c文件的 your_fixup函数中将该分区作为根文件系统挂载。 
<div class="spctrl"></div>　　六、文件系统：内核启动后，通过mount 命令可以将flash中的其余分区作为文件系统挂载到mountpoint上。 
<div class="spctrl"></div>　　设备层和原始设备层的函数调用关系（红色部分需要我们实现）： 
<div class="spctrl"></div>　　一个MTD原始设备可以通过mtd_part分割成数个MTD原始设备注册进 mtd_table，mtd_table中的每个MTD原始设备都可以被注册成一个MTD设备，其中字符设备的主设备号为90，次设备号为0、2、4、 6&#8230;（奇数次设备号为只读设备），块设备的主设备号为31，次设备号为0、1、2、3&#8230; 
<div class="spctrl"></div>　　mtd_notifier mtd_notifier 
<div class="spctrl"></div>　　字符设备 mtd_fops 块设备 mtd_fops 
<div class="spctrl"></div>　　（mtdchar.c） （mtdblock.c） mtdblks 
<div class="spctrl"></div>　　设备层 
<div class="spctrl"></div>　　register_mtd_user() 
<div class="spctrl"></div>　　get_mtd_device() 
<div class="spctrl"></div>　　unregister_mtd_user() 
<div class="spctrl"></div>　　put_mtd_device() 
<div class="spctrl"></div>　　erase_info 
<div class="spctrl"></div>　　mtd_notifiers 
<div class="spctrl"></div>　　mtd_table 
<div class="spctrl"></div>　　mtd_info 
<div class="spctrl"></div>　　mtd_part 
<div class="spctrl"></div>　　（mtdcore.c） 
<div class="spctrl"></div>　　（mtdpart.c） 
<div class="spctrl"></div>　　Your Flash 
<div class="spctrl"></div>　　（your-flash.c） 
<div class="spctrl"></div>　　add_mtd_partitions() 
<div class="spctrl"></div>　　del_mtd_partitions() 
<div class="spctrl"></div>　　原始设备层 add_mtd_device() 
<div class="spctrl"></div>　　del_mtd_device() 
<div class="spctrl"></div>　　mtd_partition 
<div class="spctrl"></div>　　NOR型Flash芯片驱动与MTD原始设备 
<div class="spctrl"></div>　　所有的NOR型Flash的驱动（探测probe）程序都放在 drivers/mtd/chips下，一个MTD原始设备可以由一块或者数块相同的Flash芯片组成。假设由4块devicetype为x8的 Flash，每块大小为8M，interleave为2，起始地址为0x01000000，地址相连，则构成一个MTD原始设备（0x01000000-0x03000000），其中两块interleave成一个chip，其地址从0x01000000到0x02000000，另两块interleave成一个chip，其地址从0x02000000到0x03000000。 
<div class="spctrl"></div>　　请注意，所有组成一个MTD原始设备的Flash芯片必须是同类型的（无论是interleave还是地址相连），在描述MTD原始设备的数据结构中也只是采用了同一个结构来描述组成它的Flash芯片。 
<div class="spctrl"></div>　　0x03000000 
<div class="spctrl"></div>　　0x02000000 
<div class="spctrl"></div>　　0x01000000 
<div class="spctrl"></div>　　每个MTD原始设备都有一个mtd_info 结构，其中的priv指针指向一个map_info结构，map_info结构中的fldrv_priv指向一个cfi_private结构，cfi_private结构的cfiq指针指向一个cfi_ident结构，chips指针指向一个flchip结构的数组。其中mtd_info、 map_info和cfi_private结构用于描述MTD原始设备；因为组成MTD原始设备的NOR型Flash相同，cfi_ident结构用于描述Flash芯片的信息；而flchip结构用于描述每个Flash芯片的专有信息（比如说起始地址） </div><img src ="http://www.cppblog.com/cxf20090520biancheng/aggbug/168894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxf20090520biancheng/" target="_blank">陈显锋</a> 2012-03-25 15:11 <a href="http://www.cppblog.com/cxf20090520biancheng/archive/2012/03/25/168894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS 快捷键</title><link>http://www.cppblog.com/cxf20090520biancheng/archive/2012/03/23/168746.html</link><dc:creator>陈显锋</dc:creator><author>陈显锋</author><pubDate>Fri, 23 Mar 2012 13:04:00 GMT</pubDate><guid>http://www.cppblog.com/cxf20090520biancheng/archive/2012/03/23/168746.html</guid><description><![CDATA[<p><strong>vs2005常用快捷键</strong></p>
<p><span style="color: #800000">my performace:<img height="20" src="http://www.cppblog.com/Emoticons/QQ/cool.gif" width="20" border="0"  alt="" /></span><br /><span style="color: #0000ff">Shift+ALT+ENTER</span><br /><span style="color: #0000ff">CTRL+I</span><br /><span style="color: #0000ff">CTRL+SHIFT+I</span><br /><span style="color: #0000ff">CTRL+L</span><br /><span style="color: #0000ff">CTRL+M,M</span><br /><span style="color: #0000ff">CTRL+G</span></p> <img src ="http://www.cppblog.com/cxf20090520biancheng/aggbug/168746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxf20090520biancheng/" target="_blank">陈显锋</a> 2012-03-23 21:04 <a href="http://www.cppblog.com/cxf20090520biancheng/archive/2012/03/23/168746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>树的非递归算法（第一次用手写的代码）</title><link>http://www.cppblog.com/cxf20090520biancheng/archive/2010/04/21/113162.html</link><dc:creator>陈显锋</dc:creator><author>陈显锋</author><pubDate>Wed, 21 Apr 2010 13:01:00 GMT</pubDate><guid>http://www.cppblog.com/cxf20090520biancheng/archive/2010/04/21/113162.html</guid><wfw:comment>http://www.cppblog.com/cxf20090520biancheng/comments/113162.html</wfw:comment><comments>http://www.cppblog.com/cxf20090520biancheng/archive/2010/04/21/113162.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cxf20090520biancheng/comments/commentRss/113162.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxf20090520biancheng/services/trackbacks/113162.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#ifndef&nbsp;BINARY_TREE<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;BINARY_TREE</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stack</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;BinaryTree;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;BTNode<br><img id=Codehighlighter1_163_453_Open_Image onclick="this.style.display='none'; Codehighlighter1_163_453_Open_Text.style.display='none'; Codehighlighter1_163_453_Closed_Image.style.display='inline'; Codehighlighter1_163_453_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_163_453_Closed_Image onclick="this.style.display='none'; Codehighlighter1_163_453_Closed_Text.style.display='none'; Codehighlighter1_163_453_Open_Image.style.display='inline'; Codehighlighter1_163_453_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_163_453_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_163_453_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_182_202_Open_Image onclick="this.style.display='none'; Codehighlighter1_182_202_Open_Text.style.display='none'; Codehighlighter1_182_202_Closed_Image.style.display='inline'; Codehighlighter1_182_202_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_182_202_Closed_Image onclick="this.style.display='none'; Codehighlighter1_182_202_Closed_Text.style.display='none'; Codehighlighter1_182_202_Open_Image.style.display='inline'; Codehighlighter1_182_202_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;BTNode()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_182_202_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_182_202_Open_Text><span style="COLOR: #000000">{lChild</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">rChild</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;BTNode(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">x)<br><img id=Codehighlighter1_224_262_Open_Image onclick="this.style.display='none'; Codehighlighter1_224_262_Open_Text.style.display='none'; Codehighlighter1_224_262_Closed_Image.style.display='inline'; Codehighlighter1_224_262_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_224_262_Closed_Image onclick="this.style.display='none'; Codehighlighter1_224_262_Closed_Text.style.display='none'; Codehighlighter1_224_262_Open_Image.style.display='inline'; Codehighlighter1_224_262_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_224_262_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_224_262_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">x;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lChild</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">rChild</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;BTNode(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;x,BTNode</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;*</span><span style="COLOR: #000000">l,BTNode</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;*</span><span style="COLOR: #000000">&nbsp;r)<br><img id=Codehighlighter1_310_344_Open_Image onclick="this.style.display='none'; Codehighlighter1_310_344_Open_Text.style.display='none'; Codehighlighter1_310_344_Closed_Image.style.display='inline'; Codehighlighter1_310_344_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_310_344_Closed_Image onclick="this.style.display='none'; Codehighlighter1_310_344_Closed_Text.style.display='none'; Codehighlighter1_310_344_Open_Image.style.display='inline'; Codehighlighter1_310_344_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_310_344_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_310_344_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">x;lChild</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">l;rChild</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">r;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;BinaryTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;element;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;BTNode</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;*</span><span style="COLOR: #000000">&nbsp;lChild,</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">rChild;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">BTNode</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;*&gt;</span><span style="COLOR: #000000">&nbsp;s;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">stack</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">BTNode</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;*&gt;</span><span style="COLOR: #000000">&nbsp;BTNode</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::s;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;BinaryTree<br><img id=Codehighlighter1_542_880_Open_Image onclick="this.style.display='none'; Codehighlighter1_542_880_Open_Text.style.display='none'; Codehighlighter1_542_880_Closed_Image.style.display='inline'; Codehighlighter1_542_880_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_542_880_Closed_Image onclick="this.style.display='none'; Codehighlighter1_542_880_Closed_Text.style.display='none'; Codehighlighter1_542_880_Open_Image.style.display='inline'; Codehighlighter1_542_880_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_542_880_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_542_880_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_565_576_Open_Image onclick="this.style.display='none'; Codehighlighter1_565_576_Open_Text.style.display='none'; Codehighlighter1_565_576_Closed_Image.style.display='inline'; Codehighlighter1_565_576_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_565_576_Closed_Image onclick="this.style.display='none'; Codehighlighter1_565_576_Closed_Text.style.display='none'; Codehighlighter1_565_576_Open_Image.style.display='inline'; Codehighlighter1_565_576_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;BinaryTree()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_565_576_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_565_576_Open_Text><span style="COLOR: #000000">{root</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_598_616_Open_Image onclick="this.style.display='none'; Codehighlighter1_598_616_Open_Text.style.display='none'; Codehighlighter1_598_616_Closed_Image.style.display='inline'; Codehighlighter1_598_616_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_598_616_Closed_Image onclick="this.style.display='none'; Codehighlighter1_598_616_Closed_Text.style.display='none'; Codehighlighter1_598_616_Open_Image.style.display='inline'; Codehighlighter1_598_616_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;IsEmpty()</span><span style="COLOR: #0000ff">const</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_598_616_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_598_616_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;root</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Clear();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;Root(T</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;x)</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;MakeTree(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;x,BinaryTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;left,BinaryTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;right);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;BreakTree(T</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;x,BinaryTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;left,BinaryTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;right);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;PreOrder();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;BTNode</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;*</span><span style="COLOR: #000000">&nbsp;root;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;PreOrder(BTNode</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;*</span><span style="COLOR: #000000">current);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">BINARY_TREE</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;BinaryTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::Root(T&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">x)</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_959_1026_Open_Image onclick="this.style.display='none'; Codehighlighter1_959_1026_Open_Text.style.display='none'; Codehighlighter1_959_1026_Closed_Image.style.display='inline'; Codehighlighter1_959_1026_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_959_1026_Closed_Image onclick="this.style.display='none'; Codehighlighter1_959_1026_Closed_Text.style.display='none'; Codehighlighter1_959_1026_Open_Image.style.display='inline'; Codehighlighter1_959_1026_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_959_1026_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_959_1026_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_970_1004_Open_Image onclick="this.style.display='none'; Codehighlighter1_970_1004_Open_Text.style.display='none'; Codehighlighter1_970_1004_Closed_Image.style.display='inline'; Codehighlighter1_970_1004_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_970_1004_Closed_Image onclick="this.style.display='none'; Codehighlighter1_970_1004_Closed_Text.style.display='none'; Codehighlighter1_970_1004_Open_Image.style.display='inline'; Codehighlighter1_970_1004_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(root)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_970_1004_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_970_1004_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">root</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">element;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;BinaryTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::MakeTree(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;x,BinaryTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;left,BinaryTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;right)<br><img id=Codehighlighter1_1129_1237_Open_Image onclick="this.style.display='none'; Codehighlighter1_1129_1237_Open_Text.style.display='none'; Codehighlighter1_1129_1237_Closed_Image.style.display='inline'; Codehighlighter1_1129_1237_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1129_1237_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1129_1237_Closed_Text.style.display='none'; Codehighlighter1_1129_1237_Open_Image.style.display='inline'; Codehighlighter1_1129_1237_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1129_1237_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1129_1237_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(root</span><span style="COLOR: #000000">||&amp;</span><span style="COLOR: #000000">left</span><span style="COLOR: #000000">==&amp;</span><span style="COLOR: #000000">right)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;root</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;BTNode</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(x,left.root,right.root);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;left.root</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">right.root</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;BinaryTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::BreakTree(T</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;x,BinaryTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;left,BinaryTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;right)<br><img id=Codehighlighter1_1335_1486_Open_Image onclick="this.style.display='none'; Codehighlighter1_1335_1486_Open_Text.style.display='none'; Codehighlighter1_1335_1486_Closed_Image.style.display='inline'; Codehighlighter1_1335_1486_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1335_1486_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1335_1486_Closed_Text.style.display='none'; Codehighlighter1_1335_1486_Open_Image.style.display='inline'; Codehighlighter1_1335_1486_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1335_1486_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1335_1486_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(root</span><span style="COLOR: #000000">||&amp;</span><span style="COLOR: #000000">left</span><span style="COLOR: #000000">==&amp;</span><span style="COLOR: #000000">right</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">left.root</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">right.root)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">root</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">element;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;left.root</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">root</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">lChild;right.root</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">root</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">rChild;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;root;root</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;</span><span style="COLOR: #008000">//<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;BinaryTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::PreOrder(BTNode</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;*</span><span style="COLOR: #000000">&nbsp;current)<br><img id=Codehighlighter1_1556_1822_Open_Image onclick="this.style.display='none'; Codehighlighter1_1556_1822_Open_Text.style.display='none'; Codehighlighter1_1556_1822_Closed_Image.style.display='inline'; Codehighlighter1_1556_1822_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1556_1822_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1556_1822_Closed_Text.style.display='none'; Codehighlighter1_1556_1822_Open_Image.style.display='inline'; Codehighlighter1_1556_1822_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1556_1822_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1556_1822_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">loop:<br><img id=Codehighlighter1_1579_1697_Open_Image onclick="this.style.display='none'; Codehighlighter1_1579_1697_Open_Text.style.display='none'; Codehighlighter1_1579_1697_Closed_Image.style.display='inline'; Codehighlighter1_1579_1697_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1579_1697_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1579_1697_Closed_Text.style.display='none'; Codehighlighter1_1579_1697_Open_Image.style.display='inline'; Codehighlighter1_1579_1697_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(current)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1579_1697_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1579_1697_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Visit(current</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">element);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(current</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">rChild)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BTNode</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::s.push(current</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">rChild);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">current</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">lChild;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;current</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">BTNode</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::s.top();Visit(current</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">element);BTNode</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::s.pop();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(BTNode</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::s.empty())&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">goto</span><span style="COLOR: #000000">&nbsp;loop;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;BinaryTree</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::PreOrder()<br><img id=Codehighlighter1_1874_1948_Open_Image onclick="this.style.display='none'; Codehighlighter1_1874_1948_Open_Text.style.display='none'; Codehighlighter1_1874_1948_Closed_Image.style.display='inline'; Codehighlighter1_1874_1948_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1874_1948_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1874_1948_Closed_Text.style.display='none'; Codehighlighter1_1874_1948_Open_Image.style.display='inline'; Codehighlighter1_1874_1948_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1874_1948_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1874_1948_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(root)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreOrder(root);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(root</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">rChild)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreOrder(root</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">rChild);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<img src ="http://www.cppblog.com/cxf20090520biancheng/aggbug/113162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxf20090520biancheng/" target="_blank">陈显锋</a> 2010-04-21 21:01 <a href="http://www.cppblog.com/cxf20090520biancheng/archive/2010/04/21/113162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己编的计算器类（使用自定义链式栈）</title><link>http://www.cppblog.com/cxf20090520biancheng/archive/2010/04/17/112838.html</link><dc:creator>陈显锋</dc:creator><author>陈显锋</author><pubDate>Sat, 17 Apr 2010 04:11:00 GMT</pubDate><guid>http://www.cppblog.com/cxf20090520biancheng/archive/2010/04/17/112838.html</guid><wfw:comment>http://www.cppblog.com/cxf20090520biancheng/comments/112838.html</wfw:comment><comments>http://www.cppblog.com/cxf20090520biancheng/archive/2010/04/17/112838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cxf20090520biancheng/comments/commentRss/112838.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxf20090520biancheng/services/trackbacks/112838.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;#ifndef&nbsp;LINKEDSTACK_CLASS#define&nbsp;LINKEDSTACK_CLASStemplate&nbsp;&lt;class&nbsp;T&gt;&nbsp;class&nbsp;LinkedStack;template&nbsp;&lt;class&nbsp;T&gt;class&nbsp;Node{&nbsp;&nbsp;&nbsp;&...&nbsp;&nbsp;<a href='http://www.cppblog.com/cxf20090520biancheng/archive/2010/04/17/112838.html'>阅读全文</a><img src ="http://www.cppblog.com/cxf20090520biancheng/aggbug/112838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxf20090520biancheng/" target="_blank">陈显锋</a> 2010-04-17 12:11 <a href="http://www.cppblog.com/cxf20090520biancheng/archive/2010/04/17/112838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>链式栈及用其测试的计算器</title><link>http://www.cppblog.com/cxf20090520biancheng/archive/2010/04/17/112827.html</link><dc:creator>陈显锋</dc:creator><author>陈显锋</author><pubDate>Sat, 17 Apr 2010 02:59:00 GMT</pubDate><guid>http://www.cppblog.com/cxf20090520biancheng/archive/2010/04/17/112827.html</guid><wfw:comment>http://www.cppblog.com/cxf20090520biancheng/comments/112827.html</wfw:comment><comments>http://www.cppblog.com/cxf20090520biancheng/archive/2010/04/17/112827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cxf20090520biancheng/comments/commentRss/112827.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxf20090520biancheng/services/trackbacks/112827.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: #ifndef&nbsp;STACK_CLASS#define&nbsp;STACK_CLASS#include&lt;iostream&gt;using&nbsp;namespace&nbsp;std;template&nbsp;&lt;class&nbsp;T&gt;class&nbsp;Stack{public:&nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;boo...&nbsp;&nbsp;<a href='http://www.cppblog.com/cxf20090520biancheng/archive/2010/04/17/112827.html'>阅读全文</a><img src ="http://www.cppblog.com/cxf20090520biancheng/aggbug/112827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxf20090520biancheng/" target="_blank">陈显锋</a> 2010-04-17 10:59 <a href="http://www.cppblog.com/cxf20090520biancheng/archive/2010/04/17/112827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>