﻿<?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++博客-酱坛子-文章分类-4. C++</title><link>http://www.cppblog.com/sunraiing9/category/1815.html</link><description>专注C++技术  在这里写下自己的学习心得 感悟 
和大家讨论 共同进步（欢迎批评！！！）</description><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 03:21:06 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 03:21:06 GMT</pubDate><ttl>60</ttl><item><title>DLL的入门知识</title><link>http://www.cppblog.com/sunraiing9/articles/13804.html</link><dc:creator>@王一伟</dc:creator><author>@王一伟</author><pubDate>Wed, 18 Oct 2006 02:23:00 GMT</pubDate><guid>http://www.cppblog.com/sunraiing9/articles/13804.html</guid><wfw:comment>http://www.cppblog.com/sunraiing9/comments/13804.html</wfw:comment><comments>http://www.cppblog.com/sunraiing9/articles/13804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunraiing9/comments/commentRss/13804.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunraiing9/services/trackbacks/13804.html</trackback:ping><description><![CDATA[
		<p style="TEXT-INDENT: 21pt">DLL（Dynamic Link Library），动态链接库。</p>
		<p style="TEXT-INDENT: 21pt">1．关于__declspec(dllimport)和__declspec(dllexport)</p>
		<p style="TEXT-INDENT: 21pt">在一个DLL的编写过程中，如果要使一个变量、一个函数或一个类能够被外部程序调用，在函数声明上加上__declspec(dllimport)关键字。</p>
		<p style="TEXT-INDENT: 21pt">例：</p>
		<p style="TEXT-INDENT: 21pt">引出一个变量：<br />__declspec(dllexport) int iEx;</p>
		<p style="TEXT-INDENT: 21pt">引出一个函数：<br />__declspec(dllexport) int fnEx( int i );</p>
		<p style="TEXT-INDENT: 21pt">引出一个类：<br />class __declspec(dllexport) CClassEx<br />{……};</p>
		<p style="TEXT-INDENT: 21pt">在外部程序引用DLL时，如果采用隐式调用的方法（关于隐式调用稍后讨论），需要包含DLL文件相关的头文件，这个头文件用__declspec(dllimport)关键字指出了DLL导出的内容（实际上就是把原来的__declspec(dllexport)全部替换为__declspec(dllimport)）。</p>
		<p style="TEXT-INDENT: 21pt">例：</p>
		<p style="TEXT-INDENT: 21pt">引入一个变量：<br />__declspec(dllimport) int iEx;</p>
		<p style="TEXT-INDENT: 21pt">引入一个函数：<br />__declspec(dllimport) int fnEx( int i );</p>
		<p style="TEXT-INDENT: 21pt">引入一个类：<br />class __declspec(dllimport) CClassEx<br />{……};</p>
		<p style="TEXT-INDENT: 21pt">为了提高程序可读性，可以定义如下宏：<br />#define DllImport __declspec(dllimport)<br />#define DllExport __declspec(dllexport)<br />以便使用。</p>
		<p style="TEXT-INDENT: 21pt">实际上一般定义如下宏：<br /><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 新宋体">#ifdef</span><span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体"><font color="#000000"> MYDLL_EXPORTS</font></span></p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 新宋体">#define</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font color="#000000"> MYDLL_API </font>
						<font face="新宋体">
								<span style="COLOR: blue">__declspec</span>
								<font color="#000000">(</font>
								<span style="COLOR: blue">dllexport</span>
								<font color="#000000">)</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 新宋体">#else</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 新宋体">#define</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font color="#000000"> MYDLL_API </font>
						<font face="新宋体">
								<span style="COLOR: blue">__declspec</span>
								<font color="#000000">(</font>
								<span style="COLOR: blue">dllimport</span>
								<font color="#000000">)<span style="COLOR: gray"></span></font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 新宋体">#endif</span>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<font size="2">
						<font color="#800000">
								<span style="FONT-FAMILY: 宋体">这样，在源程序的实现文件中先定义</span>
								<span lang="EN-US">
										<font face="Times New Roman">MYDLL_EXPORTS</font>
								</span>
								<span style="FONT-FAMILY: 宋体">，再包含这个头文件；在外程序内，可以直接包含这个头文件。这种方法可以实现一个文件多种用途。</span>
						</font>
				</font>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">
				</span>
				<font color="#800000" size="2"> </font>
				<font size="2">
						<font color="#800000">
								<span lang="EN-US">
										<font face="Times New Roman">2</font>
								</span>
								<span style="FONT-FAMILY: 宋体">．隐式调用和显式调用</span>
						</font>
				</font>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<font size="2">
						<font color="#800000">
								<span style="FONT-FAMILY: 宋体">隐式调用是最常用的一种调用方法。它需要原</span>
								<span lang="EN-US">
										<font face="Times New Roman">DLL</font>
								</span>
								<span style="FONT-FAMILY: 宋体">文件、原头文件和库文件组成。在程序内要包含这个头文件，并加入库文件一同编译。在程序启动时会把所有隐式调用的</span>
								<span lang="EN-US">
										<font face="Times New Roman">DLL</font>
								</span>
								<span style="FONT-FAMILY: 宋体">文件加载到内存。</span>
						</font>
				</font>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<font size="2">
						<font color="#800000">
								<span style="FONT-FAMILY: 宋体">如果想在使用的时候才把</span>
								<span lang="EN-US">
										<font face="Times New Roman">DLL</font>
								</span>
								<span style="FONT-FAMILY: 宋体">文件加入到内存的话，可以使用显式调用。显式调用只需要原</span>
								<span lang="EN-US">
										<font face="Times New Roman">DLL</font>
								</span>
								<span style="FONT-FAMILY: 宋体">文件即可，但是使用时必须对知道这个</span>
								<span lang="EN-US">
										<font face="Times New Roman">DLL</font>
								</span>
								<span style="FONT-FAMILY: 宋体">有哪些导出的符号。可以在</span>
								<span lang="EN-US">
										<font face="Times New Roman">VS</font>
								</span>
								<span style="FONT-FAMILY: 宋体">的命令行方式下输入“</span>
								<span lang="EN-US">
										<font face="Times New Roman">depends</font>
								</span>
								<span style="FONT-FAMILY: 宋体">”命令来查看</span>
								<span lang="EN-US">
										<font face="Times New Roman">DLL</font>
								</span>
								<span style="FONT-FAMILY: 宋体">信息。</span>
						</font>
				</font>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">
				</span>
				<font color="#800000" size="2"> </font>
				<span style="FONT-FAMILY: 宋体">
						<font color="#800000" size="2">示例：</font>
				</span>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">
				</span>
				<font color="#800000" size="2"> </font>
				<span style="FONT-FAMILY: 宋体">
						<font color="#800000" size="2">隐式调用：</font>
				</span>
		</p>
		<p>
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 新宋体">#include</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font color="#000000">
						</font>
						<span style="COLOR: maroon">
								<font face="新宋体">"..\DllTest\DllTest.h"</font>
						</span>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 9pt; COLOR: maroon; FONT-FAMILY: 新宋体">……<span lang="EN-US"></span></span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 新宋体">void</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font color="#000000"> CallDll( </font>
						<font face="新宋体">
								<span style="COLOR: blue">void</span>
								<font color="#000000"> )</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font color="#000000">{</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<span>
										<font color="#000000">     </font>
								</span>
								<span style="COLOR: blue">wchar_t</span>
								<font color="#000000"> wszBuf[ 32 ];</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<font face="新宋体">
						<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
								<font color="#000000">
										<span>     </span>wsprintf( wszBuf, TEXT( </font>
								<span style="COLOR: maroon">"%d"</span>
								<font color="#000000"> ), fnDllTest( 9 ) );</font>
								<span style="COLOR: green">//fnDllTest</span>
						</span>
						<span style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 新宋体">是<span lang="EN-US">DLL</span>文件导出的方法<span lang="EN-US"></span></span>
				</font>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<font color="#000000">
										<span>     </span>wprintf( wszBuf );</font>
						</font>
				</span>
		</p>
		<p>
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font color="#000000">}</font>
				</span> </p>
		<p style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">
						<font color="#800000" size="2">显式调用：</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 新宋体">void</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font color="#000000"> CallDll( </font>
						<font face="新宋体">
								<span style="COLOR: blue">void</span>
								<font color="#000000"> )</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font color="#000000">{</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<span>
										<font color="#000000">     </font>
								</span>
								<span style="COLOR: blue">typedef</span>
								<font color="#000000">
								</font>
								<span style="COLOR: blue">int</span>
								<font color="#000000"> (*ADDPROC)( </font>
								<span style="COLOR: blue">int</span>
								<font color="#000000"> i );</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<font color="#000000">
										<span>     </span>ADDPROC Fn;</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font color="#000000">
						</font>
				</span> </p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<font color="#000000">
										<span>     </span>HINSTANCE hInst = LoadLibrary( L</font>
								<span style="COLOR: maroon">"DllTest.dll"</span>
								<font color="#000000"> );</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<span>
										<font color="#000000">     </font>
								</span>
								<span style="COLOR: blue">if</span>
								<font color="#000000"> ( NULL == hInst )</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<font color="#000000">
										<span>     </span>{</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<font color="#000000">
										<span>         </span>wprintf( L</font>
								<span style="COLOR: maroon">"Failed on load DLL."</span>
								<font color="#000000"> );</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<span>
										<font color="#000000">         </font>
								</span>
								<span style="COLOR: blue">return</span>
								<font color="#000000">;</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<font color="#000000">
										<span>     </span>}</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<font color="#000000">
										<span>     </span>Fn = ( ADDPROC )GetProcAddress( hInst, </font>
								<span style="COLOR: maroon">"fnDllTest"</span>
								<font color="#000000"> );</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<font face="新宋体">
						<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
								<span>
										<font color="#000000">     </font>
								</span>
								<span style="COLOR: green">//</span>
						</span>
						<span style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 新宋体">如果导出时使用的是<span lang="EN-US">_stdcall, </span>那么这里我们也应该使用<span lang="EN-US">(_stdcall ADDPROC)</span></span>
				</font>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<span>
										<font color="#000000">     </font>
								</span>
								<span style="COLOR: blue">if</span>
								<font color="#000000">( !Fn )</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<font color="#000000">
										<span>     </span>
										<span>     </span>wprintf( L</font>
								<span style="COLOR: maroon">"Failed on get Process Address."</span>
								<font color="#000000"> );</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<span>
										<font color="#000000">     </font>
								</span>
								<span style="COLOR: blue">else</span>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<font color="#000000">
										<span>     </span>{</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<span>
										<font color="#000000">         </font>
								</span>
								<span style="COLOR: blue">int</span>
								<font color="#000000"> i;</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<font color="#000000">
										<span>         </span>i = Fn( 9 );</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<span>
										<font color="#000000">         </font>
								</span>
								<span style="COLOR: blue">wchar_t</span>
								<font color="#000000"> wszBuf[ 32 ];</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<font color="#000000">
										<span>         </span>wsprintf( wszBuf, L</font>
								<span style="COLOR: maroon">"%d"</span>
								<font color="#000000">, i );</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<font color="#000000">
										<span>         </span>wprintf( wszBuf );</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<font color="#000000">
										<span>     </span>}</font>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<font face="新宋体">
						<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
								<font color="#000000">
										<span>     </span>FreeLibrary(hInst);</font>
								<span style="COLOR: green">//</span>
						</span>
						<span style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 新宋体">释放<span lang="EN-US">DLL</span></span>
				</font>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<span>
										<font color="#000000">     </font>
								</span>
								<span style="COLOR: green">/*</span>
						</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<span>     </span>
								<span> </span>* ADDRPROC Add = (ADDPROC)GetProcAddress(hInst, "add");</font>
				</span>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<font face="新宋体">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 新宋体">
								<span>     </span>
								<span> </span>* </span>
						<span style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 新宋体">第而个参数也可以使用序号<span lang="EN-US">:</span></span>
				</font>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<font face="新宋体">
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 新宋体">
								<span>     </span>
								<span> </span>* MAKEINTRESOURCE(1)</span>
						<span style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 新宋体">代替函数名<span lang="EN-US">.</span></span>
				</font>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 新宋体">
						<font face="新宋体">
								<span>     </span>
								<span> </span>*/</font>
				</span>
		</p>
		<p>
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体">
						<font color="#000000">}</font>
				</span>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<font size="2">
						<font color="#800000">
								<span lang="EN-US">
										<font face="Times New Roman">3</font>
								</span>
								<span style="FONT-FAMILY: 宋体">．注意事项</span>
						</font>
				</font>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<font size="2">
						<font color="#800000">
								<span style="FONT-FAMILY: 宋体">如果使用</span>
								<span lang="EN-US">
										<font face="Times New Roman">C++</font>
								</span>
								<span style="FONT-FAMILY: 宋体">编程，那么在程序编译的时候会为变量名等符号重命为诸如“</span>
								<span lang="EN-US">
										<font face="Times New Roman">?fnDllTest@QAEAAV</font>
										<font face="Times New Roman">0</font>
										<span lang="EN-US" style="FONT-FAMILY: 宋体">
												<span lang="EN-US">
														<font face="宋体">”</font>
												</span>
										</span>
										<span lang="EN-US" style="FONT-FAMILY: 宋体">之<span lang="EN-US"><font face="宋体">类<span lang="EN-US">的<span lang="EN-US">形式<span lang="EN-US">，<span lang="EN-US">为<span lang="EN-US">显<span lang="EN-US">式<span lang="EN-US">调用<span lang="EN-US">带<span lang="EN-US">来<span lang="EN-US">了<span lang="EN-US">不<span lang="EN-US">便<span lang="EN-US">。针对<span lang="EN-US">这<span lang="EN-US">个<span lang="EN-US">问题<span lang="EN-US">，<span lang="EN-US">我<span lang="EN-US">们<span lang="EN-US">可以<span lang="EN-US">为<span lang="EN-US">要<span lang="EN-US">导出<span lang="EN-US">的<span lang="EN-US">符号<span lang="EN-US">加<span lang="EN-US">上<span lang="EN-US">“</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></font></span></span>
										<font face="Times New Roman">extern “C”</font>
								</span>
								<span style="FONT-FAMILY: 宋体">”修饰符，就可以保持原有名称。但是导出的类名仍然是重命名后的名称，要再研究研究。</span>
						</font>
				</font>
		</p>
		<p style="TEXT-INDENT: 21pt">
				<font color="#800000" size="2">
						<span style="FONT-FAMILY: 宋体">如果你使用MFC生成MFC DLL那么只要做如下定义就可以了class AFX_EXT_CLASS yourClass。</span>
				</font>
		</p>
