﻿<?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++博客-BoolKinG's Blog-随笔分类-C++</title><link>http://www.cppblog.com/boolking/category/1726.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 19 Jan 2009 16:48:59 GMT</lastBuildDate><pubDate>Mon, 19 Jan 2009 16:48:59 GMT</pubDate><ttl>60</ttl><item><title>porting thrift to msvc</title><link>http://www.cppblog.com/boolking/archive/2009/01/19/72173.html</link><dc:creator>BoolKinG</dc:creator><author>BoolKinG</author><pubDate>Mon, 19 Jan 2009 06:39:00 GMT</pubDate><guid>http://www.cppblog.com/boolking/archive/2009/01/19/72173.html</guid><description><![CDATA[







<span style="WORD-SPACING: 0px; FONT: 16px Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">因为最近要用到RPC，考察了一下thrift（facebook用的一套rpc框架）和google protocol buffer。<br><br>thrift支持的语言非常多，不光支持c++，java，python，ruby等非常流行的语言外还支持ocaml，Squeak等很少见的语言，比google protocol buffer好多了，而且已经内置RPC，不像google protocol buffer的RPC还藏着掖着。比较google protocol buffer和thrift的文章比较多，其中google到的比较靠前的<a href="http://blog.scaner.i.thu.cn/index.php/2008/07/10/thrift-vs-protobuf/">一篇blog</a>指出thift的c++版本对windows支持不好，我一开始也是觉得如此，主要是thrift只提供了autoconf，automake作为构建工具，在windows上只能用cygwin或者msys才能比较方便的编译，而google protocol buffer提供了vc的工程文件。另外在代码的规范性方面，的确是google protocol buffer更好。</div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br></div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">此次移植的目的是在windows上运行的client和compiler，因为server肯定是用linux的，移植没太大必要。根据我从前移植代码的经验，发现妨碍移植的关键在于系统api的差异，或者是某些依赖库的差异，如果差异太大，则移植比较麻烦。另外，在移植时我比较倾向于先移植一个最小的功能集合，并逐步完善。</div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br></div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">在泛读了thrift的代码和文档后发现thrift中并没有用到非常难于移植的api，我先用thrift compiler开始，thrift compiler很简单，基本不用修改就可以在vc2008上编译，主要依赖的是flex和bison，在windows下也都不难找到，也可以在linux生成后，再把生成的thriftl.cc，thrifty.cc和thrifty.h直接copy过来使用。编译完成后发现在处理include和externs的时候有问题，主要是linux和windows的路径分隔符（"/"和"\\"）的差异，修改main.cc里面的program_name和directory_name就可以解决了，这个问题在msys下面也存在。</div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br></div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">接下来就是client和server了，我打算主要使用Framed Transport＋Binary protocol＋nonblocking server，因为使用的是libevent（在windows上已经有移植，直接拿过来用就可以了，在linux上面用的是epoll，性能也不错），也没有其他的依赖库，移植起来还是比较方便的。</div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br></div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">先从client开始，在TSocket中因为使用了poll来进行超时处理，先改成阻塞方式，将所有的非阻塞和poll相关代码注释掉，基本可以编译成功，然后还有就是ctime_t的地方可以用vc的ctime_s代替，但是dbgtime的长度要改成26。运行tutorial没什么问题。然后就是加入超时处理了，虽然ms在windows server 2008里面引入了WSAPoll，我用的是xp，只有用select来模拟一个poll了，反正功能差不多，只是接口不太一样。完成后就可以生成基本的client runtime库了。</div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br></div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">至于server，大致看了一下，里面主要的问题是使用了socketpair和poll，主要是用来做libevent的通知。不过socketpair就自己建两个socket然后连接起来就可以了，poll用之前client的select模拟实现，移植起来问题应该不大。</div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br></div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">client的代码因为移植时间比较紧，只有半天时间，还没清理，就不放上来丢人了。</div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br></div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">只发一个tutorial的client的exe（需要vc9的runtime才能运行），修改后的Framed Transport＋Binary protocol＋nonblocking server的linux server代码和compiler的vc9工程代码。<a href="http://www.cppblog.com/Files/boolking/thrift.rar">下载</a></div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br></div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br></div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br></div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br></div><div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><br></div>
</span><img src ="http://www.cppblog.com/boolking/aggbug/72173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/boolking/" target="_blank">BoolKinG</a> 2009-01-19 14:39 <a href="http://www.cppblog.com/boolking/archive/2009/01/19/72173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS2005SP1安装加速</title><link>http://www.cppblog.com/boolking/archive/2007/01/08/17425.html</link><dc:creator>BoolKinG</dc:creator><author>BoolKinG</author><pubDate>Mon, 08 Jan 2007 06:29:00 GMT</pubDate><guid>http://www.cppblog.com/boolking/archive/2007/01/08/17425.html</guid><description><![CDATA[vs2005sp1出来已经有一段时间了，由于安装速度太慢，我一直都没有安装，今天遇到一个vs的bug，不得已需要安装sp1，上网找了一下，发现一个解决安装速度慢的方案。<br />之所以速度慢是很大程度上是因为windows installer的cache造成，在安装时暂时禁用掉windows installer的cache可以极大的加速sp1的安装，而且可以节省1.3G的磁盘空间。<br />将下面的代码存为bat文件，通过这个bat来安装sp1<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">reg export HKLM\Software\Policies\Microsoft\Windows\Installer installer.reg<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />reg add HKLM\Software\Policies\Microsoft\Windows\Installer </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">v MaxPatchCacheSize </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">t REG_DWORD </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">d </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">f<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />net stop msiserver<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />start </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">wait VS80sp1</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">KB926601</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">X86</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">ENU.exe<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />reg delete HKLM\Software\Policies\Microsoft\Windows\Installer </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">v MaxPatchCacheSize </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">f<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />reg import installer.reg<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />net stop msiserver<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />del </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">q installer.reg </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">nul</span></div><br /><br />另外，VS2005的intellisense对C++来说实在太慢，代码量大的时候cpu占用率一直在100%，功能也比不上VA，将<font face="Verdana" size="2">Microsoft Visual Studio 8\VC\vcpackages\feacp.dll</font>改名直接禁用之。<br /><br /><img src ="http://www.cppblog.com/boolking/aggbug/17425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/boolking/" target="_blank">BoolKinG</a> 2007-01-08 14:29 <a href="http://www.cppblog.com/boolking/archive/2007/01/08/17425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost在vc2005中的编译出现codepage警告和DEPRECATED函数的解决</title><link>http://www.cppblog.com/boolking/archive/2006/06/19/8715.html</link><dc:creator>BoolKinG</dc:creator><author>BoolKinG</author><pubDate>Mon, 19 Jun 2006 09:44:00 GMT</pubDate><guid>http://www.cppblog.com/boolking/archive/2006/06/19/8715.html</guid><description><![CDATA[
		<p>近日下载了一个VC2005 Express Edition，用它来编译boost，发现有不少的warning C4819，说代码文件中有cp936无法表示的字符，还有就是vc2005特有的废弃的ANSI函数的错误，虽说不影响编译，但是看着时不时出现的warning总是让人心神不安，还容易掩盖其他的错误，如果是直接用cl编译，只要加上/wd4819 /D_CRT_SECURE_NO_DEPRECATE就可以不显示这两个错误，但是大家都知道boost是使用其特有的boost.build进行编译的，下面我就给出如何修改boost.build来抑制这两个错误的显示</p>
		<p>boost.build分为v1和v2两个版本<br />v1：<br />修改$(BOOST_ROOT)/tools/build/v1/vc-8_0-tools.jam<br />将</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">flags vc</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">8_0 C</span>
				<span style="COLOR: #000000">++</span>
				<span style="COLOR: #000000">FLAGS : </span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">Zc:forScope ;</span>
		</div>
		<p>改为<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">flags vc</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">8_0 C</span>
				<span style="COLOR: #000000">++</span>
				<span style="COLOR: #000000">FLAGS : </span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">Zc:forScope<font color="#ff0000"> </font></span>
				<font color="#ff0000">
						<font color="#ff0000">
								<span style="COLOR: #ff0000">/</span>
								<span style="COLOR: #ff0000">wd4819 </span>
								<span style="COLOR: #000000">/</span>
						</font>
						<span style="COLOR: #000000">
								<font color="#ff0000">D_CRT_SECURE_NO_DEPRECATE</font> ;</span>
				</font>
		</div>
		<p>v2：<br />cvs版本<br />修改$(BOOST_ROOT)/tools/build/v2/tools/msvc.jam<br />在</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000"># </span>
				<span style="COLOR: #000000">8.0</span>
				<span style="COLOR: #000000"> adds some more options<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>一行的下方加上</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<font color="#000000">
						<span style="COLOR: #000000">flags msvc.compile CFLAGS $(condition) : </span>
						<span style="COLOR: #000000">/</span>
						<span style="COLOR: #ff0000">
								<font color="#000000">wd4819</font> </span>
						<span style="COLOR: #ff0000">/</span>
				</font>
				<span style="COLOR: #ff0000">
						<font color="#000000">D_CRT_SECURE_NO_DEPRECATE ;</font>
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>boost 1.33.1版本<br />将<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">    # </span>
				<span style="COLOR: #000000">8.0</span>
				<span style="COLOR: #000000"> deprecates some of the options<br />    </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">!</span>
				<span style="COLOR: #000000"> [ MATCH </span>
				<span style="COLOR: #000000">^</span>
				<span style="COLOR: #000000">([</span>
				<span style="COLOR: #000000">67</span>
				<span style="COLOR: #000000">].</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">) : $(version) ] <br />    {<br />        flags msvc.compile CFLAGS $(condition)</span>
				<span style="COLOR: #000000">/&lt;</span>
				<span style="COLOR: #000000">optimization</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">speed : </span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">O2 ;<br />        flags msvc.compile CFLAGS $(condition)</span>
				<span style="COLOR: #000000">/&lt;</span>
				<span style="COLOR: #000000">optimization</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">space : </span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">O1 ;<br />        flags msvc.link.dll MANIFEST : </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">mt -manifest </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> ;<br />        flags msvc.link.dll OUTPUTRESOURCE : </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">-outputresource:</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> ;<br />    }</span>
		</div>
		<p>改为：<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">    # </span>
				<span style="COLOR: #000000">8.0</span>
				<span style="COLOR: #000000"> deprecates some of the options<br />    </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">!</span>
				<span style="COLOR: #000000"> [ MATCH </span>
				<span style="COLOR: #000000">^</span>
				<span style="COLOR: #000000">([</span>
				<span style="COLOR: #000000">67</span>
				<span style="COLOR: #000000">].</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">) : $(version) ] <br />    {<br />        <font color="#ff0000">flags msvc.compile CFLAGS $(condition) : </font></span>
				<font color="#ff0000">
						<span style="COLOR: #ff0000">/</span>
						<span style="COLOR: #ff0000">wd4819 </span>
						<span style="COLOR: #ff0000">/</span>
				</font>
				<span style="COLOR: #000000">
						<font color="#ff0000">D_CRT_SECURE_NO_DEPRECATE ;</font>
						<br />        flags msvc.compile CFLAGS $(condition)</span>
				<span style="COLOR: #000000">/&lt;</span>
				<span style="COLOR: #000000">optimization</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">speed : </span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">O2 ;<br />        flags msvc.compile CFLAGS $(condition)</span>
				<span style="COLOR: #000000">/&lt;</span>
				<span style="COLOR: #000000">optimization</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">space : </span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">O1 ;<br />        flags msvc.link.dll MANIFEST : </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">mt -manifest </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> ;<br />        flags msvc.link.dll OUTPUTRESOURCE : </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">-outputresource:</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> ;<br />    }</span>
		</div>
<img src ="http://www.cppblog.com/boolking/aggbug/8715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/boolking/" target="_blank">BoolKinG</a> 2006-06-19 17:44 <a href="http://www.cppblog.com/boolking/archive/2006/06/19/8715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为什么main有多种格式？</title><link>http://www.cppblog.com/boolking/archive/2006/06/07/8250.html</link><dc:creator>BoolKinG</dc:creator><author>BoolKinG</author><pubDate>Wed, 07 Jun 2006 09:40:00 GMT</pubDate><guid>http://www.cppblog.com/boolking/archive/2006/06/07/8250.html</guid><description><![CDATA[学过C/C++语言的都知道程序的执行从main函数开始（先不说static对象和CRT），大部分学过C/C++的也都知道main可以有int main()和int main(int argc, char**argv)的参数格式，有不少人还知道int main(int, char**, char**)的参数形式，返回值也可以为void，但是为什么C/C++ compiler能够支持这些格式呢？在初学C的时候，我以为是编译器内置的功能来支持<br /><br />近日研究VC的CRT，发现原来是通过调用规范（calling coventions）实现的。<br />调用规范分为参数传递次序，调用栈维护，命名修饰和大小写转换4个规范组成。<br /><br />大部分的C语言编译器（至少是在x86架构上）遵循以下的规范<br />命名修饰和大小写转换：无论函数的signature是什么样子，在编译时会将名为“Xxxx”的函数转换为“_Xxxx”的形式，即在函数名前面加上“_”，大小写不变，也就是说不管是什么形式的main函数，有没有返回值，有多少个参数都会在编译时转换为_main。因此虽然在CRT中使用的是<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> __cdecl main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">);</span></div><p>的形式声明的main函数，但是在链接的时候无论是什么形式的main都符合要求，只不过除了在文章开始提到的3种形式有意义外，其他的参数格式要么是得到无意义的值，要么还会溢出调用栈（使用超过3个参数）<br />测试代码如下：</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> a1, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> a2, unsigned </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> a3, </span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> a4, </span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000"> a5, unsinged </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> a6)<br />{<br /> printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello World!\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /> </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br />}</span></div><p> </p><img src ="http://www.cppblog.com/boolking/aggbug/8250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/boolking/" target="_blank">BoolKinG</a> 2006-06-07 17:40 <a href="http://www.cppblog.com/boolking/archive/2006/06/07/8250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>