﻿<?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++博客- 驭风万里无垠-随笔分类-C++</title><link>http://www.cppblog.com/skyscribe/category/10931.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 09 May 2010 17:01:23 GMT</lastBuildDate><pubDate>Sun, 09 May 2010 17:01:23 GMT</pubDate><ttl>60</ttl><item><title>GCC4.5的profile mode</title><link>http://www.cppblog.com/skyscribe/archive/2010/05/09/GCC4_5ProfileMode.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Sun, 09 May 2010 07:16:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2010/05/09/GCC4_5ProfileMode.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/114920.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2010/05/09/GCC4_5ProfileMode.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/114920.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/114920.html</trackback:ping><description><![CDATA[GCC最近发布了4.5版本，对于C++的支持除了更为丰富的0x特性支持外（参考<a href="http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x">这里</a>），<br>还增加了一个新的profile模式（尚处于试验阶段），可以根据程序运行状态给出关于STL使用的一些优化建议。<br><br>参看如下的描述：<br>
<div style="margin-left: 40px;">
<ul>
    <li>
    <p>An experimental <a href="http://gcc.gnu.org/onlinedocs/libstdc++/manual/profile_mode.html">
    profile mode </a> has been added. This is an implementation of
    many C++ standard library constructs with an additional analysis
    layer that gives performance improvement advice based on
    recognition of suboptimal usage patterns. For example,
    </p>
    <pre>#include &lt;vector&gt;<br>int main() <br>{<br>  std::vector&lt;int&gt; v;<br>  for (int k = 0; k &lt; 1024; ++k) <br>    v.insert(v.begin(), k);<br>}<br></pre>
    <p>
    When instrumented via the profile mode, can return suggestions about
    the initial size and choice of the container used as follows:
    </p>
    <pre>vector-to-list: improvement = 5: call stack = 0x804842c ...<br>    : advice = change std::vector to std::list<br>vector-size: improvement = 3: call stack = 0x804842c ...<br>    : advice = change initial container size from 0 to 1024<br></pre>
    <p>
    These constructs can be substituted for the normal libstdc++
    constructs on a piecemeal basis, or all existing components can be
    transformed via the <code>-D_GLIBCXX_PROFILE</code> macro.
    </p>
    </li>