<img src ="http://www.cppblog.com/sunraiing9/aggbug/13804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunraiing9/" target="_blank">@王一伟</a> 2006-10-18 10:23 <a href="http://www.cppblog.com/sunraiing9/articles/13804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>inline函数</title><link>http://www.cppblog.com/sunraiing9/articles/13754.html</link><dc:creator>@王一伟</dc:creator><author>@王一伟</author><pubDate>Mon, 16 Oct 2006 12:39:00 GMT</pubDate><guid>http://www.cppblog.com/sunraiing9/articles/13754.html</guid><wfw:comment>http://www.cppblog.com/sunraiing9/comments/13754.html</wfw:comment><comments>http://www.cppblog.com/sunraiing9/articles/13754.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/sunraiing9/comments/commentRss/13754.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunraiing9/services/trackbacks/13754.html</trackback:ping><description><![CDATA[
		<p>自己对 inline 函数做个总结<br /><br />（一）inline函数（摘自C++ Primer的第三版）</p>
		<p>         <strong>在函数声明或定义中函数返回类型前加上关键字inline即把min（）指定为内联。</strong></p>
		<p>   inline int min(int first, int secend) {/****/};</p>
		<p>      inline函数对编译器而言必须是可见的，以便它能够在调用点内展开该函数。与非inline函数不同的是，inline函数必须在调用该函数的每个文本文件中定义。当然，对于同一程序的不同文件，如果inline函数出现的话，其定义必须相同。对于由两个文件compute.C和draw.C构成的程序来说，程序员不能定义这样的min()函数，它在compute.C中指一件事情，而在draw.C中指另外一件事情。如果两个定义不相同，程序将会有未定义的行为：</p>
		<p>      为保证不会发生这样的事情，建议把inline函数的定义放到头文件中。在每个调用该inline函数的文件中包含该头文件。这种方法保证对每个inline函数只有一个定义，且程序员无需复制代码，并且不可能在程序的生命期中引起无意的不匹配的事情。</p>
		<p>（二）内联函数的编程风格(摘自高质量C++/C 编程指南)</p>
		<p>
				<strong>关键字inline 必须与函数定义体放在一起才能使函数成为内联，仅将inline 放在函数声明前面不起任何作用</strong>。</p>
		<p>如下风格的函数Foo 不能成为内联函数：inline void Foo(int x, int y); // inline 仅与函数声明放在一起void Foo(int x, int y){}而如下风格的函数Foo 则成为内联函数：void Foo(int x, int y);inline void Foo(int x, int y) // inline 与函数定义体放在一起{}所以说，inline 是一种“用于实现的关键字”，而不是一种“用于声明的关键字”。一般地，用户可以阅读函数的声明，但是看不到函数的定义。尽管在大多数教科书中内联函数的声明、定义体前面都加了inline 关键字，但我认为inline 不应该出现在函数的声明中。这个细节虽然不会影响函数的功能，但是体现了高质量C++/C 程序设计风格的一个基本原则：声明与定义不可混为一谈，用户没有必要、也不应该知道函数是否需要内联。</p>
		<p>
				<strong>定义在类声明之中的成员函数将自动地成为内联函数</strong>，例如class A{public:void Foo(int x, int y) {  } // 自动地成为内联函数}将成员函数的定义体放在类声明之中虽然能带来书写上的方便，但不是一种良好的编程风格，上例应该改成：// 头文件class A{public:void Foo(int x, int y)；}// 定义文件inline void A::Foo(int x, int y){}<strong> 慎用内联</strong>内联能提高函数的执行效率，为什么不把所有的函数都定义成内联函数？如果所有的函数都是内联函数，还用得着“内联”这个关键字吗？内联是以代码膨胀（复制）为代价，仅仅省去了函数调用的开销，从而提高函数的执行效率。如果执行函数体内代码的时间，相比于函数调用的开销较大，那么效率的收获会很少。另一方面，每一处内联函数的调用都要复制代码，将使程序的总代码量增大，消耗更多的内存空间。以下情况不宜使用内联：（1）如果函数体内的代码比较长，使用内联将导致内存消耗代价较高。（2）如果函数体内出现循环，那么执行函数体内代码的时间要比函数调用的开销大。类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为，如“偷偷地”执行了基类或成员对象的构造函数和析构函数。所以不要随便地将构造函数和析构函数的定义体放在类声明中。一个好的编译器将会根据函数的定义体，自动地取消不值得的内联（这进一步说明了inline 不应该出现在函数的声明中）。<br /><br /><br />注意点:<br /><br />内联函数既能够去除函数调用所带来的效率负担又能够保留一般函数的优点。然而，内联函数并不是万能药，   <br />  在一些情况下，它甚至能够降低程序的性能。因此在使用的时候应该慎重。   <br />          1．我们先来看看内联函数给我们带来的好处：从一个用户的角度来看，内联函数看起来和普通函数一样，   <br />  它可以有参数和返回值，也可以有自己的作用域，然而它却不会引入一般函数调用所带来的负担。另外，   <br />  它可以比宏更安全更容易调试。   <br />    当然有一点应该意识到，inline   specifier仅仅是对编译器的建议，编译器有权利忽略这个建议。那么编译器是   <br />    如何决定函数内联与否呢？一般情况下关键性因素包括函数体的大小，是否有局部对象被声明，函数的复杂性等等。   <br />          2．那么如果一个函数被声明为inline但是却没有被内联将会发生什么呢？理论上，当编译器拒绝内联一个   <br />  函数的时候，那个函数会像普通函数一样被对待，但是还会出现一些其他的问题。例如下面这段代码：   <br />  //   filename   Time.h   <br />  #include&lt;ctime&gt;   <br />  #include&lt;iostream&gt;   <br />  using   namespace   std;   <br />  class   Time   <br />  {   <br />  public:   <br />          inline   void   Show()   {   for   (int   i   =   0;   i&lt;10;   i++)   cout&lt;&lt;time(0)&lt;&lt;endl;}   <br />  };   <br />          因为成员函数Time::Show()包括一个局部变量和一个for循环，所以编译器一般拒绝inline，并且把它当作一个普通的成员函数。但是这个包含类声明的头文件会被单独的#include进各个独立的编译单元中：   <br />          //   filename   f1.cpp   <br />  #include   "Time.hj"   <br />  void   f1()   <br />  {   <br />          Time   t1;   <br />          t1.Show();   <br />  }   <br />    <br />  //   filename   f2.cpp   <br />  #include   "Time.h"   <br />  void   f2()   <br />  {   <br />          Time   t2;   <br />          t2.Show();   <br />  }   <br />  结果编译器为这个程序生成了两个相同成员函数的拷贝：   <br />  void   f1();   <br />  void   f2();   <br />  int   main()   <br />  {   <br />          f1();     <br />          f2();   <br />      return   0;   <br />  }   <br />    <br />  当程序被链接的时候，linker将会面对两个相同的Time::Show()拷贝，于是函数重   <br />  定义的连接错误发生。但是老一些的C++实现对付这种情况的办法是通过把一个   <br />  un-inlined函数当作static来处理。因此每一份函数拷贝仅仅在自己的编译单元中   <br />  可见，这样链接错误就解决了，但是在程序中却会留下多份函数拷贝。在这种情况   <br />  下，程序的性能不但没有提升，反而增加了编译和链接时间以及最终可执行体的大小。   <br />  但是幸运的是，新的C++标准中关于un-inlined函数的说法已经改变。一个符合标准   <br />  C++实现应该只生成一份函数拷贝。然而，要想所有的编译器都支持这一点可能还   <br />  需要很长时间。   <br />  另外关于内联函数还有两个更令人头疼的问题。第一个问题是该如何进行维护。   <br />  一个函数开始的时候可能以内联的形式出现，但是随着系统的扩展，函数体可能要   <br />  求添加额外的功能，结果内联函数就变得不太可能，因此需要把inline   specifier   <br />  去除以及把函数体放到一个单独的源文件中。另一个问题是当内联函数被应用在代   <br />  码库的时候产生。当内联函数改变的时候，用户必须重新编译他们的代码以反映这   <br />  种改变。然而对于一个非内联函数，用户仅仅需要重新链接就可以了。   <br />  这里想要说的是，内联函数并不是一个增强性能的灵丹妙药。只有当函数非常短小   <br />  的时候它才能得到我们想要的效果，但是如果函数并不是很短而且在很多地方都被   <br />  调用的话，那么将会使得可执行体的体积增大。最令人烦恼的还是当编译器拒绝内联   <br />  的时候。在老的实现中，结果很不尽人意，虽然在新的实现中有很大的改善，但是   <br />  仍然还是不那么完善的。一些编译器能够足够的聪明来指出哪些函数可以内联哪些   <br />  不能，但是，大多数编译器就不那么聪明了，因此这就需要我们的经验来判断。   <br />  如果内联函数不能增强行能，就避免使用它！   <br />  */   <br />    <br />  /*   <br />  用指针代替数组     <br />  在许多种情况下，可以用指针运算代替数组索引，这样做常常能产生又快又短的   <br />  代码。与数组索引相比，指针一般能使代码速度更快，占用空间更少。使用多维数   <br />  组时差异更明显。下面的代码作用是相同的，但是效率不一样。   <br />    <br />  char*   pBuffer   =   new   char[100];   <br />  nTestNumber   =   0;   <br />    <br />  for(dwIndex   =   0;dwIndex   &lt;   100;dwIndex   ++)   <br />  {   <br />  nTestNumber   =   pBuffer[dwIndex];   <br />  }   <br />    <br />  char*   pTemp   =   pBuffer;   <br />  for(dwIndex   =   0;dwIndex   &lt;   100;dwIndex   ++)   <br />  {   <br />  nTestNumber   =   *(pTemp   ++);   <br />  }   <br />    <br />  指针方法的优点是，pBuffer的地址每次装入地址pTemp后，在每次循环中只需对pTemp增量操作。   <br />  在数组索引方法中，每次循环中都必须进行基于dwIndex值求数组下标的复杂运算。   <br />  */   <br /></p>
<img src ="http://www.cppblog.com/sunraiing9/aggbug/13754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunraiing9/" target="_blank">@王一伟</a> 2006-10-16 20:39 <a href="http://www.cppblog.com/sunraiing9/articles/13754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类和结构的区别</title><link>http://www.cppblog.com/sunraiing9/articles/13743.html</link><dc:creator>@王一伟</dc:creator><author>@王一伟</author><pubDate>Mon, 16 Oct 2006 01:00:00 GMT</pubDate><guid>http://www.cppblog.com/sunraiing9/articles/13743.html</guid><wfw:comment>http://www.cppblog.com/sunraiing9/comments/13743.html</wfw:comment><comments>http://www.cppblog.com/sunraiing9/articles/13743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunraiing9/comments/commentRss/13743.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunraiing9/services/trackbacks/13743.html</trackback:ping><description><![CDATA[ 结构(struct) 与 类(class)<br /><br />结构与类很相似，都表示可以包含数据成员和函数成员的数据结构。与类不同的是，结构是值类型并且不需要堆分配。结构类型的变量直接包含结构的数据，而类类型的变量包含对数据的引用（该变量称为对象）。 struct 类型适合表示如点、矩形和颜色这样的轻量对象。尽管可能将一个点表示为类，但结构在某些方案中更有效。在一些情况下，结构的成本较低。例如，如果声明一个含有 1000 个点对象的数组，则将为引用每个对象分配附加的内存。结构可以声明构造函数，但它们必须带参数。声明结构的默认（无参数）构造函数是错误的。总是提供默认构造函数以将结构成员初始化为它们的默认值。在结构中初始化实例字段是错误的。在类中,必须初始化实例对象. 使用 new 运算符创建结构对象时，将创建该结构对象，并且调用适当的构造函数。与类不同的是，结构的实例化可以不使用 new 运算符。如果不使用 new，那么在初始化所有字段之前，字段将保持未赋值状态且对象不可用。对于结构，不像类那样存在继承。一个结构不能从另一个结构或类继承，而且不能作为一个类的基。但是，结构从基类 Object 继承。<br /><br />结构可实现接口，其方式同类完全一样。<br /><br />一个是值类型（结构），一个是引用类型（类），结构在传递的时候如果没有指定ref，则传递的是内存中的一分副本，而class则是传递对他的引用。<br /><br />类在堆中，结构在栈中，类传递的是类在堆中的地址，而结构是在栈中另复制了一个传递，你改变传递过来的结构不会影响原结构。而类是引用，共用一块内存，会改变堆中类的内容. <br /><br /><br />   <img src ="http://www.cppblog.com/sunraiing9/aggbug/13743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunraiing9/" target="_blank">@王一伟</a> 2006-10-16 09:00 <a href="http://www.cppblog.com/sunraiing9/articles/13743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读取当前文件夹内容</title><link>http://www.cppblog.com/sunraiing9/articles/13741.html</link><dc:creator>@王一伟</dc:creator><author>@王一伟</author><pubDate>Mon, 16 Oct 2006 00:46:00 GMT</pubDate><guid>http://www.cppblog.com/sunraiing9/articles/13741.html</guid><wfw:comment>http://www.cppblog.com/sunraiing9/comments/13741.html</wfw:comment><comments>http://www.cppblog.com/sunraiing9/articles/13741.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunraiing9/comments/commentRss/13741.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunraiing9/services/trackbacks/13741.html</trackback:ping><description><![CDATA[
		<p>（注释：不是文章，自己随手记的）<br /><br />HANDLE hFind;<br />WIN32_FIND_DATA wfd;<br />if ( !SetCurrentDirectory(strPath) )<br /> return;<br />hFind = FindFirstFile(_ucT("*.*"), &amp;wfd);</p>
		<p>if ( hFind == INVALID_HANDLE_VALUE )<br /> return;</p>
		<p>while(FindNextFile(hFind, &amp;wfd)) <br />{<br /> if ( (wfd.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY) &amp;&amp; !(wfd.dwFileAttributes &amp; FILE_ATTRIBUTE_HIDDEN) )<br /> {<br />  if ( wfd.cFileName[0] != '.' ) <br />  {<br />   UCString temp = (UCString)strPath + wfd.cFileName;<br />   if ( HasSubFolder(ucLPCTSTR(temp)) )<br />   {</p>
		<p>   }<br />  }<br /> }<br />}<br />SetCurrentDirectory(_ucT("..")); </p>
<img src ="http://www.cppblog.com/sunraiing9/aggbug/13741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunraiing9/" target="_blank">@王一伟</a> 2006-10-16 08:46 <a href="http://www.cppblog.com/sunraiing9/articles/13741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>跨平台程序的UNICODE字符串处理方法</title><link>http://www.cppblog.com/sunraiing9/articles/13740.html</link><dc:creator>@王一伟</dc:creator><author>@王一伟</author><pubDate>Mon, 16 Oct 2006 00:43:00 GMT</pubDate><guid>http://www.cppblog.com/sunraiing9/articles/13740.html</guid><wfw:comment>http://www.cppblog.com/sunraiing9/comments/13740.html</wfw:comment><comments>http://www.cppblog.com/sunraiing9/articles/13740.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunraiing9/comments/commentRss/13740.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunraiing9/services/trackbacks/13740.html</trackback:ping><description><![CDATA[在windows下面编程，我们通常都知道unicode这个概念，如果一个程序是unicode的，那么他将调用<br /><br />unicode的api。这个时候，所有传递给api的字符串参数都要是unicode的.如果使用C的风格，是很简单的<br /><br />，字符串全部由char* str 转变成TCHAR* str,使用的crt函数(其实也是api)时调用_tcslen类的函数族就<br /><br />可以了。<br /><br />在讨论其它问题前要先明确一个概念:unicode 与 utf-8编码,utf-16编码是两个不同类别的术语。<br /><br />unicode对一个字符提供了一个唯一的编码(参看下面的资料，关于UCS-2与UCS-4)<br />假设"中"这个字符的编码是0x34 0x34(我乱写的),utf-8对其编码，得到的是 0xE3 0x90 0xB6 需要3byte<br /><br />的空间进行存储。不同的unicode码经过utf-8编码后会得到变长的结果.比如说'a'经过utf-8编码后得到<br /><br />的是和ascii码相同,只占1个byte.对unicode使用不同的方法编码,可以有效的节约存储空间(如果选择了<br /><br />错误的编码,会浪费空间).<br /><br />中的unicode(UCS-2)值和编码后的结果<br />unicode                             utf-8           <br />00110100 00110100      11100011  10010000 10110110 <br />a的unicode值和编码后的结果<br />unicode                             utf-8<br />00000000 01100001      01100001<br /><br />这里得出的结论是utf-8,utf-16编码是在存储字符串信息前的一个选择,而不是处理字符串的选择.<br /><br /><br />OK,问题回到字符串编程上来。第一个问题，就是要选择内存中的字符串格式，包括自己所有需要传递字<br /><br />符串参数的函数的参数定义。我们这里有3个选择，char*(ASCII string),unsigned short*(UCS2 <br /><br />string,windows下的unicode),unsigned long*(UCS4 string,真正的unicode支持)。windows下的api是不<br /><br />支持UCS4的，所以在windows平台下最好只做前2个的选择。类似于windows的TCHAR定义，我们可以做这样<br /><br />的定义<br />#ifdef _UCS2<br />#define TCHAR unsigned short<br />#else<br />#ifdef _UCS4<br />#define TCHAR unsigned long<br />#else<br />#define TCHAR char<br />#endif<br />#endif<br />然后有一个问题，如果在程序中需要使用一个预定义的字符串，比如说<br />TCHAR* str = "中国";<br />那么,str指向的常量字符串的编码是ACSII string,还是UCS2 unicode string,还是UCS4 unicode <br /><br />string,是取决于编译器的。这样就容易造成许多不易发现的错误。这里要推荐一个string table的概念<br /><br />，用如下代码替换。<br />const TCHAR* str = StringTable::LoadStr(ID_HOMELOAD_NAME);<br />StringTable类解析一个指定编码的本地字符串表XML文件(可以用各种编码存储)，这个文件可以使用自定<br /><br />义的工具或则是各种XML编辑工具来生成。使用StringTable::SetOutPutType(enum MemStrType)来使之在<br /><br />LoadStr的时候转成各种字符串编码。当然，这个类中定义了一系列的编码转换函数，比如说<br /><br />UTF8TOASCII,UTF8TOUCS2,UTF8TOUCS4,UCS4TOUCS2,UCS4TOASCII,UCS4TOXXX,StringTalbe内部使用UCS4作<br /><br />为读取后的字符串存储格式，然后再根据StringTable::SetOutPutType指定的输出类型生成相应编码的<br /><br />Table.这样做的好处就是把这个编码的问题重视化，即时出现编码不一致的错误，也能立刻修正。<br /><br />在linux下,系统对UCS4的支持比较好，#include&lt;wchar.h&gt;，里面的函数的接口都是ucs4 string.所以如果写跨平台程序，肯定是要用ucs2的(UCS4windows不支持，而且可以节约内存，但是你的程序就不是真正的UNICODE3.1 Support了，而且也不能支持国家标准GB18030).然后再调用linux的相关函数时，转化为UCS4.参考文章http://www0.ccidnet.com/tech/os/2001/07/31/58_2811.html。我懒得写了。<br /><br /><br /><br />Unicode 的定义<br />Unicode 通常用作涉及双字节字符编码方案的通用术语。Unicode CCS 3.1 的官方称谓是 ISO10646-1 通<br /><br />用多八字节编码字符集（Universal Multiple Octet Coded Character Set，UCS）。Unicode 3.1 版本<br /><br />添加了 44,946 个新的编码字符。算上 Unicode 3.0 版本已经存在的 49,194 个字符，共计 94,140 个<br /><br />。<br /><br />Unicode 编码字符集利用了一个由 128 个三维的组构成的四维编码空间。其中每个组包含 256 个二维平<br /><br />面。每个平面由 256 个一维的行组成，并且每个行有 256 个单元。每个单元在这个编码空间内对一个字<br /><br />符编码，或者被声明为未经使用。这种编码概念被称为 UCS-4；四个八位元用来表示指定组、平面、行和<br /><br />单元的每个字符。<br /><br />第一个平面（第 00 组的第 00 平面）是基本多语言平面（Basic Multilingual Plane，BMP）。BMP 按<br /><br />字母、音节、表意符号和各种符号及数字定义了常规使用的字符。后续的平面用于附加字符或其它还没有<br /><br />发明的编码实体。我们需要这完整的范围去处理世界上的所有语言；特别是拥有将近 64,000 个字符的一<br /><br />些东亚语言。<br /><br />BMP 被用作双字节的编码字符集，这种编码字符集确定为 ISO 10646 UCS-2 格式。ISO 10646 UCS-2 就<br /><br />是指 Unicode（并且两者相同）。BMP，像所有 UCS 平面那样，包含了 256 行，其中每行包含 256 个单<br /><br />元，字符仅仅按照 BMP 中的行和单元的八位元在单元中被编码。 这就允许 16 位编码字符能够被用来书<br /><br />写大多数商业上最重要的语言。UCS-2 不需要代码页切换、代码扩展或代码状态。UCS-2 是一种将 <br /><br />Unicode 结合到软件中的简单方法，但它只限于支持 Unicode BMP。<br /><br />若要用 8 位字节表示一个多于 2^8 =256 个字符的字符编码系统（character coding system，CCS），<br /><br />就需要一种字符编码方案(character-encoding scheme，CES）。<br /><br /><br />UTF-8<br />UTF-8 转换格式正逐步成为一种占主导地位的交换国际文本信息的方法，因为它可以支持世界上所有的语<br /><br />言，而且它还与 ASCII 兼容。UTF-8 使用变长编码。从 0 到 0x7f（127）的字符把自身编码成单字节，<br /><br />而将值更大的字符编码成 2 到 6 个字节。<br /><br />表 1. UTF-8 编码<br />0x00000000 - 0x0000007F:  0 xxxxxxx  <br />0x00000080 - 0x000007FF:  110 xxxxx10 xxxxxx  <br />0x00000800 - 0x0000FFFF:  1110 xxxx10 xxxxxx10 xxxxxx  <br />0x00010000 - 0x001FFFFF:  11110 xxx10 xxxxxx10 xxxxxx 10 xxxxxx  <br />0x00200000 - 0x03FFFFFF:  111110 xx10 xxxxxx10 xxxxxx10 xxxxxx 10 xxxxxx  <br />0x04000000 - 0x7FFFFFFF:  1111110 x10 xxxxxx10 xxxxxx10 xxxxxx 10 xxxxxx10 xxxxxx <img src ="http://www.cppblog.com/sunraiing9/aggbug/13740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunraiing9/" target="_blank">@王一伟</a> 2006-10-16 08:43 <a href="http://www.cppblog.com/sunraiing9/articles/13740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将一个32位的int按位反转</title><link>http://www.cppblog.com/sunraiing9/articles/13737.html</link><dc:creator>@王一伟</dc:creator><author>@王一伟</author><pubDate>Mon, 16 Oct 2006 00:38:00 GMT</pubDate><guid>http://www.cppblog.com/sunraiing9/articles/13737.html</guid><wfw:comment>http://www.cppblog.com/sunraiing9/comments/13737.html</wfw:comment><comments>http://www.cppblog.com/sunraiing9/articles/13737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunraiing9/comments/commentRss/13737.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunraiing9/services/trackbacks/13737.html</trackback:ping><description><![CDATA[#include &lt;iostream&gt;<br /><br />using namespace std;<br /><br />unsigned int bit_reverse(unsigned int n)<br /><br />{<br /><br />       n = ((n &gt;&gt; 1) &amp; 0x55555555) | ((n &lt;&lt; 1) &amp; 0xaaaaaaaa);<br /><br />       n = ((n &gt;&gt; 2) &amp; 0x33333333) | ((n &lt;&lt; 2) &amp; 0xcccccccc);<br /><br />       n = ((n &gt;&gt; 4) &amp; 0x0f0f0f0f) | ((n &lt;&lt; 4) &amp; 0xf0f0f0f0);<br /><br />       n = ((n &gt;&gt; 8) &amp; 0x00ff00ff) | ((n &lt;&lt; 8) &amp; 0xff00ff00);<br /><br />       n = ((n &gt;&gt; 16) &amp; 0x0000ffff) | ((n &lt;&lt; 16) &amp; 0xffff0000);<br /><br /> <br /><br />       return n;<br /><br />}<br /><br /> <br /><br />int main(int argc,char* argv[])<br /><br />{<br /><br />       int i = 1;<br /><br />       cout&lt;&lt;i&lt;&lt;" "&lt;&lt;bit_reverse(i)&lt;&lt;endl;<br /><br />       return 0;<br /><br />}<br /><br />       return 0;<br /><br />}<img src ="http://www.cppblog.com/sunraiing9/aggbug/13737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunraiing9/" target="_blank">@王一伟</a> 2006-10-16 08:38 <a href="http://www.cppblog.com/sunraiing9/articles/13737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>统计一个32位int中“1”位的个数</title><link>http://www.cppblog.com/sunraiing9/articles/13732.html</link><dc:creator>@王一伟</dc:creator><author>@王一伟</author><pubDate>Mon, 16 Oct 2006 00:35:00 GMT</pubDate><guid>http://www.cppblog.com/sunraiing9/articles/13732.html</guid><wfw:comment>http://www.cppblog.com/sunraiing9/comments/13732.html</wfw:comment><comments>http://www.cppblog.com/sunraiing9/articles/13732.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/sunraiing9/comments/commentRss/13732.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunraiing9/services/trackbacks/13732.html</trackback:ping><description><![CDATA[
		<p>方法1：<br />//main.cpp<br />#include &lt;iostream&gt;<br /><br />using namespace std;<br /> <br />int count_ones(int n)<br /><br />{<br /><br />       n = (n &amp; 0x55555555) + ((n &amp; 0xaaaaaaaa) &gt;&gt; 1);<br /><br />       n = (n &amp; 0x33333333) + ((n &amp; 0xcccccccc) &gt;&gt; 2);<br /><br />       n = (n &amp; 0x0f0f0f0f) + ((n &amp; 0xf0f0f0f0) &gt;&gt; 4);<br /><br />       n = (n &amp; 0x00ff00ff) + ((n &amp; 0xff00ff00) &gt;&gt; 8);<br /><br />       n = (n &amp; 0x0000ffff) + ((n &amp; 0xffff0000) &gt;&gt; 16);<br /><br /> <br /><br />       return n;<br /><br />}<br /><br /> <br /><br />int main(int argc,char* argv[])<br /><br />{<br />       cout&lt;&lt;count_ones(255)&lt;&lt;endl;<br /><br />       return 0;<br />}<br /><br />方法2：<br />const int one_in_char[256]= <br />{ <br />    0, 1, 1, 2, 1, 2,2,3 <br />...... <br />                              ,8 <br />} <br />此为 0-255 每个数中 1 的个数。  <br /><br />int func2(int v) <br />{ <br />    int n=v; <br />    unsigned char *ptr=(unsigned char *)&amp;n; <br />    return one_in_char[ptr[0]]+one_in_char[ptr[1]]+one_in_char[ptr[2]]+one_in_char[ptr[3]]; <br />} <br /><br /><br />本人觉得方法1更快速：）</p>
<img src ="http://www.cppblog.com/sunraiing9/aggbug/13732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunraiing9/" target="_blank">@王一伟</a> 2006-10-16 08:35 <a href="http://www.cppblog.com/sunraiing9/articles/13732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>