﻿<?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/C++</title><link>http://www.cppblog.com/kongque/category/12756.html</link><description>致力于手机游戏开发</description><language>zh-cn</language><lastBuildDate>Tue, 28 Jun 2011 07:40:06 GMT</lastBuildDate><pubDate>Tue, 28 Jun 2011 07:40:06 GMT</pubDate><ttl>60</ttl><item><title>google c++风格指南笔记（五）：格式</title><link>http://www.cppblog.com/kongque/archive/2011/06/28/149656.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Tue, 28 Jun 2011 07:22:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/06/28/149656.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/149656.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/06/28/149656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/149656.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/149656.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 代码风格和格式确实比较随意, 但一个项目中所有人遵循同一风格是非常容易的. 个体未必同意下述每一处格式规则, 但整个项目服从统一的编程风格是很重要的, 只有这样才能让所有人能很轻松的阅读和理解代码.&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2011/06/28/149656.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/149656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-06-28 15:22 <a href="http://www.cppblog.com/kongque/archive/2011/06/28/149656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】一些开发工具包</title><link>http://www.cppblog.com/kongque/archive/2011/06/11/148499.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Sat, 11 Jun 2011 09:28:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/06/11/148499.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/148499.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/06/11/148499.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/148499.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/148499.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 下面是收集的一些开发工具包，主要是C/C++方面的，涉及图形、图像、游戏、人工智能等各个方面，感觉是一个比较全的资源。供参考！原文的出处：http://www.codemonsters.de/home/content.php?show=freelibraries Contents 2D Graphics3D Graphics3D Game EnginesArtificial Intelligenc...&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2011/06/11/148499.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/148499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-06-11 17:28 <a href="http://www.cppblog.com/kongque/archive/2011/06/11/148499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己动手写makefile的一些注意事项</title><link>http://www.cppblog.com/kongque/archive/2011/04/09/143804.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Sat, 09 Apr 2011 06:35:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/04/09/143804.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/143804.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/04/09/143804.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/143804.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/143804.html</trackback:ping><description><![CDATA[编译几个简单的cpp文件。自己写了makefile。编译器使用g++，链接器指定ld。<br><br>链接器指定使用ld会出现如下错误:<br>cannot find entry symbol _start<br>这是因为ld的真正入口是_start而不是main。需要链接相应的c库和c运行时库。libc、libcrt等。<br><br>解决办法是使用gcc。<br><br>但是链接器指定使用gcc会出现如下错误:<br>undefined reference to '__gxx_personality_v0'<br><br>这是因为缺少stdc++库，加上-lstdc++即可。<br>或者更干脆的使用g++，让g++去处理这些细枝末节吧。
<br><img src ="http://www.cppblog.com/kongque/aggbug/143804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-04-09 14:35 <a href="http://www.cppblog.com/kongque/archive/2011/04/09/143804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下生成core dump文件方法及设置</title><link>http://www.cppblog.com/kongque/archive/2011/03/07/141262.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Mon, 07 Mar 2011 04:17:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/03/07/141262.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/141262.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/03/07/141262.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/141262.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/141262.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1) 在终端中输入ulimit -c 如果结果为0，说明当程序崩溃时，系统并不能生成core dump。<br><br>2) 使用ulimit -c unlimited命令，开启core dump功能，并且不限制生成core dump文件的大小。如果需要限制，加数字限制即可。ulimit - c 1024<br><br>3) 默认情况下，core dump生成的文件名为core，而且就在程序当前目录下。新的core会覆盖已存在的core。通过修改/proc/sys/kernel /core_uses_pid文件，可以将进程的pid作为作为扩展名，生成的core文件格式为core.xxx，其中xxx即为pid<br><br>4) 通过修改/proc/sys/kernel/core_pattern可以控制core文件保存位置和文件格式。例如：将所有的core文件生成到 /corefile目录下，文件名的格式为core-命令名-pid-时间戳. echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2011/03/07/141262.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/141262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-03-07 12:17 <a href="http://www.cppblog.com/kongque/archive/2011/03/07/141262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下代码行统计命令</title><link>http://www.cppblog.com/kongque/archive/2011/02/28/140848.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Mon, 28 Feb 2011 14:02:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/02/28/140848.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/140848.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/02/28/140848.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/140848.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/140848.html</trackback:ping><description><![CDATA[实用的功能，利用find命令和wc命令的简单组合即可。如下：<br><br>find . -name "*.h" | xargs wc -l<br>find . -name "*.cpp" | xargs wc -l<br>find . -name "*.c" | xargs wc -l<br><br><img src ="http://www.cppblog.com/kongque/aggbug/140848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-02-28 22:02 <a href="http://www.cppblog.com/kongque/archive/2011/02/28/140848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc编译器__attribute__ ((packed)) 的作用</title><link>http://www.cppblog.com/kongque/archive/2011/02/16/140176.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Wed, 16 Feb 2011 10:52:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/02/16/140176.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/140176.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/02/16/140176.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/140176.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/140176.html</trackback:ping><description><![CDATA[对于如下的结构体声明：<br>
<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: #0000ff;">struct</span><span style="color: #000000;">&nbsp;Foo<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;c;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;f;<br>}&nbsp;__attribute__((packed));</span></div>
<br>__attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐，按照实际占用字节数进行对齐。经过上述属性设置之后，Foo结构体的大小为5个字节，如果不设置该属性并且没有显式指定字节对齐属性的话，可能为8个字节。关于字节对齐，这里不多赘述。<br><br>其中__attribute__机制是gcc编译器特有的。用来在函数或数据声明中设置其属性，__attribute__可以设置函数属性、变量属性、类型属性。<br><br>关于gcc的__attribute__的更多技术细节，可以参看如下链接：<br>1. <a href="http://unixwiz.net/techtips/gnu-c-attributes.html">http://unixwiz.net/techtips/gnu-c-attributes.html
</a><br>2. <a href="http://www.yuanma.org/data/2006/0625/article_948.htm">http://www.yuanma.org/data/2006/0625/article_948.htm</a>
<br>
<br><br> <img src ="http://www.cppblog.com/kongque/aggbug/140176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-02-16 18:52 <a href="http://www.cppblog.com/kongque/archive/2011/02/16/140176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ImageMagick使用笔记</title><link>http://www.cppblog.com/kongque/archive/2011/02/14/140040.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Mon, 14 Feb 2011 07:59:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/02/14/140040.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/140040.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/02/14/140040.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/140040.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/140040.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ImageMagick是一个开源的、功能强大的命令行图像处理工具。通过这里可以了解一下 ImageMagick。<br><br>最近涉及到不少批量的图像处理工作，使用到这个工具，感觉其功能非常强大而且很方便，把目前使用到的功能记录如下，工作平台：Ubuntu 10.04：&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2011/02/14/140040.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/140040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-02-14 15:59 <a href="http://www.cppblog.com/kongque/archive/2011/02/14/140040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google C++风格指南笔记（四）: 注释</title><link>http://www.cppblog.com/kongque/archive/2011/01/25/139292.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Tue, 25 Jan 2011 10:29:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/01/25/139292.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/139292.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/01/25/139292.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/139292.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/139292.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: <br>注释的本质是帮助别人和帮助自己更好的理解代码，不是炫耀英文或中文水平。<br><br>错误的语法，错误的拼写给他人带来困惑与不快，宁愿不写，不可乱写。&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2011/01/25/139292.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/139292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-01-25 18:29 <a href="http://www.cppblog.com/kongque/archive/2011/01/25/139292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux平台延时之sleep、usleep、nanosleep、select比较</title><link>http://www.cppblog.com/kongque/archive/2011/01/18/138765.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Tue, 18 Jan 2011 09:12:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/01/18/138765.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/138765.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/01/18/138765.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/138765.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/138765.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Linux平台延时之sleep、usleep、nanosleep、select比较&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2011/01/18/138765.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/138765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-01-18 17:12 <a href="http://www.cppblog.com/kongque/archive/2011/01/18/138765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu下pdf乱码和rar解压后无效文件编码解决方案</title><link>http://www.cppblog.com/kongque/archive/2011/01/13/138462.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Thu, 13 Jan 2011 06:30:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/01/13/138462.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/138462.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/01/13/138462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/138462.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/138462.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Ubuntu下pdf乱码和无效文件编码解决方案&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2011/01/13/138462.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/138462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-01-13 14:30 <a href="http://www.cppblog.com/kongque/archive/2011/01/13/138462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cmake入门</title><link>http://www.cppblog.com/kongque/archive/2011/01/12/138402.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Wed, 12 Jan 2011 07:20:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/01/12/138402.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/138402.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/01/12/138402.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/138402.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/138402.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: CMake是一个跨平台的编译构建系统，本文是Cmake入门实例。&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2011/01/12/138402.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/138402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-01-12 15:20 <a href="http://www.cppblog.com/kongque/archive/2011/01/12/138402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google C++ 风格指南笔记（三）：命名约定</title><link>http://www.cppblog.com/kongque/archive/2011/01/06/138086.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Thu, 06 Jan 2011 11:41:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2011/01/06/138086.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/138086.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2011/01/06/138086.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/138086.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/138086.html</trackback:ping><description><![CDATA[<br><span style="font-weight: bold;">1.一致性原则</span><br>&nbsp;&nbsp;&nbsp; 无论是采用驼峰命名法或者匈牙利命名法都可以，但是在项目中一定保持一致的风格，一致带来的好处不言而喻。<br><br><span style="font-weight: bold;">2.不要轻易使用缩写</span><br>&nbsp;&nbsp; &nbsp;除非该缩写在其他地方使用非常普遍，否则不要创造缩写。<br><br><span style="font-weight: bold;">3.枚举和常量命名加前缀&#8221;k&#8221;
</span><br><img src ="http://www.cppblog.com/kongque/aggbug/138086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2011-01-06 19:41 <a href="http://www.cppblog.com/kongque/archive/2011/01/06/138086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++的PImpl技巧及作用</title><link>http://www.cppblog.com/kongque/archive/2010/12/31/137776.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Thu, 30 Dec 2010 17:21:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/12/31/137776.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/137776.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/12/31/137776.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/137776.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/137776.html</trackback:ping><description><![CDATA[PImpl(private implementation) 其主要作用是解开类的使用接口和实现的耦合。<br><br>一个很简单的实现如下：<br>头文件中：<br>
<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: #0000ff;">class</span><span style="color: #000000;">&nbsp;CSample<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CImpl;<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">CImpl</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;mp;<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CSample();<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;print();<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">};</span></div>
<br>实现文件中：<br>
<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: #0000ff;">class</span><span style="color: #000000;">&nbsp;CSample::CImpl<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;doPrint()<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&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;">impl&nbsp;print</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;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<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;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">CSample::CSample()&nbsp;:&nbsp;mp(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CImpl)<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">{}<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;CSample::print()&nbsp;{&nbsp;mp</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">doPrint();&nbsp;}</span></div>
<br>类CSample仅向外界暴露了最小的接口，真正的实现由其内部类CImpl来完成。这样无论CImpl如何修改，外界对此一无所知，从而保持接口的不变性。这种方式的另外一个好处是减少了头文件之间的依赖关系。<br><br>上面的代码里，我使用了boost的shared_ptr来管理指针，简化代码。<br><br>关于PImpl的更多资料和信息可以参考如下链接：<br>1. <a title="PImp的原理"  href="http://blog.chinaunix.net/u/8059/showart_2294415.html">PImp的原理</a><br>2. <a title="PImpl your c++ code"  href="http://anteru.net/2009/03/14/385/">PImpl your C++ code</a><br>3. <a title="the c++ pimpl"  href="http://www.gamedev.net/reference/articles/article1794.asp">the C++ PImpl</a><br><br><img src ="http://www.cppblog.com/kongque/aggbug/137776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-12-31 01:21 <a href="http://www.cppblog.com/kongque/archive/2010/12/31/137776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++的一个疑惑</title><link>http://www.cppblog.com/kongque/archive/2010/12/20/137036.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Mon, 20 Dec 2010 13:15:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/12/20/137036.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/137036.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/12/20/137036.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/137036.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/137036.html</trackback:ping><description><![CDATA[
各位请看下面的代码<div><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;A&nbsp;{};<br></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;B<br></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;B(){}<br></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;B(A</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;a){}<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; "><br></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;B1&nbsp;:&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;B<br></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;B1(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;B</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;b)&nbsp;:&nbsp;B(b)<br></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{}<br></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">};<br></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">{<br></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a;<br></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;B1&nbsp;b1(a);<br></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; "><br></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&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; ">23</span>&nbsp;<span style="color: #000000; ">}</span></div><br></div><div>上面的代码可以编译通过（gcc和vs2005下均测试通过），但是如果我将第13行的const修饰符去掉，编译就不能通过，报错说没有匹配的函数，请问各位高手这是为什么？望指教。</div><img src ="http://www.cppblog.com/kongque/aggbug/137036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-12-20 21:15 <a href="http://www.cppblog.com/kongque/archive/2010/12/20/137036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Visual C++ engine is not properly installed 解决方案</title><link>http://www.cppblog.com/kongque/archive/2010/11/15/133631.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Mon, 15 Nov 2010 02:55:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/11/15/133631.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/133631.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/11/15/133631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/133631.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/133631.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2010/11/15/133631.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/133631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-11-15 10:55 <a href="http://www.cppblog.com/kongque/archive/2010/11/15/133631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3D游戏引擎Irrlicht浅谈（一）</title><link>http://www.cppblog.com/kongque/archive/2010/11/01/132017.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Mon, 01 Nov 2010 09:59:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/11/01/132017.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/132017.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/11/01/132017.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/132017.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/132017.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在3D技术大行其道，游戏开发如火如荼的今天，提到游戏开发，那几乎就是言必称引擎。除了效果与质量牛X闪闪的商业3D引擎，开源界也没歇着，开源的游戏引擎也是遍地开花。对于国内的游戏开发者来说有两款3D开源引擎不得不提。一个是OGRE, 另一个则是Irrlicht。<br><br>我要进行学习与研究的是Irrlicht引擎。&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2010/11/01/132017.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/132017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-11-01 17:59 <a href="http://www.cppblog.com/kongque/archive/2010/11/01/132017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++关键字mutable的思考</title><link>http://www.cppblog.com/kongque/archive/2010/10/30/131827.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Sat, 30 Oct 2010 03:27:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/10/30/131827.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/131827.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/10/30/131827.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/131827.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/131827.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在C++中，mutable也是为了突破const的限制而设置的。被mutable修饰的变量，将永远处于可变的状态，即使在一个const函数中。<br><br>我认为C++设置出这个关键字应该有更深层次的理由和初衷。坛子里大牛多多，请大家讨论一下在实际工作或编码过程中对于该关键字的使用和认识。&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2010/10/30/131827.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/131827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-10-30 11:27 <a href="http://www.cppblog.com/kongque/archive/2010/10/30/131827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc6如何使用多个配置</title><link>http://www.cppblog.com/kongque/archive/2010/04/09/112046.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Fri, 09 Apr 2010 03:29:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/04/09/112046.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/112046.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/04/09/112046.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/112046.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/112046.html</trackback:ping><description><![CDATA[在vc6中新建立一个工程，会为这个工程生成两个默认的配置。一个是debug，一个是release。绝大部分情况下，这两种情况已经足够，但是如果需要再多一些配置情况的，该如何处理呢？比如说，我现在想要一个名字叫Myself的独立的工程配置。在vc6 IDE中我并没有找到相关的设置，如果有知道如何配置的童鞋，请告诉俺，谢谢啦。<br><br>我是通过修改vc6工程.dsp文件来做到的。<br><br>在工程目录中找到.dsp文件，用文本编辑器打开，很容易看明白这个工程的设置。仿照Debug或Release的设置，修改该配置文件，就可以生成新的工程配置。具体的修改在这里不赘述，修改后截图如下：<br><br><img alt="" src="http://www.cppblog.com/images/cppblog_com/kongque/1.JPG" width="413" height="100"><br><br>补：<br>刚才同事告诉我，在VC6 IDE的Build菜单下面的Configurations菜单项可以进行该项工程设置。汗~<br> <img src ="http://www.cppblog.com/kongque/aggbug/112046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-04-09 11:29 <a href="http://www.cppblog.com/kongque/archive/2010/04/09/112046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>代码随想</title><link>http://www.cppblog.com/kongque/archive/2010/03/31/111077.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Tue, 30 Mar 2010 16:00:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/03/31/111077.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/111077.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/03/31/111077.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/111077.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/111077.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 工程项目中不是讲究新鲜的语言技巧、语法规范。不要华丽的新技术。要的就是正常而稳定，稳定压倒一切。&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2010/03/31/111077.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/111077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-03-31 00:00 <a href="http://www.cppblog.com/kongque/archive/2010/03/31/111077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DirectInput入门</title><link>http://www.cppblog.com/kongque/archive/2010/03/30/111075.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Tue, 30 Mar 2010 15:55:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/03/30/111075.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/111075.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/03/30/111075.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/111075.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/111075.html</trackback:ping><description><![CDATA[我想在博客里记录一些学习DirectX的笔记。这是第一篇。<br>一直以来对于DirectX的一套没有花时间去学习，3D图形api也是学习了OpenGL，相当长的一段时间里，总是认为自己不会去接触这些。到公司写了快一年的游戏逻辑了，才明白逻辑固然很重要，但是写逻辑写一年和写两年的区别不大。做游戏，做网游不就那几个大块么，图形，网络，数据库，io并发。写逻辑是要写的，但终究需要在某一领域有所专长，才是正道。<br><br>言归正传吧。<br><br>DirectInput是一个不依赖硬件的虚拟输入系统，是建立于硬件抽象层(HAL)之上的接口。<br><br>微软的DirectX一套均采用COM开发，所以无论DDraw还是DirectInput的构建、设置、使用，代码都相差无多。基本步骤都是建立xxx接口对象，建立xxx设备，设置xxx相关属性(参数)，使用之。<br><br>我们要在应用程序中使用DirectInput，分以下三步走。<br>1）初始化<br>2）获取设备状态<br>3）根据设备状态，进行你的自定义处理。<br><br>我这里给出一个简单的例子。该例子就是在标准的windows应用程序中使用DirectInput所需的步骤。<br>首先需要包含必要的宏定义和头文件<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: #008080;">1</span>&nbsp;<span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;INITGUID</span><span style="color: #000000;"><br></span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">objbase.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">dinput.h</span><span style="color: #000000;">&gt;</span></div>
<br>相关的全部变量：<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;">LPDIRECTINPUT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_dinput&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br>LPDIRECTINPUTDEVICE&nbsp;g_Keyboard&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;</span></div>
<br><br>建立初始化函数：<br><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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">BOOL&nbsp;InitDirectInput(HINSTANCE&nbsp;hInstance)<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建DirectInput对象</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(DI_OK&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;DirectInputCreate(hInst,&nbsp;DIRECTINPUT_VERSION,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">g_dinput,&nbsp;NULL))<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;FALSE;<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建键盘设备</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(DI_OK&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;g_dinput</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">CreateDevice(GUID_SysKeyboard,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">g_Keyboard,&nbsp;NULL))<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;FALSE;<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;设置协作等级</span><span style="color: #008000;"><br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(DI_OK&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;g_Keyboard</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">SetCooperativeLevel(g_hWnd,&nbsp;DISCL_NONEXCLUSIVE</span><span style="color: #000000;">|</span><span style="color: #000000;">DISCL_BACKGROUND))<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;FALSE;<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;设置数据格式</span><span style="color: #008000;"><br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(DI_OK&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;g_Keyboard</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">SetDataFormat(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">c_dfDIKeyboard))<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;FALSE;<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;获取设备</span><span style="color: #008000;"><br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(DI_OK&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;g_Keyboard</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Acquire())<br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;FALSE;<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;TRUE;<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">}</span></div>
<br>在哪里使用呢？我们在windows消息循环里面，处理完消息之后：<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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;keyboard_state[</span><span style="color: #000000;">256</span><span style="color: #000000;">];<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Main&nbsp;message&nbsp;loop:</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(GetMessage(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">msg,&nbsp;NULL,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">TranslateAccelerator(msg.hwnd,&nbsp;hAccelTable,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">msg))&nbsp;<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TranslateMessage(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">msg);<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">msg);<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_Keyboard</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetDeviceState(</span><span style="color: #000000;">256</span><span style="color: #000000;">,&nbsp;(LPVOID)keyboard_state);<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(keyboard_state[DIK_UP])<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::MessageBox(NULL,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">up</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">msg</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;MB_OK);<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br>基本就是这些了。<br><br>我这里主要是作为学习笔记留在blog上，说的不清楚或者不专业或者其他原因让你没有看明白的，请看<br>《windows游戏编程大师技巧》一书。<br><br><br><br><br><br><br> <img src ="http://www.cppblog.com/kongque/aggbug/111075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-03-30 23:55 <a href="http://www.cppblog.com/kongque/archive/2010/03/30/111075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost库的Singleton的实现</title><link>http://www.cppblog.com/kongque/archive/2010/02/28/108635.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Sun, 28 Feb 2010 14:48:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/02/28/108635.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/108635.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/02/28/108635.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/108635.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/108635.html</trackback:ping><description><![CDATA[在工作中遇到不少情况使用singleton模式，下面采用的是最简单的一种形式：<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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Foo<br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Foo</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;getSingleton()<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Foo&nbsp;foo;<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;foo;<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Foo();<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">};</span></div>
这种实现，在单线程情况下，简单而有效。<br><br>对于线程安全的singleton的实现，网上有不少讨论。这两天看到boost库中的一种实现，没有使用锁机制，而是充分利用了C++的语言特性较好的解决了多线程情况下使用singleton的问题。<br>boost的singleton的实现基于以下假设：良好的设计在进入main函数之前应该是单线程的。<br>我们可以使用全局变量的方式来设计singleton，并且保证在使用该singleton之前其已经被正确的初始化，如何做到？且看代码：<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: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">template&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</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;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;Singleton<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;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;object_creator<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;object_creator(){&nbsp;Singleton</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::instance();&nbsp;}<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inline&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;do_nothing()</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;{}<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;};<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;object_creator&nbsp;create_object;<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;T&nbsp;object_type;<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;object_type</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;instance()<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;object_type&nbsp;obj;<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;create_object.do_nothing();<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;obj;<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">};<br></span></div>
漂亮而巧妙的实现。<br>但是上面的实现还是有一点小的缺憾，那就是只能调用类的默认构造函数，不能调用带参数的构造函数。<br><br>附：<br>非常抱歉，上面这个代码是有点问题的。感谢各位童鞋及时回复并指出问题所在。现在补上缺失的初始化部分。<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: #008080;">1</span>&nbsp;<span style="color: #000000;">template&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">typename&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">typename&nbsp;Singleton</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::object_creator<br></span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">Singleton</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::create_object;</span></div>
<br><br> <img src ="http://www.cppblog.com/kongque/aggbug/108635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-02-28 22:48 <a href="http://www.cppblog.com/kongque/archive/2010/02/28/108635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Placement new的用法及用途</title><link>http://www.cppblog.com/kongque/archive/2010/02/20/108093.html</link><dc:creator>孔雀</dc:creator><author>孔雀</author><pubDate>Sat, 20 Feb 2010 06:20:00 GMT</pubDate><guid>http://www.cppblog.com/kongque/archive/2010/02/20/108093.html</guid><wfw:comment>http://www.cppblog.com/kongque/comments/108093.html</wfw:comment><comments>http://www.cppblog.com/kongque/archive/2010/02/20/108093.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/kongque/comments/commentRss/108093.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kongque/services/trackbacks/108093.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: C++中placement new的标准使用方法及用途<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/kongque/archive/2010/02/20/108093.html'>阅读全文</a><img src ="http://www.cppblog.com/kongque/aggbug/108093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kongque/" target="_blank">孔雀</a> 2010-02-20 14:20 <a href="http://www.cppblog.com/kongque/archive/2010/02/20/108093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>