</ul>
</div>
这个profile mode的主要作用就是根据代码实际运行状况给出关于STL的使用优化建议。有点遗憾的是，该profile方法是intrusive的，必须添加-D_GLBCXX_PROFILE来重新编译所有的代码。<br><br>Profile mode的提出源于09年CGO的一篇<a href="http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?reload=true&amp;arnumber=4907670">paper</a>，作者里边出现了华人的名字（根据拼音来判断）;作者地址填的显然是Purdue大学的：<br>&nbsp;&nbsp;&nbsp; Dept. of Comput. Sci., Purdue Univ., West。<br><br>GCC的Profiler对C++的支持一贯停留在和C同样的水平；由于C++模板机制和OO的存在使得很多时候分析profiling结果的意义被大大削弱。<br>这个针对STL的profile mode还是很值得期待的。<br><br><br>  <img src ="http://www.cppblog.com/skyscribe/aggbug/114920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2010-05-09 15:16 <a href="http://www.cppblog.com/skyscribe/archive/2010/05/09/GCC4_5ProfileMode.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost.cmake: 方便解决boost的升级问题</title><link>http://www.cppblog.com/skyscribe/archive/2010/05/09/114919.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Sun, 09 May 2010 06:59:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2010/05/09/114919.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/114919.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2010/05/09/114919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/114919.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/114919.html</trackback:ping><description><![CDATA[以前常用boost的一些库，由于项目自身用cmake组织build。<br>boost每次升级之后，重新用bjam编译一次都很是不便（某些平台，用默认选项编译有些问题，基本安装不成功）。<br><br>最近才发现boost的cmake版本已经独立出来了，对于使用cmake的用户而言，这里是个不错的选择。<br>项目<a  href="http://sodium.resophonic.com/boost-cmake/current-docs/">主页</a>的文档很是清晰，最新的版本是1.41 (版本号对应的基本就是其upstream的boost版本号)。<br>源代码是用git组织的，对于Linux用户而言更加方便。<br><br>引用其主页上的一句话：<br>
<div style="margin-left: 40px;">Boost.<a class="reference external" href="http://www.cmake.org/">CMake</a>
(or <a class="reference internal" href="http://sodium.resophonic.com/boost-cmake/current-docs/#alt-boost"><em> alt.boost</em> </a>)
is the boost distribution that all the cool kids are
using.
</div>
<br>CMake + <a  href="http://gitorious.org/boost/cmake.git">GIT</a> +<a  href="http://sphinx.pocoo.org/">Spinx</a> 确实够酷了。<br><br><span style="font-family: 微软雅黑;">编译起来可以充分利用强大的CMake了：</span><br>
<div style="margin-left: 40px;">
<pre>git clone git://gitorious.org/boost/cmake.git src<br>cd src<br>git checkout &lt;TAG&gt; &nbsp; &nbsp;//TAG==1.41.0.cmake0<br>mkdir bld<br>cd bld/<br>cmake ../<br></pre>
</div>
<pre>如果需要按需编译某些库，只需用make edit_cache修改cache即可。<br></pre>
<div style="margin-left: 40px;">
</div><img src ="http://www.cppblog.com/skyscribe/aggbug/114919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2010-05-09 14:59 <a href="http://www.cppblog.com/skyscribe/archive/2010/05/09/114919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Curl&amp;SSL</title><link>http://www.cppblog.com/skyscribe/archive/2009/07/27/90216.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Mon, 27 Jul 2009 14:29:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2009/07/27/90216.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/90216.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2009/07/27/90216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/90216.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/90216.html</trackback:ping><description><![CDATA[源码编译libcurl的时候,由于使用的不是默认系统上的ssl库（开发服务器上有很多个版本），为了避免动态库链接问题，必须定制SSL。<br>根据其源码里边的说明， <br>只需要在./configure 后边加上 --with-ssl=&lt;path&gt;即可。<br><br>开始的时候，没留意这个，因为粗略扫描了一下 --help, 后边这么说了：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">with</span><span style="color: #000000;">-</span><span style="color: #000000;">libssh2</span><span style="color: #000000;">=</span><span style="color: #000000;">PATH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Where&nbsp;to&nbsp;look&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;libssh2,&nbsp;PATH&nbsp;points&nbsp;to&nbsp;the<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIBSSH2&nbsp;installation&nbsp;(</span><span style="color: #0000ff;">default</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">local</span><span style="color: #000000;">/</span><span style="color: #000000;">lib);&nbsp;when<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;possible,&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;the&nbsp;PKG_CONFIG_PATH&nbsp;environment<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;variable&nbsp;instead&nbsp;of&nbsp;</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">&nbsp;option</span></div>
我的目标库的确就是在/usr/local/ssl下边了，当时编译之后，链接起来总是提示找不到对应版本的libssl.so.0.9.7.<br><br>后来才发现(将环境变量做小幅调整、改动来探测)，这个default在Solaris上边并不是真的default,必须显示指定为/usr/local/ssl,否则找到的居然是/usr/sfw/。<br><br><br> <img src ="http://www.cppblog.com/skyscribe/aggbug/90216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2009-07-27 22:29 <a href="http://www.cppblog.com/skyscribe/archive/2009/07/27/90216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CMake杂记</title><link>http://www.cppblog.com/skyscribe/archive/2009/07/04/89219.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Sat, 04 Jul 2009 05:15:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2009/07/04/89219.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/89219.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2009/07/04/89219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/89219.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/89219.html</trackback:ping><description><![CDATA[<ul>
</ul>
<ul>
    <li>1&gt; 尽量使用外部build而不是内部build.</li>
</ul>
<ul>
</ul>
<div style="margin-left: 40px;">所谓的内外，指的是make目录和CMakeLists.txt不在一个目录下。<br>好处是，所有的临时文件都会生成在当前运行cmake/make的目录。<br>譬如在项目根目录有一个CMakeLists.txt作为top-level file, 几个代码子目录，一个build目录，可以用：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">cd&nbsp;build<br>cmake&nbsp;..<br>make</span></div>
此时中间文件不会污染项目的目录结构。<br></div>
<ul>
</ul>
<ul>
    <li>2&gt; 可以用如下方式生成同名的静态库和动态库：</li>
