﻿<?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 Program</title><link>http://www.cppblog.com/lovedday/category/4250.html</link><description>&lt;br&gt;【没有计划的人生是失败的 | 不善于从生活与实践中学习是失败之源 | 不懂得正确思考将毁了我们的一生 | 你的生活方式决定了你的健康 |  用正确的方法解决问题】&lt;br&gt;【积极主动地解决问题 | 用行动来明白 | 人无自尊毋宁死 | 万事必有因 | 好的习惯是成功的基石 | 最大的错误是没意识到错误 | 拖延是最坏的习惯】</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 00:04:48 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 00:04:48 GMT</pubDate><ttl>60</ttl><item><title>一个用C/C++分别实现接口与实现相分离的设计原则的例子</title><link>http://www.cppblog.com/lovedday/archive/2007/09/30/33253.html</link><dc:creator>lovedday</dc:creator><author>lovedday</author><pubDate>Sun, 30 Sep 2007 06:15:00 GMT</pubDate><guid>http://www.cppblog.com/lovedday/archive/2007/09/30/33253.html</guid><wfw:comment>http://www.cppblog.com/lovedday/comments/33253.html</wfw:comment><comments>http://www.cppblog.com/lovedday/archive/2007/09/30/33253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lovedday/comments/commentRss/33253.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lovedday/services/trackbacks/33253.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 良好的设计应该只暴露接口给用户，所有的实现细节对用户来说应该是隐藏的，也就是说用户只要给接口传递相应的参数就行了，不需要管内部是如何实现的，比如我们使用fopen，fseek，CreateWindow等函数会发现很好用，而不需要管fopen，fseek，CreateWindow函数内部代码是如何实现的，数据结构是如何组织的，也就是说绝对不能暴露任何的细节给用户，包括数据组织在内。&nbsp;&nbsp;<a href='http://www.cppblog.com/lovedday/archive/2007/09/30/33253.html'>阅读全文</a><img src ="http://www.cppblog.com/lovedday/aggbug/33253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lovedday/" target="_blank">lovedday</a> 2007-09-30 14:15 <a href="http://www.cppblog.com/lovedday/archive/2007/09/30/33253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>offsetof宏解析</title><link>http://www.cppblog.com/lovedday/archive/2007/09/24/32801.html</link><dc:creator>lovedday</dc:creator><author>lovedday</author><pubDate>Mon, 24 Sep 2007 11:04:00 GMT</pubDate><guid>http://www.cppblog.com/lovedday/archive/2007/09/24/32801.html</guid><wfw:comment>http://www.cppblog.com/lovedday/comments/32801.html</wfw:comment><comments>http://www.cppblog.com/lovedday/archive/2007/09/24/32801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lovedday/comments/commentRss/32801.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lovedday/services/trackbacks/32801.html</trackback:ping><description><![CDATA[<p><br>
今天看代码时，发现一个有用的东东，offsetof(s,m)，这是一个宏，MSDN文档的说明如下:</p>
<p><font style="font-size: 13pt;" face="Tahoma">Retrieves the offset of a member
from the beginning of its parent structure.<br>
<br>
size_t offsetof(<br>
structName,<br>
memberName <br>
);</font></p>
<p><font style="font-size: 13pt;" face="Tahoma"><br>
<strong>Parameters</strong><br><br>
structName <br>
Name of the parent data structure.</font></p>
<p><font style="font-size: 13pt;" face="Tahoma"><br>
memberName <br>
Name of the member in the parent data structure for which to determine the
offset.</font></p>
<font style="font-size: 13pt;" face="Tahoma"><br>
<strong>Return Value</strong></font><br>
<font style="font-size: 13pt;" face="Tahoma"><br>
offsetof returns the offset in bytes of the specified member from the beginning
of its parent data structure. It is undefined for bit fields.</font>
<font style="font-size: 13pt;" face="Tahoma"><br>
<strong>Remarks</strong><br><br>
The offsetof macro returns the offset in bytes of memberName from the beginning
of the structure specified by structName. You can specify types with the struct
keyword.<br>
<br>
<strong>Note</strong> </font><br><br>
<font style="font-size: 13pt;" face="Tahoma">
offsetof is not a function and cannot be described using a C prototype.<br>
</font>
<p>跟踪代码发现定义如下：<br>
<br>
#define offsetof(s,m) (size_t)&amp;(((s *)0)-&gt;m)<br>
<br>
然后到网上查了一下，发现还真的是很有用，附带一位大侠的解说：<br>
<br>
struct AAA <br>
{ <br>
&nbsp;&nbsp;&nbsp; int i; <br>
&nbsp;&nbsp;&nbsp; int j; <br>
}; <br>
<br>
struct AAA *pAAA; <br>
pAAA=new AAA; </p>
<p><br>
这时，pAAA实际上是一个Pointer, 指向某一确定的内存地址，比如0x1234; <br>
而 pAAA-&gt;i 整体是一个int型变量，其地址是&amp;(pAAA-&gt;i) ,'&amp;'为取址运算符； <br>
那么&amp;(pAAA-&gt;i)一定等于0x1234，因为i是结构体AAA的第一个元素。 <br>
而&amp;(pAAA-&gt;j)一定是0x1234 + 0x4 = 0x1238; 因为sizeof(int) = 4;<br>
<br>
这个做法的巧妙之处就是：它把&#8220;0&#8221;作为上例中的pAAA,那么 &amp;(pAAA-&gt;j)就是j的offset啦。<br>
<br>
解析结果是： <br>
(s *)0 ,将 0 强制转换为Pointer to "s" <br>
可以记 pS = (s *)0 ，pS是指向s的指针，它的值是0; <br>
那么pS-&gt;m就是m这个元素了，而&amp;(pS-&gt;m)就是m的地址，而在本例中就是offset啦 <br>
<br>
再把结果强制转换为size_t型的就OK 了，size_t其实也就是int啦！！ </p>
<p><strong>也就是说：</strong></p>
<p>0 ---&gt; (s *)0<br>
<br>
原来的0是数值类型，现在是结构体指针类型，尽管类型变了，但其值还是不变，也就是说还是0，但这个值的意义变了，现在是地址，而不是数值。<br>
<br>
&amp;(((s *)0)-&gt;m)求出字段m的地址值，但由于首地址是0，所以&amp;(((s *)0)-&gt;m)求出字段m相对于首地址的偏移值。<br><br>
</p><img src ="http://www.cppblog.com/lovedday/aggbug/32801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lovedday/" target="_blank">lovedday</a> 2007-09-24 19:04 <a href="http://www.cppblog.com/lovedday/archive/2007/09/24/32801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++之争</title><link>http://www.cppblog.com/lovedday/archive/2007/09/11/32031.html</link><dc:creator>lovedday</dc:creator><author>lovedday</author><pubDate>Tue, 11 Sep 2007 14:28:00 GMT</pubDate><guid>http://www.cppblog.com/lovedday/archive/2007/09/11/32031.html</guid><wfw:comment>http://www.cppblog.com/lovedday/comments/32031.html</wfw:comment><comments>http://www.cppblog.com/lovedday/archive/2007/09/11/32031.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/lovedday/comments/commentRss/32031.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lovedday/services/trackbacks/32031.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 目前吵的很凶。<br><br>都说什么C++快不行了，可是游戏开发这种东西，还是非C++莫属，图形开发这块C++还是强项。我发现C#， JAVA之类的之所以能在企业级应用和快速开发方面占有优势，完全是因为别人已经帮你封装好了一套好用的API函数，而不是这些语言的语法机制本身提供了多少优点，而C++和C却不这么做，因为C/C++相信使用它的程序员完全有能力自己封装，没必要替他们封装。&nbsp;&nbsp;<a href='http://www.cppblog.com/lovedday/archive/2007/09/11/32031.html'>阅读全文</a><img src ="http://www.cppblog.com/lovedday/aggbug/32031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lovedday/" target="_blank">lovedday</a> 2007-09-11 22:28 <a href="http://www.cppblog.com/lovedday/archive/2007/09/11/32031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS2005无法进行DEBUG：Binary was not build with debug information.</title><link>http://www.cppblog.com/lovedday/archive/2007/07/01/27343.html</link><dc:creator>lovedday</dc:creator><author>lovedday</author><pubDate>Sun, 01 Jul 2007 15:16:00 GMT</pubDate><guid>http://www.cppblog.com/lovedday/archive/2007/07/01/27343.html</guid><wfw:comment>http://www.cppblog.com/lovedday/comments/27343.html</wfw:comment><comments>http://www.cppblog.com/lovedday/archive/2007/07/01/27343.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lovedday/comments/commentRss/27343.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lovedday/services/trackbacks/27343.html</trackback:ping><description><![CDATA[google到的解决方案：<br><br>Its not an installation issue, the problem is, as the error message suggests, that you have not built your project with debug information.<br><br>To do this:<br>1) Goto Project-&gt;Properties<br>2) Make sure "Configuration" at the top is "Debug"<br>3) On the left, select "C/C++", then "General"<br>4) On the right, change "Debug information format" to "Program Database for edit and continue (/ZI)"<br>5) On the left, Select "Optimization"<br>6) On the right, Change "Optimization" to "Disabled (/Od)"<br>7) On the left, select "Code Generation"<br>8) On the right, change "Runtime library" to "Multi-Threaded Debug (/MTd)"<br>9) On the left, expand "Linker" and select "Debugging"<br>10) On the right, change "Generate Debug info" to "Yes (/DEBUG)"<br>11) Rebuild your project.<br><br><img src ="http://www.cppblog.com/lovedday/aggbug/27343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lovedday/" target="_blank">lovedday</a> 2007-07-01 23:16 <a href="http://www.cppblog.com/lovedday/archive/2007/07/01/27343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个有意思的类型转换</title><link>http://www.cppblog.com/lovedday/archive/2007/05/11/23902.html</link><dc:creator>lovedday</dc:creator><author>lovedday</author><pubDate>Fri, 11 May 2007 07:28:00 GMT</pubDate><guid>http://www.cppblog.com/lovedday/archive/2007/05/11/23902.html</guid><wfw:comment>http://www.cppblog.com/lovedday/comments/23902.html</wfw:comment><comments>http://www.cppblog.com/lovedday/archive/2007/05/11/23902.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lovedday/comments/commentRss/23902.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lovedday/services/trackbacks/23902.html</trackback:ping><description><![CDATA[<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;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;f_value1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5.2f</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;ul_value1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">((unsigned&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">f_value1);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;f_value2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">((</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ul_value1);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">\nf_value1&nbsp;=&nbsp;%f,&nbsp;ul_value1&nbsp;=&nbsp;%d,&nbsp;f_valu2&nbsp;=&nbsp;%f</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;f_value1,&nbsp;ul_value1,&nbsp;f_value2);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;ul_value2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">)&nbsp;f_value1;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;f_value3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">float</span><span style="color: #000000;">)&nbsp;ul_value2;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">\n\nul_value2&nbsp;=&nbsp;%d,&nbsp;f_valu3&nbsp;=&nbsp;%f</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;ul_value2,&nbsp;f_value3);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">\n\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br>&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>}<br></span></div>
<br>输出：<br><br>f_value1 = 5.200000, ul_value1 = 1084647014, f_valu2 = 5.200000<br><br>ul_value2 = 5, f_valu3 = 5.000000<br><br><img src ="http://www.cppblog.com/lovedday/aggbug/23902.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lovedday/" target="_blank">lovedday</a> 2007-05-11 15:28 <a href="http://www.cppblog.com/lovedday/archive/2007/05/11/23902.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>