</ul>
<ul>
</ul>
<div style="margin-left: 40px;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">set</span><span style="color: #000000;">(libname&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">mylib</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br><img src="http://www.cppblog.com/Images/dot.gif"><br>add_library(libname_static&nbsp;STATIC&nbsp;src1&nbsp;src2)<br>set_target_properties(libname_static&nbsp;OUTPUT_NAME&nbsp;${libname})<br><br>add_library(libname&nbsp;SHARED&nbsp;src1&nbsp;src2)<br></span></div>
</div>
<ul>
    <li>3&gt; 如何获取当前运行目录（working directory）:可以在根目录设置一个project_dir变量，设置为源代码目录，如下</li>
</ul>
<div style="margin-left: 40px;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">set</span><span style="color: #000000;">(project_top_dir&nbsp;${CMAKE_CURRENT_SOURCE_DIR}</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">)</span><span style="color: #000000;"><br></span><span style="color: #000000;"><br>add_subdirectory(sub1)<br>add_subdirectory(sub2)<br></span></div>
此时，各个子目录中可以应用project_top_dir.<br></div>
4&gt; 处理跨平台的第三方库：假设第三方库不是由CMake编译得来，但要检测依赖和变动，则可以用imported属性：<br>
<div style="margin-left: 40px;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">add_library(ssllib&nbsp;SHARED&nbsp;IMPORTED)<br>add_library(cryptolib&nbsp;SHARED&nbsp;IMPORTED)<br>#May&nbsp;have&nbsp;different&nbsp;dependent&nbsp;libraries<br></span><span style="color: #0000ff;">set</span><span style="color: #000000;">(libsuffix&nbsp;${CMAKE_SYSTEM_NAME}_${CMAKE_SYSTEM_PROCESSOR})<br>set_target_properties(ssllib&nbsp;PROPERTIES&nbsp;IMPORTED_LOCATION&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">${project_top_dir}contrib/openssl/lib/libssl-${libsuffix}.so</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>set_target_properties(cryptolib&nbsp;PROPERTIES&nbsp;IMPORTED_LOCATION&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">${project_top_dir}contrib/openssl/lib/libcrypto-${libsuffix}.so</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br><br><br>........................<br>#other CMakeLists.txt<br>add_executable(myExe src1 src2)<br>target_link_libraries(myExe ssllib cryptolib)<br></span></div>
</div><img src ="http://www.cppblog.com/skyscribe/aggbug/89219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2009-07-04 13:15 <a href="http://www.cppblog.com/skyscribe/archive/2009/07/04/89219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用cmake来搭建开发环境</title><link>http://www.cppblog.com/skyscribe/archive/2009/07/01/89026.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Wed, 01 Jul 2009 13:51:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2009/07/01/89026.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/89026.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2009/07/01/89026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/89026.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/89026.html</trackback:ping><description><![CDATA[对于经常在终端下写程序的non-windows程序员，Makefile绝对是最常用的工具，小到一个文件的简单的测试程序，大到数百个文件的商业软件，只需要有shell，一个make命令就可得到可运行的程序，Makefile绝对功不可没；可惜世界中不是那么太平，不但各个Posix系统的API千差万别，硬件平台各异，就连Makefile本身也有多个不兼容的格式，譬如GNU Makefile 拿到Solaris平台上就没法make下去，除非你有gmake，但gmake对并行编译的支持就没有solaris自带的dmake要好了。<br><br>GNU autotools提供了一个不错的选择，可以做到组织工具链来生成所需的Makefile，但缺陷是学习起来比较麻烦，而且模版文件写起来比较费劲。老实说我跟Makefile打了近3年的交道，几乎没有自己写过automake脚本，相反的工作倒是干了不少，譬如分析生成的Makefile运行过程，然后模拟自己手写Makefile；得到一个轻爽的定制环境。<br><br>除了autotools，其实也有不少其他的工具，譬如apache的ant，基于Python的scons；ant在java界是鼎鼎大名了，可惜对c++的支持确实让我感觉很不习惯；scons号称可以嵌入Python代码，用起来也算简单，但是想实现复杂的功能就很头疼了，而且运行速度让人挠头。<br><br>cmake则弥补了上述几个工具的诸多缺陷：<br>1&gt; 易于学习，文档易懂，只需牢记以下两个命令即可：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">cmake&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">help<br>cmake&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">help</span><span style="color: #000000;">-</span><span style="color: #000000;">command</span><span style="color: #000000;">-</span><span style="color: #000000;">list<br>cmake&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">help</span><span style="color: #000000;">-</span><span style="color: #000000;">command&nbsp;xxx<br>cmake&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">help</span><span style="color: #000000;">-</span><span style="color: #000000;">variable</span><span style="color: #000000;">-</span><span style="color: #000000;">list<br>cmake&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">help</span><span style="color: #000000;">-</span><span style="color: #000000;">variable&nbsp;yyy</span></div>
2&gt; 以文本文件组织，利用cache的方式，所有的自定义cache变量可直接用vim查看。<br>3&gt; 生成的Makefile文件简洁易懂<br>4&gt; 编译器选项可自己在ccmake中编辑，利于交叉编译<br>5&gt; 支持集成ctest/cpack,前者可以方便的做单元测试，后者则可以打包生成tgz/rpm<br>6&gt; 支持多个生成器，可以生成eclipse/codeblocks/gmake/unix make文件，甚至可以生成VC各个版本的dsw/sln.<br>7&gt; 内嵌语言，可以自己写函数、宏等<br><br>对于经常写小测试程序的人来说，在test目录下加上个CMakeLists.txt，里边加上几行简单的语句就可以方便的以后重复使用了。对于这种情况，手工写的Makefile碰到依赖检测这种麻烦的事情往往力不从心，automake又太小题大作，而cmake则恰到好处了。<br><br>对于大型程序，cmake可以自己定制生成的中间文件和目标文件路径，有效避免了automake带来的每个目录下生成一大堆文件的弊端，也不需要手工写Makefile。<br>最有用的是可以生成多个知名IDE的工程文件，包括Windows下的vc6-vc9.<br><br><img src ="http://www.cppblog.com/skyscribe/aggbug/89026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2009-07-01 21:51 <a href="http://www.cppblog.com/skyscribe/archive/2009/07/01/89026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Log4cpp:为中小型C++项目加上log支持</title><link>http://www.cppblog.com/skyscribe/archive/2009/06/18/88035.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Thu, 18 Jun 2009 14:22:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2009/06/18/88035.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/88035.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2009/06/18/88035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/88035.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/88035.html</trackback:ping><description><![CDATA[对于一个上点规模的C++项目而言，Log的作用是毋庸置疑的，出问题的时候，看了Log，常见的问题处理起来自是方便不过，即使遇到麻烦的问题，也可以从ｌｏｇ总发现不少蛛丝马迹。因此一个严肃的项目应该从一开始就好好考虑如何打Log，便于分析、维护。<br><br>现实的情况却是很多项目都是从最初的数千行代码逐步庞大起来；开始的时候可能为了图方便，加log的方式大多是自己在iostream的基础上自己封装一下；等到项目扩大数十倍的时候，却发现这种方式很力不从心，Log文件凌乱复杂，难以管理。<br><br>现有的log工具，基本是分为两个阵营，经典的syslog和花哨强大的log4j，从而衍生出很多个变体。log4j基本已经成为复杂应用程序的log标准了，无奈C++的几个模仿者确各有千秋。我的情况是：<br>1&gt;不需要复杂的配置，甚至不需要配置文件，但修改log消息格式又要很方便<br>2&gt;支持自动备份功能<br>3&gt;多线程安全<br>4&gt;效率要尽量高<br>5&gt;不要有其他依赖<br><br>log4cpp很轻易的满足了我的要求，只需要用已有的RollingFileAppender准备好后端，创建PatternLayout，一切就可以了；log级别的设置完全和syslog协议一样，很直观，打log地方，调用默认的Category管理器取得一个命名的Category,其他就是简单的调用了: log(), debug(), notice(), info(), notice()....<br><br>本来最感兴趣的是log4cxx, Apache的伟大项目，功能也最全，麻烦的是它自带了两个平台库，需要额外依赖；配置文件也要显示准备，感觉太臃肿了，估计大项目采用的吧。<br><br>效率上最高的应该是pantheiosle了，据说没开启Log的情况下，overhead几乎是0，作者自称效率是log4cxx的数倍，但也依赖于STLSoft（虽然只有头文件）,其打包方式也让人想避而远之，还要用作者自己写的版本选择器来选一个合适的库（Win的情况）。<br><br>还有一个是Boost的logging库，用尽了模板技巧，虽然很炫，当时没多少用，也没有通过boost 严格的review，虽然是专家写的，暂时也没时间评估和学习了。<br><br> <img src ="http://www.cppblog.com/skyscribe/aggbug/88035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2009-06-18 22:22 <a href="http://www.cppblog.com/skyscribe/archive/2009/06/18/88035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC4.4.0 &amp; C++0x 初体验</title><link>http://www.cppblog.com/skyscribe/archive/2009/05/16/83150.html</link><dc:creator>skyscribe</dc:creator><author>skyscribe</author><pubDate>Sat, 16 May 2009 14:24:00 GMT</pubDate><guid>http://www.cppblog.com/skyscribe/archive/2009/05/16/83150.html</guid><wfw:comment>http://www.cppblog.com/skyscribe/comments/83150.html</wfw:comment><comments>http://www.cppblog.com/skyscribe/archive/2009/05/16/83150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skyscribe/comments/commentRss/83150.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skyscribe/services/trackbacks/83150.html</trackback:ping><description><![CDATA[闲来无事，翻看GNU的邮件列表，发现4.4.0版本已经发布一个月有余，其中最大的改进莫过于c++了（也许是我对c++的部分最为关注的缘故），<a href="http://gcc.gnu.org/gcc-4.4/changes.html">ChangeLog</a>里边甚至专门列了一个<a href="http://gcc.gnu.org/gcc-4.4/cxx0x_status.html">网页</a>描述针对C++0x的支持特性，忍不住体验一把。<br><br>第一步要做的自然是手动编译GCC的源代码了，因为我没有找到Debian版本的升级包，干脆自己下载，我只需要gcc-core和g++两个包就可以了，一个25M，一个7M，下载倒是挺顺利，几分钟就OK了，接下来就是编译了。常见的源码编译步骤就OK了：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">.</span><span style="color: #000000;">/</span><span style="color: #000000;">Configure<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">make<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">make&nbsp;install</span></div>
<br>我遇到的是有两个关于多处理器的开发库依赖，apt-get很容易就安装上去了。<br><br>编译的过程就比较漫长了，我的Pentium D 2.8G Dual Core活生生忙活了一个小午休的时间，起来发现还没编译完，不过十分钟之后就发现所有的就OK了。<br><br>TR1的库，boost的示例比较好，其中<a href="http://www.boost.org/doc/libs/1_39_0/doc/html/boost_tr1.html">第21章</a>有详细的列表和用法简要说明。参照那个查了一下GCC的头文件，在<br>&nbsp;&nbsp; /usr/local/include/c++/4.4.0/tr1/ 里边：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">ls&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">lh&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;awk&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">$8&nbsp;~/^[a-z]+$/{print&nbsp;$8}</span><span style="color: #000000;">'</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">array<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">ccomplex<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">cctype<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">cfenv<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">cfloat<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">cinttypes<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">climits<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">cmath<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">complex<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">cstdarg<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">cstdbool<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">cstdint<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">cstdio<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">cstdlib<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">ctgmath<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">ctime<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">cwchar<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">cwctype<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">functional<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">memory<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">random<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">regex<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">tuple<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">utility</span></div>
<br>我比较熟悉和期待的是bind, function, auto, shared_ptr, mem_fn这几个库了，写了个小例子验证之：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;g++&nbsp;-std=c++0x&nbsp;-o&nbsp;testC++0x&nbsp;testNewC++.cpp&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;2</span><span style="color: #008000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tr1</span><span style="color: #000000;">/</span><span style="color: #000000;">memory</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tr1</span><span style="color: #000000;">/</span><span style="color: #000000;">functional</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tr1</span><span style="color: #000000;">/</span><span style="color: #000000;">tuple</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">vector</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br></span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></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></span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br></span><span style="color: #008080;">11</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;func1(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j,&nbsp;tr1::tuple</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;k)<br></span><span style="color: #008080;">12</span><span style="color: #000000;"><img id="Codehighlighter1_232_389_Open_Image" onclick="this.style.display='none'; codehighlighter1_232_389_open_text.style.display="'none';" codehighlighter1_232_389_closed_image.style.display="'inline';" codehighlighter1_232_389_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_232_389_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_232_389_closed_text.style.display="'none';" codehighlighter1_232_389_open_image.style.display="'inline';" codehighlighter1_232_389_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_232_389_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_232_389_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">13</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">func1:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;&lt;</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;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;&lt;</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;"><br></span><span style="color: #008080;">14</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;tuple&nbsp;param:[</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">0</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(k)&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">1</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(k)<br></span><span style="color: #008080;">15</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">2</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(k)&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">]</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br></span><span style="color: #008080;">16</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;"><br></span><span style="color: #008080;">17</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br></span><span style="color: #008080;">18</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br></span><span style="color: #008080;">19</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;func2(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j)<br></span><span style="color: #008080;">20</span><span style="color: #000000;"><img id="Codehighlighter1_418_469_Open_Image" onclick="this.style.display='none'; codehighlighter1_418_469_open_text.style.display="'none';" codehighlighter1_418_469_closed_image.style.display="'inline';" codehighlighter1_418_469_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_418_469_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_418_469_closed_text.style.display="'none';" codehighlighter1_418_469_open_image.style.display="'inline';" codehighlighter1_418_469_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_418_469_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_418_469_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">21</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">func2:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;&lt;</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;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br></span><span style="color: #008080;">22</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">23</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br></span><span style="color: #008080;">24</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;func3(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;k)<br></span><span style="color: #008080;">25</span><span style="color: #000000;"><img id="Codehighlighter1_494_532_Open_Image" onclick="this.style.display='none'; codehighlighter1_494_532_open_text.style.display="'none';" codehighlighter1_494_532_closed_image.style.display="'inline';" codehighlighter1_494_532_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_494_532_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_494_532_closed_text.style.display="'none';" codehighlighter1_494_532_open_image.style.display="'inline';" codehighlighter1_494_532_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_494_532_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_494_532_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">26</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">func3:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;k&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br></span><span style="color: #008080;">27</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;"><br></span><span style="color: #008080;">28</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br></span><span style="color: #008080;">29</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;MyFunc1<br></span><span style="color: #008080;">30</span><span style="color: #000000;"><img id="Codehighlighter1_550_787_Open_Image" onclick="this.style.display='none'; codehighlighter1_550_787_open_text.style.display="'none';" codehighlighter1_550_787_closed_image.style.display="'inline';" codehighlighter1_550_787_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_550_787_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_550_787_closed_text.style.display="'none';" codehighlighter1_550_787_open_image.style.display="'inline';" codehighlighter1_550_787_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_550_787_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_550_787_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">31</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;memFun1(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j)<br></span><span style="color: #008080;">32</span><span style="color: #000000;"><img id="Codehighlighter1_587_657_Open_Image" onclick="this.style.display='none'; codehighlighter1_587_657_open_text.style.display="'none';" codehighlighter1_587_657_closed_image.style.display="'inline';" codehighlighter1_587_657_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_587_657_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_587_657_closed_text.style.display="'none';" codehighlighter1_587_657_open_image.style.display="'inline';" codehighlighter1_587_657_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_587_657_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_587_657_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">33</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">MyFunc1::memFun1&nbsp;:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;&lt;</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;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br></span><span style="color: #008080;">34</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br></span><span style="color: #008080;">35</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">36</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;memFun2(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;k)<br></span><span style="color: #008080;">37</span><span style="color: #000000;"><img id="Codehighlighter1_702_785_Open_Image" onclick="this.style.display='none'; codehighlighter1_702_785_open_text.style.display="'none';" codehighlighter1_702_785_closed_image.style.display="'inline';" codehighlighter1_702_785_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_702_785_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_702_785_closed_text.style.display="'none';" codehighlighter1_702_785_open_image.style.display="'inline';" codehighlighter1_702_785_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_702_785_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_702_785_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">38</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">MyFunc1::memFun2&nbsp;:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;&lt;</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;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;&lt;</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;">&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;k&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;endl;<br></span><span style="color: #008080;">39</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br></span><span style="color: #008080;">40</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;">;<br></span><span style="color: #008080;">41</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br></span><span style="color: #008080;">42</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br></span><span style="color: #008080;">43</span><span style="color: #000000;"><img id="Codehighlighter1_802_1539_Open_Image" onclick="this.style.display='none'; codehighlighter1_802_1539_open_text.style.display="'none';" codehighlighter1_802_1539_closed_image.style.display="'inline';" codehighlighter1_802_1539_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_802_1539_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_802_1539_closed_text.style.display="'none';" codehighlighter1_802_1539_open_image.style.display="'inline';" codehighlighter1_802_1539_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_802_1539_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_802_1539_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">44</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">45</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;tr1::function</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;Func;<br></span><span style="color: #008080;">46</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;std::tr1::bind;<br></span><span style="color: #008080;">47</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;std::tr1::mem_fn;<br></span><span style="color: #008080;">48</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;std::tr1::placeholders::_1;<br></span><span style="color: #008080;">49</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;std::tr1::shared_ptr;<br></span><span style="color: #008080;">50</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">51</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">MyFunc1</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;instPtr(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MyFunc1);<br></span><span style="color: #008080;">52</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;MyFunc1&nbsp;functor;<br></span><span style="color: #008080;">53</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">54</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Func</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;funcs;<br></span><span style="color: #008080;">55</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;funcs.push_back(bind(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">func1,&nbsp;_1,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;tr1::make_tuple(</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">)));<br></span><span style="color: #008080;">56</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;funcs.push_back(bind(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">func2,&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;_1));<br></span><span style="color: #008080;">57</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;funcs.push_back(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">func3);<br></span><span style="color: #008080;">58</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;funcs.push_back(bind(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">MyFunc1::memFun1,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">functor,&nbsp;_1,&nbsp;</span><span style="color: #000000;">21</span><span style="color: #000000;">));<br></span><span style="color: #008080;">59</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;funcs.push_back(bind(mem_fn(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">MyFunc1::memFun2),&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">functor,&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;_1));<br></span><span style="color: #008080;">60</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;funcs.push_back(bind(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">MyFunc1::memFun1,&nbsp;instPtr,&nbsp;_1,&nbsp;</span><span style="color: #000000;">22</span><span style="color: #000000;">));<br></span><span style="color: #008080;">61</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">62</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(auto&nbsp;it&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;funcs.begin(),&nbsp;itEnd&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;funcs.end();<br></span><span style="color: #008080;">63</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;itEnd;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">it)<br></span><span style="color: #008080;">64</span><span style="color: #000000;"><img id="Codehighlighter1_1498_1522_Open_Image" onclick="this.style.display='none'; codehighlighter1_1498_1522_open_text.style.display="'none';" codehighlighter1_1498_1522_closed_image.style.display="'inline';" codehighlighter1_1498_1522_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1498_1522_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_1498_1522_closed_text.style.display="'none';" codehighlighter1_1498_1522_open_image.style.display="'inline';" codehighlighter1_1498_1522_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1498_1522_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_1498_1522_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">65</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">it)(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br></span><span style="color: #008080;">66</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br></span><span style="color: #008080;">67</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br></span><span style="color: #008080;">68</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&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;">69</span><span style="color: #000000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span></div>
<br>编译之后，运行结果如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">func1:</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;,&nbsp;tuple&nbsp;param:[</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">4</span><span style="color: #000000;">,</span><span style="color: #000000;">5</span><span style="color: #000000;">]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">func2:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">func3:&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">MyFunc1::memFun1&nbsp;:</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">21</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">MyFunc1::memFun2&nbsp;:</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">MyFunc1::memFun1&nbsp;:</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">22</span></div>
由于我的环境下，新版的litstdc++.so被安装在了/usr/local/lib64/下边，所以需要手工指定动态库的路径（export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH即可绕过/usr/lib/libstdc++.so）.<br><br>估计这么奇妙的特性，进入工业应用还得不少时间吧，麻烦的标准化...<br><br><img src ="http://www.cppblog.com/skyscribe/aggbug/83150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skyscribe/" target="_blank">skyscribe</a> 2009-05-16 22:24 <a href="http://www.cppblog.com/skyscribe/archive/2009/05/16/83150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>