<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/xsl/rss.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:ppp="http://blog.sohu.com/rss/module/ppp/"
	>

	<channel>
		<title>我在隐身</title>
		<link>http://anchoretic.blog.sohu.com/</link>
		<description><![CDATA[Believe in who you are!]]></description>
		<pubDate>Sun, 27 Apr 2008 20:06:51 +0800</pubDate>
		<generator>搜狐博客</generator>
		<ppp:ebi>9ab801c792</ppp:ebi>
		<image>
			<title>http://blog.sohu.com</title>
			<url>http://js.pp.sohu.com/ppp/blog/images/common/logo_150_60.gif</url>
			<link>http://blog.sohu.com/</link>
			<width>100</width>
			<height>43</height>
			<description>搜狐博客</description>
		</image>
		<item>
			<title>2008年海淀区户口政策（附件3）</title>
			<link>http://anchoretic.blog.sohu.com/85817358.html</link>
			<comments>http://anchoretic.blog.sohu.com/85817358.html#comment</comments>
			<dc:creator>我在隐身</dc:creator>
			<pubDate>Sun, 27 Apr 2008 20:06:51 +0800</pubDate>
			<category>生活随笔</category>
			<guid>http://anchoretic.blog.sohu.com/85817358.html</guid>
			<description><![CDATA[<p align="center"><font face="Times New Roman"><font size="2"><strong>附件三</strong></font></font></p>
<p align="center"><font face="Times New Roman"><font size="2"><strong>2008</strong><strong>年海淀区接收非北京生源</strong></font></font></p>
<p align="center"><strong><font face="Times New Roman"><font size="2">应届毕业生所需材料及要求</font></font></strong></p>
<p><font size="2"></font></p>
<p><font size="2">用人单位报送的纸质材料与电子材料内容应一致。第一次报送毕业生进京审批纸质材料时，需携带单位《组织机构代码证》和《营业执照副本》原件。</font></p>
<p><strong><font size="2">一、申报接收非北京生源应届毕业研究生所需材料</font></strong></p>
<p><strong><font size="2">（一）《非北京生源毕业生进京审批表》一式三份。由各用人单位使用北京市毕业生就业管理系统网络版打印生成（操作说明详见系统帮助）。</font></strong></p>
<p><font size="2">1、表项所列内容应全部真实填写，如有涂改，须加盖用人单位公章。在填写&ldquo;用人单位意见&rdquo;时，用人单位应出具明确意见（同意或不同意），同时，经办人应署名签字（手写），并加盖单位公章，注明用章日期。</font></p>
<p><font size="2">2、在填写&ldquo;学校名称&rdquo;时，如系统中未列此学校，可按系统提示操作。</font></p>
<p><font size="2">3、在填写&ldquo;专业&rdquo;时，应与拟引进学生的就业推荐表中所填写的专业名称一致。如系统中未列此专业，参照填写&ldquo;学校名称&rdquo;方法处理。</font></p>
<p><font size="2">4、在填写&ldquo;毕业时间&rdquo;时，应参照毕业生就业推荐表中的毕业时间填写。如学生毕业时间为&ldquo;2008年4月&rdquo;，则选填&ldquo;2008年春季&rdquo;；毕业时间为&ldquo;2008年7月&rdquo;，则选填&ldquo;2008年暑期&rdquo;。</font></p>
<p><font size="2">5、在填写&ldquo;申报理由&rdquo;时，应着重说明拟引进的学生特长与拟安置工作岗位的匹配程度。可简要介绍用人单位基本情况，重点是有针对性地讲清为什么要引进某学校某专业的某学生，充分说明该学生的特点、拟安置的岗位和工作内容。</font></p>
<p><font size="2">如系统设计表格填写不下用人理由（只提供250个字空间），可按照系统提供的审批表样式自制三份，并填写完表项所列相应要素。当自制表格仍填写不下用人理由时，可另附两份详细的单位用人申请报告，但表格内的用人理由不能为空，应作概略描述，并在文尾标注&ldquo;详情参见《关于引进XXX同学的申请》&rdquo;字样。</font></p>
<p><font size="2">6、为便于联系，请将用人单位经办人的固定电话和移动电话（北京地区号码）一并填写在&ldquo;联系电话&rdquo;栏内。</font></p>
<p><strong><font size="2">注：《非北京生源毕业生进京审批表》一式三份，一份上交北京市人事局留存备案，一份由我局留存备案，一份装入毕业生档案，作为该毕业生办理进京的终身记录。</font></strong></p>
<p><strong><font size="2">（二）毕业生就业推荐表一份（原件），由学校出具、毕业生本人提供。</font></strong></p>
<p><font size="2">1、表项所列内容应全部真实填写，如有涂改，须加盖学校就业指导部门公章。</font></p>
<p><font size="2">2、在填写&ldquo;培养方式&rdquo;时，明确标注毕业生的培养方式是否为统分（或统招、并轨、自筹、非定向）。</font></p>
<p><font size="2"><strong>注：</strong>如该校《就业推荐表》无相应项目，应由毕业院校校级就业主管部门（或学校研究生培养管理部门）出具应届统分生证明。建议其主要内容为&ldquo;我校XX学院XX专业XX届XX学历XXX学生，系我校统分毕业生，符合留京（或进京）就业条件，特此证明&rdquo;。此证明中应注意&ldquo;级&rdquo;、&ldquo;年&rdquo;、&ldquo;届&rdquo;等词的区别。</font></p>
<p><font size="2">3、应明确标注毕业生的学号、学制和毕业时间。在填写&ldquo;毕业时间&rdquo;时，如是春季毕业的研究生，其毕业时间一般为&ldquo;2008年4月&rdquo;，学制应为&ldquo;2.5年&rdquo;；如是暑期毕业生的研究生，其毕业时间一般为&ldquo;2008年7月&rdquo;，学制通常为&ldquo;2年或3年&rdquo;。</font></p>
<p><font size="2">4、在填写&ldquo;院（系、所）意见&rdquo;时，院（系、所）应出具明确意见，并加盖院（系、所）公章，注明用章日期。</font></p>
<p><font size="2">5、在填写&ldquo;学校毕业生就业部门意见&rdquo;时，学校就业主管部门应出具明确意见，并加盖学校就业主管部门公章，注明用章日期。（注：在出具研究生就业意见时，通常由研究生院（部）的就业指导办公室承办）。</font></p>
<p><font size="2">6、返回&ldquo;用人单位回执&rdquo;。&ldquo;毕业生就业推荐表&rdquo;与&ldquo;用人单位回执&rdquo;之间，应加盖用人单位公章（俗称齐缝章），由用人单位裁剪下后，将&ldquo;用人单位回执&rdquo;发至毕业学校。如该校推荐表无此项，由用人单位与毕业生协商解决。</font></p>
<p><font size="2">7、北京地区高校毕业生的就业推荐表通常由&ldquo;北京高校毕业生就业指导中心&rdquo;统一印制</font></p>
<p><strong><font size="2">（三）毕业生已修全部课程成绩单一份（原件），由学校出具、毕业生本人提供。</font></strong></p>
<p><font size="2">须毕业院校校级教务主管部门盖章（一般由学校研究生院（部）培养管理部门出具学生成绩单并盖章）。成绩单应如实反映毕业生就学期间的真实学习成绩，对于不及格、重修或补考的课程应明确标注，不得隐瞒、修改。对于以非百分形式打分、或附加特殊符号的，应由校级教务部门同时出具有关说明（一般由学校研究生院（部）培养管理部门出具说明并盖章）。</font></p>
<p><strong><font size="2">（四）毕业生品行鉴定一份（原件），由学校出具、毕业生本人提供。</font></strong></p>
<p><font size="2">由毕业生所在院系以上主管思想、组织建设部门出具，材料应如实反映毕业生在校期间的思想品行表现。</font></p>
<p><strong><font size="2">（五）《非北京生源高校毕业生引进协议书》（原件二份）。</font></strong></p>
<p><font size="2">此协议书需用人单位负责人和学生本人署名签字（均须手写），并注明用人单位（甲方）用章日期。</font></p>
<p><font size="2">下载方法见&ldquo;北京市毕业生就业管理系统网络版&rdquo;首页&ldquo;常见问题&rdquo;处的&ldquo;请问从那里可以下载到《非北京生源高校毕业生引进协议书》？&rdquo;。</font></p>
<p><strong><font size="2">（六）毕业生身份证复印件一份，由毕业生本人提供。</font></strong></p>
<p><strong><font size="2">研究生的申报材料应分三部分装订：</font></strong></p>
<p><font size="2"><strong>第一部分材料装订顺序（自上而下）为：</strong>1、《非北京生源毕业生进京审批表》（原件一份）；2、毕业生就业推荐表（原件一份）；3、毕业生培养方式证明（原件一份）。如毕业生就业推荐表中已明确培养方式，则不需再提供此材料；4、毕业生已修全部课程成绩单（原件一份）；5、毕业生品行鉴定一份（原件一份）；6、《非北京生源高校毕业生引进协议书》（原件一份）。</font></p>
<p><font size="2"><strong>第二部分材料：</strong>《非北京生源毕业生进京审批表》（原件一份）。</font></p>
<p><font size="2"><strong>第三部分材料装订顺序（自上而下）为：</strong>1、《非北京生源毕业生进京审批表》（原件一份）；2、《非北京生源高校毕业生引进协议书》（原件一份）；3、毕业生身份证复印件一份。</font></p>
<p><strong><font size="2">第一、三部分材料均用订书机在左上角进行装订，再用回形针将上述三部分材料依次合订到一起。</font></strong></p>
<p><font size="2"></font></p>
<p><strong><font size="2">二、申报接收非北京生源应届本科毕业生所需材料</font></strong></p>
<p><strong><font size="2">（一）《非北京生源毕业生进京审批表》一式三份，由各用人单位使用北京市毕业生就业管理系统网络版打印生成（操作说明详见系统帮助）。</font></strong></p>
<p><font size="2">除&ldquo;毕业时间&rdquo;应填写&ldquo;2008年暑期&rdquo;外，其它部分要求参照研究生部分执行。</font></p>
<p><strong><font size="2">（二）毕业生就业推荐表一份（原件），由学校出具、毕业生本人提供。</font></strong></p>
<p><font size="2"><strong>1</strong>、在填写&ldquo;毕业时间&rdquo;时，本科生的毕业时间一般为暑期，学制一般为4年（部分特殊专业学制为5年）。</font></p>
<p><font size="2">2、在填写&ldquo;学校毕业生就业部门意见&rdquo;时，应由学校就业主管部门出具明确意见。</font></p>
<p><font size="2">注：在出具本科生就业意见时，通常由学校就业指导中心承办，而不是学校的院（系、所）。</font></p>
<p><font size="2">其它部分按研究生部分填写要求执行。</font></p>
<p><strong><font size="2">（三）毕业生已修全部课程成绩单一份(30门课程以上)（原件），由学校出具、毕业生本人提供。</font></strong></p>
<p><font size="2">须学校教务部门盖章（即学校教务主管部门，而非毕业生所在的院、系、所）。其它部分按研究生部分填写要求执行。</font></p>
<p><strong><font size="2">（四）英语四级（六级）或专业英语四级（八级）证书原件及复印件（各一份），由毕业生本人提供。</font></strong></p>
<p><font size="2">参加改革后英语四级考试的，为《大学英语四级考试成绩报告单》原件及复印件（各一份），成绩应在425分以上（含）。待审查合格后，原件交由用人单位返回学生本人。艺术类、体育类专业毕业生，及第一外语为非英语语种的毕业生，不要求英语四级成绩，但需校级就业主管部门（即学校教务主管部门，而非毕业生所在的院、系、所）出具外语水平符合毕业要求的证明。</font></p>
<p><strong><font size="2">（五）毕业生品行鉴定一份（原件），由学校出具、毕业生本人提供。</font></strong></p>
<p><font size="2">由毕业生所在院系以上主管思想、组织建设部门出具，材料应如实反映毕业生在校期间的思想品行表现。</font></p>
<p><strong><font size="2">（六）《非北京生源高校毕业生引进协议书》（原件二份）。</font></strong></p>
<p><font size="2">按研究生部分要求执行。</font></p>
<p><strong><font size="2">（七）毕业生身份证复印件一份，由学生本人提供。</font></strong></p>
<p><strong><font size="2">本科生的申报材料分三部分装订：</font></strong></p>
<p><font size="2"><strong>第一部分材料装订顺序（自上而下）为：</strong>1、《非北京生源毕业生进京审批表》（原件一份）；2、毕业生就业推荐表（原件一份）；3、毕业生培养方式证明（原件一份）。如毕业生就业推荐表中已明确培养方式，则不需再提供此材料；4、毕业生已修全部课程成绩单（原件一份）；5、英语四级、六级证书或《大学英语四级考试成绩报告单》（复印件一份）；6、毕业生品行鉴定一份（原件一份）；7、《非北京生源高校毕业生引进协议书》（原件一份）。</font></p>
<p><font size="2"><strong>第二部分材料：</strong>《非北京生源毕业生进京审批表》（原件一份）。</font></p>
<p><font size="2"><strong>第三部分材料装订顺序（自上而下）为：</strong>1、《非北京生源毕业生进京审批表》（原件一份）；2、《非北京生源高校毕业生引进协议书》（原件一份）；3、毕业生身份证复印件一份。</font></p>
<p><strong><font size="2">第一、三部分材料均用订书机在左上角进行装订，再用回形针将上述三部分材料依次合订到一起。</font></strong></p>]]></description>
		</item>
		    
		
		<item>
			<title>机会</title>
			<link>http://anchoretic.blog.sohu.com/85689886.html</link>
			<comments>http://anchoretic.blog.sohu.com/85689886.html#comment</comments>
			<dc:creator>我在隐身</dc:creator>
			<pubDate>Sat, 26 Apr 2008 08:09:59 +0800</pubDate>
			<category>我和工作</category>
			<guid>http://anchoretic.blog.sohu.com/85689886.html</guid>
			<description><![CDATA[<p>昨天那家嵌入式公司hr又打电话来了，帮我调到另一个研发部，和该部技术人员聊过之后，居然非常合适，LTP、Gcov都是自己用过的！！！看来之前拒绝DTV研发部结果不算太坏。hr让我回去准备材料，下周一再和部门领导面试，走个流程。</p>]]></description>
		</item>
		    
		
		<item>
			<title>鱼与熊掌。。。</title>
			<link>http://anchoretic.blog.sohu.com/85555591.html</link>
			<comments>http://anchoretic.blog.sohu.com/85555591.html#comment</comments>
			<dc:creator>我在隐身</dc:creator>
			<pubDate>Thu, 24 Apr 2008 17:13:13 +0800</pubDate>
			<category>我和工作</category>
			<guid>http://anchoretic.blog.sohu.com/85555591.html</guid>
			<description><![CDATA[鱼与熊掌。。。，哎，还是没考虑好优先级！结果在hr笔试面试、三人技术一面后，二面部长时，说错话了，结果鱼与熊掌都没捞到。谨记呀！~睡一觉，一切重来。]]></description>
		</item>
		    
		
		<item>
			<title>凹凸笔试题目(嵌入式软件开发)</title>
			<link>http://anchoretic.blog.sohu.com/85403642.html</link>
			<comments>http://anchoretic.blog.sohu.com/85403642.html#comment</comments>
			<dc:creator>我在隐身</dc:creator>
			<pubDate>Tue, 22 Apr 2008 22:07:31 +0800</pubDate>
			<category>我和工作</category>
			<guid>http://anchoretic.blog.sohu.com/85403642.html</guid>
			<description><![CDATA[&nbsp;&nbsp; Embedded &nbsp; Software &nbsp; Design &nbsp; Engineer &nbsp; <br />&nbsp; &nbsp; <br />&nbsp;1 &nbsp; 读程序段，回答问题 &nbsp; <br />&nbsp; &nbsp; &nbsp; int &nbsp; main(int &nbsp; argc,char &nbsp; *argv[]) &nbsp; <br />&nbsp; &nbsp; &nbsp; { &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; c=9,d=0; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c=c++%5; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d=c; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;d=%d\n&quot;,d); &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return &nbsp; 0; &nbsp; <br />&nbsp; &nbsp; &nbsp; } &nbsp; <br />&nbsp;a) &nbsp; 写出程序输出 &nbsp; <br />&nbsp; &nbsp; &nbsp; b) &nbsp; 在一个可移植的系统中这种表达式是否存在风险？why? &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; #include &nbsp; &quot;stdio.h&quot; &nbsp; <br />&nbsp; &nbsp; &nbsp; int &nbsp; a=0; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; int &nbsp; b; &nbsp; <br />&nbsp; &nbsp; &nbsp; static &nbsp; char &nbsp; c; &nbsp; <br />&nbsp; &nbsp; &nbsp; int &nbsp; main(int &nbsp; argc,char &nbsp; *argv[]) &nbsp; <br />&nbsp; &nbsp; &nbsp; { &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; char &nbsp; d=4; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; static &nbsp; short &nbsp; e; &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a++; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b=100; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c=(char)++a; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e=(++d)++; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;a=%d, &nbsp; b=%d, &nbsp; c=%d, &nbsp; d= &nbsp; %d, &nbsp; e=%d&quot;,a,b,c,d,e); &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return &nbsp; 0; &nbsp; <br />&nbsp; &nbsp; &nbsp; } &nbsp; <br />&nbsp; &nbsp; &nbsp; a) &nbsp; 写出程序输出 &nbsp; <br />&nbsp; &nbsp; &nbsp; b) &nbsp; 编译器如果安排各个变量(a,b,c,d)在内存中的布局(eg. &nbsp; stack,heap,data &nbsp; section,bss &nbsp; section),最好用图形方式描述。 &nbsp; <br />&nbsp; &nbsp; <br />&nbsp;2 &nbsp; 中断是嵌入式系统中重要的组成部分，这导致了许多编译开发商提供一种扩展：让标准C支持中断，产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论以下这段代码。 &nbsp; <br />&nbsp; __interrupt &nbsp; double &nbsp; compute_area(double &nbsp; radius) &nbsp; <br />&nbsp; { &nbsp; <br />&nbsp; &nbsp; &nbsp; double &nbsp; area &nbsp; = &nbsp; PI &nbsp; * &nbsp; radius &nbsp; *radius; &nbsp; <br />&nbsp; &nbsp; &nbsp; printf(&quot;nArea &nbsp; = &nbsp; %f&quot;, &nbsp; area); &nbsp; <br />&nbsp; &nbsp; &nbsp; return &nbsp; area; &nbsp; <br />&nbsp; } &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; 3 &nbsp; C/C++基础知识问题 &nbsp; <br />&nbsp; &nbsp; &nbsp; a) &nbsp; 关键字volatile在编译时有什么含义?并给出三个不同使用场景的例子(可以伪代码或者文字描述)。 &nbsp; <br />&nbsp; &nbsp; &nbsp; b) &nbsp; C语言中static关键字的具体作用有哪些 &nbsp; ? &nbsp; <br />&nbsp; &nbsp; &nbsp; c) &nbsp; 请问下面三种变量声明有何区别?请给出具体含义 &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; const &nbsp; *p; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int* &nbsp; const &nbsp; p; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; const* &nbsp; const &nbsp; p; &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; 4 &nbsp; 嵌入式系统相关问题 &nbsp; <br />&nbsp; &nbsp; &nbsp; a) &nbsp; 对于整形变量A=0x12345678,请画出在little &nbsp; endian及big &nbsp; endian的方式下在内存中是如何存储的。 &nbsp; <br />&nbsp; &nbsp; &nbsp; b) &nbsp; 在ARM系统中，函数调用的时候，参数是通过哪种方式传递的? &nbsp; <br />&nbsp; &nbsp; &nbsp; c) &nbsp; 中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别? &nbsp; <br />&nbsp; &nbsp; <br />&nbsp;5 &nbsp; 设周期性任务P1,P2,P3的周期为T1,T2,T3分别为100，150，400；执行时间分别为20，40，100。请设计一种调度算法进行任务调度，满足任务执行周期及任务周期。 &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; 6 &nbsp; 优先级反转问题在嵌入式系统中是一中严重的问题，必须给与足够重视。 &nbsp; <br />&nbsp; &nbsp; &nbsp; a) &nbsp; 首先请解释优先级反转问题 &nbsp; <br />&nbsp; &nbsp; &nbsp; b) &nbsp; 很多RTOS提供优先级继承策略(Priority &nbsp; inheritance)和优先级天花板策略(Priority &nbsp; ceilings)用来解决优先级反转问题，请讨论这两种策略。]]></description>
		</item>
		    
		
		<item>
			<title>IEEE浮点数表示法</title>
			<link>http://anchoretic.blog.sohu.com/85376877.html</link>
			<comments>http://anchoretic.blog.sohu.com/85376877.html#comment</comments>
			<dc:creator>我在隐身</dc:creator>
			<pubDate>Tue, 22 Apr 2008 17:07:24 +0800</pubDate>
			<category>C/C++</category>
			<guid>http://anchoretic.blog.sohu.com/85376877.html</guid>
			<description><![CDATA[<p>最近一段时间看到版上关于C++里浮点变量精度的讨论比较多，那么我就给对这个问题有疑惑的人详细的讲解一下intel的处理器上是如何处理浮点数的。为了能更方便的讲解，我在这里只以float型为例，从存储结构和算法上来讲，double和float是一样的，不一样的地方仅仅是float是 32位的，double是64位的，所以double能存储更高的精度。还要说的一点是文章和程序一样，兼容性是有一定范围的，所以你想要完全读懂本文，你最好对二进制、十进制、十六进制的转换有比较深入的了解，了解数据在内存中的存储结构，并且会使用VC.net编译简单的控制台程序。OK，下面我们开始。</p>
<p>大家都知道任何数据在内存中都是以二进制（1或着0）顺序存储的，每一个1或着0被称为1位，而在x86CPU上一个字节是8位。比如一个16位（2字节）的short int型变量的值是1156，那么它的二进制表达就是：00000100 10000100。由于Intel CPU的架构是Little Endian（请参数机算机原理相关知识），所以它是按字节倒序存储的，那么就因该是这样：10000100 00000100，这就是定点数1156在内存中的结构。</p>
<p>那么浮点数是如何存储的呢？目前已知的所有的C/C++编译器都是按照IEEE （国际电子电器工程师协会）制定的IEEE 浮点数表示法来进行运算的。这种结构是一种科学表示法，用符号（正或负）、指数和尾数来表示，底数被确定为2，也就是说是把一个浮点数表示为尾数乘以2的指数次方再加上符号。下面来看一下具体的float的规格：</p>
<p>float<br />共计32位，折合4字节<br />由最高到最低位分别是第31、30、29、&hellip;&hellip;、0位<br />31位是符号位，1表示该数为负，0反之。<br />30-23位，一共8位是指数位。<br />22-0位，一共23位是尾数位。<br />每8位分为一组，分成4组，分别是A组、B组、C组、D组。<br />每一组是一个字节，在内存中逆序存储，即：DCBA</p>
<p>我们先不考虑逆序存储的问题，因为那样会把读者彻底搞晕，所以我先按照顺序的来讲，最后再把他们翻过来就行了。</p>
<p>现在让我们按照IEEE浮点数表示法，一步步的将float型浮点数12345.0f转换为十六进制代码。在处理这种不带小数的浮点数时，直接将整数部转化为二进制表示：1 11100010 01000000也可以这样表示：11110001001000000.0然后将小数点向左移，一直移到离最高位只有1位，就是最高位的1： 1.11100010010000000一共移动了16位，在布耳运算中小数点每向左移一位就等于在以2为底的科学计算法表示中指数+1，所以原数就等于这样：1.11100010010000000 * ( 2 ^ 16 )好了，现在我们要的尾数和指数都出来了。显而易见，最高位永远是1，因为你不可能把买了16个鸡蛋说成是买了0016个鸡蛋吧？（呵呵，可别拿你买的臭鸡蛋甩我~），所以这个1我们还有必要保留他吗？（众：没有！）好的，我们删掉他。这样尾数的二进制就变成了：11100010010000000最后在尾数的后面补0，一直到补够23位：11100010010000000000000（MD，这些个0差点没把我数的背过气去~）</p>
<p>再回来看指数，一共8位，可以表示范围是0 - 255的无符号整数，也可以表示-128 - 127的有符号整数。但因为指数是可以为负的，所以为了统一把十进制的整数化为二进制时，都先加上127，在这里，我们的16加上127后就变成了 143，二进制表示为：10001111<br />12345.0f这个数是正的，所以符号位是0，那么我们按照前面讲的格式把它拼起来：<br />0 10001111 11100010010000000000000<br />01000111 11110001 00100000 00000000<br />再转化为16进制为：47 F1 20 00，最后把它翻过来，就成了：00 20 F1 47。<br />现在你自己把54321.0f转为二进制表示，自己动手练一下！</p>
<p>有了上面的基础后，下面我再举一个带小数的例子来看一下为什么会出现精度问题。<br />按照IEEE浮点数表示法，将float型浮点数123.456f转换为十六进制代码。对于这种带小数的就需要把整数部和小数部分开处理。整数部直接化二进制：100100011。小数部的处理比较麻烦一些，也不太好讲，可能反着讲效果好一点，比如有一个十进制纯小数0.57826，那么5是十分位，位阶是 1/10；7是百分位，位阶是1/100；8是千分位，位阶是1/1000&hellip;&hellip;，这些位阶分母的关系是10^1、10^2、10^3&hellip;&hellip;，现假设每一位的序列是{S1、S2、S3、&hellip;&hellip;、Sn}，在这里就是5、7、8、2、6，而这个纯小数就可以这样表示：n = S1 * ( 1 / ( 10 ^ 1 ) ) + S2 * ( 1 / ( 10 ^ 2 ) ) + S3 * ( 1 / ( 10 ^ 3 ) ) + &hellip;&hellip; + Sn * ( 1 / ( 10 ^ n ) )。把这个公式推广到b进制纯小数中就是这样：<br />n = S1 * ( 1 / ( b ^ 1 ) ) + S2 * ( 1 / ( b ^ 2 ) ) + S3 * ( 1 / ( b ^ 3 ) ) + &hellip;&hellip; + Sn * ( 1 / ( b ^ n ) )</p>
<p>天哪，可恶的数学，我怎么快成了数学老师了！没办法，为了广大编程爱好者的切身利益，喝口水继续！现在一个二进制纯小数比如0.100101011就应该比较好理解了，这个数的位阶序列就因该是1/(2^1)、1/(2^2)、1/(2^3)、1/(2^4)，即0.5、0.25、0.125、 0.0625&hellip;&hellip;。乘以S序列中的1或着0算出每一项再相加就可以得出原数了。现在你的基础知识因该足够了，再回过头来看0.45这个十进制纯小数，化为该如何表示呢？现在你动手算一下，最好不要先看到答案，这样对你理解有好处。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />我想你已经迫不及待的想要看答案了，因为你发现这跟本算不出来！来看一下步骤：1 / 2 ^1位（为了方便，下面仅用2的指数来表示位），0.456小于位阶值0.5故为0；2位，0.456大于位阶值0.25，该位为1，并将0.45减去 0.25得0.206进下一位；3位，0.206大于位阶值0.125，该位为1，并将0.206减去0.125得0.081进下一位；4位，0.081 大于0.0625，为1，并将0.081减去0.0625得0.0185进下一位；5位0.0185小于0.03125，为0&hellip;&hellip;问题出来了，即使超过尾数的最大长度23位也除不尽！这就是著名的浮点数精度问题了。不过我在这里不是要给大家讲《数值计算》，用各种方法来提高计算精度，因为那太庞杂了，恐怕我讲上一年也理不清个头绪啊。我在这里就仅把浮点数表示法讲清楚便达到目的了。</p>
<p>OK，我们继续。嗯，刚说哪了？哦对对，那个数还没转完呢，反正最后一直求也求不尽，加上前面的整数部算够24位就行了：1111011.01110100101111001。某BC问：&ldquo;不是23位吗？&rdquo; 我：&ldquo;倒，不是说过了要把第一个1去掉吗？当然要加一位喽！&rdquo;现在开始向左移小数点，大家和我一起移，众：&ldquo;1、2、3&hellip;&hellip;&rdquo;好了，一共移了6位，6加上 127得131（怎么跟教小学生似的？呵呵~），二进制表示为：10000101，符号位为&hellip;&hellip;再&hellip;&hellip;不说了，越说越啰嗦，大家自己看吧：<br />0&nbsp; 10000101&nbsp; 11101101110100101111001<br />42&nbsp; F6&nbsp; E9&nbsp; 79<br />79&nbsp; E9&nbsp; F6&nbsp; 42</p>
<p>下面再来讲如何将纯小数转化为十六进制。对于纯小数，比如0.0456，我们需要把他规格化，变为1.xxxx * （2 ^ n ）的型式，要求得纯小数X对应的n可用下面的公式：<br />n = int( 1 + log (2)X );</p>
<p>0.0456我们可以表示为1.4592乘以以2为底的-5次方的幂，即1.4592 * ( 2 ^ -5 )。转化为这样形式后，再按照上面第二个例子里的流程处理：<br />1. 01110101100011100010001<br />去掉第一个1<br />01110101100011100010001<br />-5 + 127 = 122<br />0&nbsp; 01111010&nbsp; 01110101100011100010001<br />最后：<br />11 C7 3A 3D</p>
<p>另外不得不提到的一点是0.0f对应的十六进制是00 00 00 00，记住就可以了。</p>
<p>最后贴一个可以分析并输出浮点数结构的函数源代码，有兴趣的自己看看吧：</p>
<p>// 输入4个字节的浮点数内存数据<br />void DecodeFloat( BYTE pByte[4] )<br />{<br />&nbsp;printf( &quot;原始（十进制）：%d&nbsp; %d&nbsp; %d&nbsp; %d\n&quot; , (int)pByte[0],<br />&nbsp;&nbsp;(int)pByte[1], (int)pByte[2], (int)pByte[3] );<br />&nbsp;printf( &quot;翻转（十进制）：%d&nbsp; %d&nbsp; %d&nbsp; %d\n&quot; , (int)pByte[3],<br />&nbsp;&nbsp;(int)pByte[2], (int)pByte[1], (int)pByte[0] );<br />&nbsp;bitset&lt;32&gt; bitAll( *(ULONG*)pByte );<br />&nbsp;string strBinary = bitAll.to_string, allocator &gt;();<br />&nbsp;strBinary.insert( 9, &quot;&nbsp; &quot; );<br />&nbsp;strBinary.insert( 1, &quot;&nbsp; &quot; );<br />&nbsp;cout &lt;&lt; &quot;二进制：&quot; &lt;&lt; strBinary.c_str() &lt;&lt; endl;<br />&nbsp;cout &lt;&lt; &quot;符号：&quot; &lt;&lt; ( bitAll[31] ? &quot;-&quot; : &quot;+&quot; ) &lt;&lt; endl;<br />&nbsp;bitset&lt;32&gt; bitTemp;<br />&nbsp;bitTemp = bitAll;<br />&nbsp;bitTemp &lt;&lt;= 1;<br />&nbsp;LONG ulExponent = 0;<br />&nbsp;for ( int i = 0; i &lt; 8; i++ )<br />&nbsp;{<br />&nbsp;&nbsp;ulExponent |= ( bitTemp[ 31 - i ] &lt;&lt; ( 7 - i ) );<br />&nbsp;}<br />&nbsp;ulExponent -= 127;<br />&nbsp;cout &lt;&lt; &quot;指数（十进制）：&quot; &lt;&lt; ulExponent &lt;&lt; endl;<br />&nbsp;bitTemp = bitAll;<br />&nbsp;bitTemp &lt;&lt;= 9;<br />&nbsp;float fMantissa = 1.0f;<br />&nbsp;for ( int i = 0; i &lt; 23; i++ )<br />&nbsp;{<br />&nbsp;&nbsp;bool b = bitTemp[ 31 - i ];<br />&nbsp;&nbsp;fMantissa += ( (float)bitTemp[ 31 - i ] / (float)( 2 &lt;&lt; i ) );<br />&nbsp;}<br />&nbsp;cout &lt;&lt; &quot;尾数（十进制）：&quot;&nbsp; &lt;&lt; fMantissa &lt;&lt; endl;<br />&nbsp;float fPow;<br />&nbsp;if ( ulExponent &gt;= 0 )<br />&nbsp;{<br />&nbsp;&nbsp;fPow = (float)( 2 &lt;&lt; ( ulExponent - 1 ) );<br />&nbsp;}<br />&nbsp;else<br />&nbsp;{<br />&nbsp;&nbsp;fPow = 1.0f / (float)( 2 &lt;&lt; ( -1 - ulExponent ) );<br />&nbsp;}<br />&nbsp;cout &lt;&lt; &quot;运算结果：&quot; &lt;&lt; fMantissa * fPow &lt;&lt; endl;<br />}</p>
<p>累死了，我才发现这篇文章虽然短，然而确是最难写的。上帝，我也不是机算机，然而为什么我满眼都只有1和0？看来我也快成了黑客帝国里的那个看通迅员了&hellip;&hellip;希望大家能不辜负我的一翻辛苦，帮忙up吧！</p>]]></description>
		</item>
		    
		
		<item>
			<title>用Diff和Patch工具维护源码</title>
			<link>http://anchoretic.blog.sohu.com/85371343.html</link>
			<comments>http://anchoretic.blog.sohu.com/85371343.html#comment</comments>
			<dc:creator>我在隐身</dc:creator>
			<pubDate>Tue, 22 Apr 2008 16:13:07 +0800</pubDate>
			<category>C/C++</category>
			<guid>http://anchoretic.blog.sohu.com/85371343.html</guid>
			<description><![CDATA[<blockquote>在Unix系统下，维护源码版本可以使用很多方法，其中最常用的当然是大名鼎鼎的CVS，但实际上，简单的版本维护工作并没有必要使用复杂的CVS等专门的版本维护工具，Unix标配中的diff和patch工具就完全可以完成代码的简单备份和升级工作。</blockquote>
<p>在Unix系统下，维护源码版本可以使用很多方法，其中最常用的当然是大名鼎鼎的CVS，但实际上，简单的版本维护工作并没有必要使用复杂的CVS等专门的版本维护工具，Unix标配中的diff和patch工具就完全可以完成代码的简单备份和升级工作。</p>
<p>diff 以&quot;行&quot;为单位比较两个文本文件（也可以是目录比较），并将不同之处以某种格式输出到标准输出上；patch可以读入这种输出，并按照一定指令使源文件（目录）按照目标文件（目录）更新。Linux内核源码就是按照这种方式保持更新的，我们在www.kernel.org上可以下载到最新内核的 patch文件的bzip2包。本文以gnudiffutils 2.7和patch 2.5为例介绍diff和patch工具的使用。</p>
<p><a name="1"><span><font color="#666666">1．diff</font></span></a><br />diff 既可以用来比较两个文件，也可以用来比较两个目录中每个文件。使用-r（--recursive）参数时还可以在目录中嵌套比较。比较目录时除比较同名文件外，对不同名的文件当成新文件处理。对于比较C程序文件，diff还提供了专门的参数（-p，--show-c-function）来标识不同之处所在的函数名。</p>
<p>diff的输出格式有三种：列举方式、命令模式和上下文模式，其中命令模式有分为两种：ed命令格式和RCS（Revision Control System，版本控制系统）命令格式，上下文模式也按格式分为老版和新版两种。看下面的例子就能基本清楚各个格式的区别：</p>
<p><a name="N10059"></a><br /><img height="672" alt="" src="http://www-128.ibm.com/developerworks/cn/linux/l-diffp/images/1.jpg" width="642" border="0" /> </p>
<p>命令格式记录的是从test1更新到test2所需要执行的命令，而上下文模式通常可读性更好一些，它所记录的主要是二者的差异，通常还记录所需修改部分的上下几行（可配置）内容以供比较。见下面的例子：</p>
<p><a name="N1006B"></a><br /><img height="536" alt="" src="http://www-128.ibm.com/developerworks/cn/linux/l-diffp/images/2.jpg" width="636" border="0" /> </p>
<p>新版格式较之老版要紧凑一些，Linux内核源码的升级就是按照新版上下文格式用diff组织的，比如patch-2.4.16中所用的具体命令为：</p><pre>diff -Nur linux-2.4.15 linux<br /></pre>
<p>参数N表示如果某个文件仅在一个目录中出现，则假定其在另一个目录中为空文件；u表示unified格式，r表示在目录中嵌套使用，linux-2.4.15显然是老核的目录名，而linux则为新核的目录名。</p>
<p><a name="2"><span><font color="#666666">2．patch</font></span></a><br />尽管并没有指定patch和diff的关系，但通常patch都使用diff的结果来完成打补丁的工作，这和patch本身支持多种diff输出文件格式有很大关系。patch通过读入patch命令文件（可以从标准输入），对目标文件进行修改。通常先用diff命令比较新老版本，patch命令文件则采用 diff的输出文件，从而保持原版本与新版本一致。</p>
<p>patch的标准格式为</p>
<table cellspacing="0" cellpadding="5" bgcolor="#cccccc" border="1">
<tbody>
<tr>
<td><pre><code><br />patch [options] [originalfile] [patchfile]<br /></code></pre></td></tr></tbody></table>
<p>如果patchfile为空则从标准输入读取 patchfile内容；如果originalfile也为空，则从patchfile（肯定来自标准输入）中读取需要打补丁的文件名。因此，如果需要修改的是目录，一般都必须在patchfile中记录目录下的各个文件名。绝大多数情况下，patch都用以下这种简单的方式使用：</p>
<table cellspacing="0" cellpadding="5" bgcolor="#cccccc" border="1">
<tbody>
<tr>
<td><pre><code><br />patch -p[num] &lt;patchfile<br /></code></pre></td></tr></tbody></table>
<p>patch 命令可以忽略文件中的冗余信息，从中取出diff的格式以及所需要patch的文件名，文件名按照diff参数中的&quot;源文件&quot;、&quot;目标文件&quot;以及冗余信息中的&quot;Index：&quot;行中所指定的文件的顺序来决定。也就是说，对于如下diff结果文件（Linux内核源码2.4.16升级包，部分）：</p>
<table cellspacing="0" cellpadding="5" bgcolor="#cccccc" border="1">
<tbody>
<tr>
<td><pre><code> <br />diff -Nur linux-2.4.15/Makefile linux/Makefile<br />--- linux-2.4.15/Makefile       Thu Nov 22 17:22:58 2001<br />+++ linux/Makefile      Sat Nov 24 16:21:53 2001<br />@@ -1,7 +1,7 @@<br /> VERSION = 2<br /> PATCHLEVEL = 4<br />-SUBLEVEL = 15<br />-EXTRAVERSION =-greased-turkey<br />+SUBLEVEL = 16<br />+EXTRAVERSION =<br /><br /> KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)<br />&hellip;&hellip;<br /></code></pre></td></tr></tbody></table>
<p>patch 首先尝试当前目录（或者-d参数指定的目录）下的linux-2.4.15/Makefile文件是否存在，如果不存在则试图对 linux/Makefile文件操作，仅当两者都不存在时（或者设置了POSIXLY_CORRECT环境变量）才会读取Index:的内容（此文件中没有标识）。</p>
<p>前面提到的-p 参数决定了是否使用读出的源文件名的前缀目录信息，不提供-p参数，则忽略所有目录信息，-p0（或者-p 0）表示使用全部的路径信息，-p1将忽略第一个&quot;/&quot;以前的目录，依此类推。如/usr/src/linux-2.4.15/Makefile这样的文件名，在提供-p3参数时将使用linux-2.4.15/Makefile作为所要patch的文件。</p>
<p>对于刚才举的 Linux内核源码2.4.16升级包的例子，假定源码目录位于/usr/src/linux中，则在当前目录为/usr/src时使用&quot;patch -p0 &lt;patch-2.4.16&quot;可以工作，在当前目录为/usr/src/linux时，&quot;patch -p1&lt;patch-2.4.16&quot;也可以正常工作。</p>
<p>patch可以直接操作上下文格式以及混合ed格式的diff输出文件，而将ed格式文件通过管道提交给ed程序操作（暂时不知RCS格式的文件如何处理）。</p>
<p><a name="N100AB"><span><font color="#666666">3．配合使用diff和patch升级源码 </font></span></a><br />在此仅举一个简单的例子来说明如何用diff/patch工具维护源码升级。</p>
<p>假设program-1.0目录中为老版，现开发完成的新版位于program-2.0目录中，将两个目录置于同一父目录下，然后在该父目录上执行：</p>
<table cellspacing="0" cellpadding="5" bgcolor="#cccccc" border="1">
<tbody>
<tr>
<td><pre><code><br />diff -Nur program-1.0 program-2.0 &gt;program-2.0.patch<br /></code></pre></td></tr></tbody></table>
<p>将生成一个program-2.0.patch的补丁文件，发布该补丁文件（当然可以先压缩成bzip2格式）。</p>
<p>假设拿到的是program-2.0.patch.bz2文件，则在program-1.0目录同级执行：</p>
<table cellspacing="0" cellpadding="5" bgcolor="#cccccc" border="1">
<tbody>
<tr>
<td><pre><code><br />bzcat program-2.0.patch.bz2 | patch -p0<br /></code></pre></td></tr></tbody></table>
<p>如此即完成了从1.0到2.0的升级。</p>
<p>如果希望恢复到原版本，可以使用-R（--reverse）参数，但仅对上下文格式的diff文件有效。还有一个备份参数也可以使用，但简单应用中，整个目录备份可能更方便一些。</p>]]></description>
		</item>
		    
		
		<item>
			<title>火箭季后赛第二场：麦蒂的命中率！</title>
			<link>http://anchoretic.blog.sohu.com/85352287.html</link>
			<comments>http://anchoretic.blog.sohu.com/85352287.html#comment</comments>
			<dc:creator>我在隐身</dc:creator>
			<pubDate>Tue, 22 Apr 2008 12:33:21 +0800</pubDate>
			<category>游戏娱乐</category>
			<guid>http://anchoretic.blog.sohu.com/85352287.html</guid>
			<description><![CDATA[<p><font size="3">首发 <td height="25">球&nbsp;&nbsp;员</td> <td height="25">出场时间</td> <td height="25">投篮</td> <td height="25">三分球</td> <td height="25">罚球</td> <td height="25">进攻</td> <td height="25">篮板</td> <td height="25">助攻</td> <td height="25">失误</td> <td height="25">抢断</td> <td height="25">盖帽</td> <td height="25">犯规</td> <td height="25">得分</td></font></p>
<p><tr bgcolor="#f7f7f7"><td><font color="red" size="3">* </font></td><td><a href="http://data.sports.sohu.com/nba/nba_player_info.php?playerid=3179" target="_blank"><font size="3">特雷西-麦格雷迪 </font></a></td><td><font size="3">0</font></td> <td>9-22</td> <td>0-4</td> <td>5-9</td> <td>1</td> <td>13</td> <td>9</td> <td>5</td> <td>3</td> <td>2</td> <td>0</td> <td>23</td></tr> </p>
<p><tr bgcolor="#ffffff"><td><font color="red" size="3">* </font></td><td><a href="http://data.sports.sohu.com/nba/nba_player_info.php?playerid=3191" target="_blank"><font size="3">鲍比-杰克逊 </font></a></td><td><font size="3">0</font></td> <td>7-17</td> <td>2-6</td> <td>2-4</td> <td>1</td> <td>5</td> <td>2</td> <td>0</td> <td>0</td> <td>0</td> <td>1</td> <td>18</td></tr></p>]]></description>
		</item>
		    
		
		<item>
			<title>gcc and g++编译器和gdb调试器</title>
			<link>http://anchoretic.blog.sohu.com/85344907.html</link>
			<comments>http://anchoretic.blog.sohu.com/85344907.html#comment</comments>
			<dc:creator>我在隐身</dc:creator>
			<pubDate>Tue, 22 Apr 2008 10:57:19 +0800</pubDate>
			<category>C/C++</category>
			<guid>http://anchoretic.blog.sohu.com/85344907.html</guid>
			<description><![CDATA[<p>gcc and g++分别是gnu的c &amp; c++编译器</p>
<p>gcc/g++在执行编译工作的时候，总共需要4步</p>
<p>1.预处理,生成.i的文件[预处理器cpp]<br />2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]<br />3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]<br />4.连接目标代码,生成可执行程序[链接器ld]</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>[参数详解]<br />-x language filename <br />　　 设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根<br />　　 据约定C语言的后缀名称是.c的，而C++的后缀名是.C或者.cpp,如果<br />　　 你很个性，决定你的C代码文件的后缀名是.pig 哈哈，那你就要用这<br />　　 个参数,这个参数对他后面的文件名都起作用，除非到了下一个参数<br />　　 的使用。<br />　　 可以使用的参数吗有下面的这些<br />　　　　 `c', `objective-c', `c-header', `c++', `cpp-output', <br />　　　　 `assembler', and `assembler-with-cpp'.<br />　　 看到英文，应该可以理解的。<br />　　 例子用法:<br />　　 gcc -x c hello.pig<br />　　<br />-x none filename<br />　　关掉上一个选项，也就是让gcc根据文件名后缀，自动识别文件类型<br />　　例子用法:<br />　　gcc -x c hello.pig -x none hello2.c<br />　　<br />-c <br />　　只激活预处理,编译,和汇编,也就是他只把程序做成obj文件<br />　　例子用法:<br />　　gcc -c hello.c<br />　　他将生成.o的obj文件 </p>
<p>-S<br />　　只激活预处理和编译，就是指把文件编译成为汇编代码。<br />　　例子用法<br />　　gcc -S hello.c<br />　　他将生成.s的汇编代码，你可以用文本编辑器察看</p>
<p>-E<br />　　只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里<br />　　面.<br />　　例子用法:<br />　　gcc -E hello.c &gt; pianoapan.txt<br />　　gcc -E hello.c | more<br />　　慢慢看吧,一个hello word 也要与处理成800行的代码</p>
<p>-o<br />　　制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果<br />　　你和我有同感，改掉它,哈哈<br />　　例子用法<br />　　gcc -o hello.exe hello.c (哦,windows用习惯了)<br />　　gcc -o hello.asm -S hello.c</p>
<p>-pipe<br />　　使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问<br />　　题<br />　　gcc -pipe -o hello.exe hello.c</p>
<p>-ansi<br />　　关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一<br />　　些asm inline typeof关键字,以及UNIX,vax等预处理宏,</p>
<p>-fno-asm<br />　　此选项实现ansi选项的功能的一部分，它禁止将asm,inline和typeof用作<br />　　关键字。<br />　　　　<br />-fno-strict-prototype<br />　　只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式<br />　　的对参数的个数和类型说明,而不是没有参数.<br />　　而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说<br />　　明的类型<br />　　<br />-fthis-is-varialble<br />　　就是向传统c++看齐,可以使用this当一般变量使用.<br />　　<br />-fcond-mismatch<br />　　允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型<br />　　<br />-funsigned-char<br />-fno-signed-char<br />-fsigned-char<br />-fno-unsigned-char<br />　　这四个参数是对char类型进行设置,决定将char类型设置成unsigned char(前<br />　　两个参数)或者 signed char(后两个参数)<br />　　<br />-include file<br />　　包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以<br />　　用它设定,功能就相当于在代码中使用#include&lt;filename&gt;<br />　　例子用法:<br />　　gcc hello.c -include /root/pianopan.h<br />　　<br />-imacros file<br />　　将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件<br />　　中<br />　　<br />-Dmacro<br />　　相当于C语言中的#define macro<br />　　<br />-Dmacro=defn<br />　　相当于C语言中的#define macro=defn<br />　　<br />-Umacro<br />　　相当于C语言中的#undef macro</p>
<p>-undef<br />　　取消对任何非标准宏的定义<br />　　<br />-Idir<br />　　在你是用#include&quot;file&quot;的时候,gcc/g++会先在当前目录查找你所制定的头<br />　　文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他<br />　　回先在你所制定的目录查找,然后再按常规的顺序去找.<br />　　对于#include&lt;file&gt;,gcc/g++会到-I制定的目录查找,查找不到,然后将到系<br />　　统的缺省的头文件目录查找<br />　　<br />-I-<br />　　就是取消前一个参数的功能,所以一般在-Idir之后使用<br />　　<br />-idirafter dir<br />　　在-I的目录里面查找失败,讲到这个目录里面查找.<br />　　<br />-iprefix prefix<br />-iwithprefix dir<br />　　一般一起使用,当-I的目录查找失败,会到prefix+dir下查找<br />　　<br />-nostdinc<br />　　使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确<br />　　限定头文件的位置<br />　　<br />-nostdin C++<br />　　规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创建<br />　　libg++库使用<br />　　<br />-C<br />　　在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序，用这个很<br />　　方便的<br />　　<br />-M<br />　　生成文件关联的信息。包含目标文件所依赖的所有源代码<br />　　你可以用gcc -M hello.c来测试一下，很简单。<br />　　<br />-MM<br />　　和上面的那个一样，但是它将忽略由#include&lt;file&gt;造成的依赖关系。<br />　　<br />-MD<br />　　和-M相同，但是输出将导入到.d的文件里面<br />　　<br />-MMD<br />　　和-MM相同，但是输出将导入到.d的文件里面<br />　　<br />-Wa,option<br />　　此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选<br />　　项,然后传递给会汇编程序<br />　　<br />-Wl.option<br />　　此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选<br />　　项,然后传递给会连接程序.<br />　　</p>
<p>-llibrary <br />　　制定编译的时候使用的库<br />　　例子用法<br />　　gcc -lcurses hello.c<br />　　使用ncurses库编译程序<br />　　<br />-Ldir<br />　　制定编译的时候，搜索库的路径。比如你自己的库，可以用它制定目录，不然<br />　　编译器将只在标准库的目录找。这个dir就是目录的名称。<br />　　<br />-O0<br />-O1<br />-O2<br />-O3<br />　　编译器的优化选项的4个级别，-O0表示没有优化,-O1为缺省值，-O3优化级别最<br />　　高　　<br />　　<br />-g<br />　　只是编译器，在编译的时候，产生条是信息。<br />　　<br />-gstabs<br />　　此选项以stabs格式声称调试信息,但是不包括gdb调试信息.<br />　　<br />-gstabs+<br />　　此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息.<br />　　<br />-ggdb<br />　　此选项将尽可能的生成gdb的可以使用的调试信息.<br />-static<br />　　此选项将禁止使用动态库，所以，编译出来的东西，一般都很大，也不需要什么<br />动态连接库，就可以运行.<br />-share<br />　　此选项将尽量使用动态库，所以生成文件比较小，但是需要系统由动态库.<br />-traditional<br />　　试图让编译器支持传统的C语言特性</p>
<p><br />GNU 的调试器称为 gdb，该程序是一个交互式工具，工作在字符模式。在 X Window 系统中，有一个 gdb 的<br />前端图形工具，称为 xxgdb。gdb 是功能强大的调试程序，可完成如下的调试任务：<br />* 设置断点；<br />* 监视程序变量的值；<br />* 程序的单步执行；<br />* 修改变量的值。<br />在可以使用 gdb 调试程序之前，必须使用 -g 选项编译源文件。可在 makefile 中如下定义 CFLAGS 变量：<br />CFLAGS = -g<br />运行 gdb 调试程序时通常使用如下的命令：<br />gdb progname</p>
<p>在 gdb 提示符处键入help，将列出命令的分类，主要的分类有：<br />* aliases：命令别名<br />* breakpoints：断点定义；<br />* data：数据查看；<br />* files：指定并查看文件；<br />* internals：维护命令；<br />* running：程序执行；<br />* stack：调用栈查看；<br />* statu：状态查看；<br />* tracepoints：跟踪程序执行。<br />键入 help 后跟命令的分类名，可获得该类命令的详细清单。</p>
<p><br />#DENO#<br />gdb 的常用命令<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表 1-4&nbsp; 常用的 gdb 命令<br />命令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解释<br />break NUM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在指定的行上设置断点。<br />bt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。<br />clear&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 删除设置在特定源文件、特定行上的断点。其用法为：clear FILENAME:NUM。<br />continue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 继续执行正在调试的程序。该命令用在程序由于处理信号或断点而<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导致停止运行时。<br />display EXPR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每次程序停止后显示表达式的值。表达式由程序定义的变量组成。<br />file FILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 装载指定的可执行文件进行调试。<br />help NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示指定命令的帮助信息。<br />info break&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示当前断点清单，包括到达断点处的次数等。<br />info files&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示被调试文件的详细信息。<br />info func&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示所有的函数名称。<br />info local&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示当函数中的局部变量信息。<br />info prog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示被调试程序的执行状态。<br />info var&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示所有的全局和静态变量名称。<br />kill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 终止正被调试的程序。<br />list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示源代码段。<br />make&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在不退出 gdb 的情况下运行 make 工具。<br />next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在不单步执行进入其他函数的情况下，向前执行一行源代码。<br />print EXPR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示表达式 EXPR 的值。</p>
<p><br />1.8.5&nbsp; gdb 使用范例<br />-----------------<br />清单&nbsp; 一个有错误的 C 源程序 bugging.c<br />-----------------<br />#include <br />#include </p>
<p>static char buff [256];<br />static char* string;<br />int main ()<br />{</p>
<p>&nbsp;&nbsp;&nbsp; printf (&quot;Please input a string: &quot;);<br />&nbsp;&nbsp;&nbsp; gets (string);</p>
<p>&nbsp;&nbsp;&nbsp; printf (&quot;\nYour string is: %s\n&quot;, string);<br />}<br />-----------------<br />上面这个程序非常简单，其目的是接受用户的输入，然后将用户的输入打印出来。该程序使用了一个未经过初<br />始化的字符串地址 string，因此，编译并运行之后，将出现 Segment Fault 错误：<br />$ gcc -o test -g test.c<br />$ ./test<br />Please input a string: asfd<br />Segmentation fault (core dumped)<br />为了查找该程序中出现的问题，我们利用 gdb，并按如下的步骤进行：<br />1．运行 gdb bugging 命令，装入 bugging 可执行文件；<br />2．执行装入的 bugging 命令；<br />3．使用 where 命令查看程序出错的地方；<br />4．利用 list 命令查看调用 gets 函数附近的代码；<br />5．唯一能够导致 gets 函数出错的因素就是变量 string。用 print 命令查看 string 的值；<br />6．在 gdb 中，我们可以直接修改变量的值，只要将 string 取一个合法的指针值就可以了，为此，我们在第<br />&nbsp;11 行处设置断点；<br />7．程序重新运行到第 11 行处停止，这时，我们可以用 set variable 命令修改 string 的取值；<br />8．然后继续运行，将看到正确的程序运行结果。</p>]]></description>
		</item>
		    
		
		<item>
			<title>GCC常用选项&#38;使用详解</title>
			<link>http://anchoretic.blog.sohu.com/85344257.html</link>
			<comments>http://anchoretic.blog.sohu.com/85344257.html#comment</comments>
			<dc:creator>我在隐身</dc:creator>
			<pubDate>Tue, 22 Apr 2008 10:50:55 +0800</pubDate>
			<category>C/C++</category>
			<guid>http://anchoretic.blog.sohu.com/85344257.html</guid>
			<description><![CDATA[<p><span>通常所说的GCC是GUN Compiler Collection的简称，除了编译程序之外，它还含其他相关工具，所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进制代码。GCC是Linux平台下最常用的编译程序，它是Linux平台编译器的事实标准。同时，在Linux平台下的嵌入式开发领域，GCC也是用得最普遍的一种编译器。GCC之所以被广泛采用，是因为它能支持各种不同的目标体系结构。例如，它既支持基于宿主的开发（简单讲就是要为某平台编译程序，就在该平台上编译），也支持交叉编译（即在A平台上编译的程序是供平台B使用的）。目前，GCC支持的体系结构有四十余种，常见的有X86系列、Arm、 PowerPC等。同时，GCC还能运行在不同的操作系统上，如Linux、Solaris、Windows等。<br /><br />除了上面讲的之外，GCC除了支持C语言外，还支持多种其他语言，例如C++、Ada、Java、Objective-C、FORTRAN、Pascal等。<br /><br />本系列文章中，我们不仅介绍GCC的基本功能，还涉及到一些诸如优化之类的高级功能。另外，我们还考察GCC的一些映像操作工具，如size和objcopy等，这将在后续的文章中加以介绍。<br /><br />二、程序的编译过程<br /><br />对于GUN编译器来说，程序的编译要经历预处理、编译、汇编、连接四个阶段，如下图所示：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />从功能上分，预处理、编译、汇编是三个不同的阶段，但GCC的实际操作上，它可以把这三个步骤合并为一个步骤来执行。下面我们以C语言为例来谈一下不同阶段的输入和输出情况。<br /><br />在预处理阶段，输入的是C语言的源文件，通常为*.c。它们通常带有.h之类头文件的包含文件。这个阶段主要处理源文件中的#ifdef、 ＃i nclude和#define命令。该阶段会生成一个中间文件*.i，但实际工作中通常不用专门生成这种文件，因为基本上用不到；若非要生成这种文件不可，可以利用下面的示例命令：<br /><br />gcc -E&nbsp;&nbsp;&nbsp; test.c -o test.i<br /><br />在编译阶段，输入的是中间文件*.i，编译后生成汇编语言文件*.s 。这个阶段对应的GCC命令如下所示：<br /><br />GCC -S test.i -o test.s<br /><br />在汇编阶段，将输入的汇编文件*.s转换成机器语言*.o。这个阶段对应的GCC命令如下所示：<br /><br />GCC -c test.s -o test.o<br /><br />最后，在连接阶段将输入的机器代码文件*.s（与其它的机器代码文件和库文件）汇集成一个可执行的二进制代码文件。这一步骤，可以利用下面的示例命令完成：<br /><br />GCC test.o -o test<br /><br />上面介绍了GCC编译过程的四个阶段以及相应的命令。下面我们进一步介绍常用的GCC的模式。<br /><br />三、GCC常用模式<br /><br />这里介绍GCC追常用的两种模式：编译模式和编译连接模式。下面以一个例子来说明各种模式的使用方法。为简单起见，假设我们全部的源代码都在一个文件test.c中，要想把这个源文件直接编译成可执行程序，可以使用以下命令：<br /><br />$ GCC -o test<br /><br />这里test.c是源文件，生成的可执行代码存放在一个名为test 的文件中（该文件是机器代码并且可执行）。-o 是生成可执行文件的输出选项。如果我们只想让源文件生成目标文件（给文件虽然也是机器代码但不可执行），可以使用标记-c ，详细命令如下所示：<br /><br />$ GCC -c test.c<br /><br />默认情况下，生成的目标文件被命名为test.o，但我们也可以为输出文件指定名称，如下所示：<br /><br />$ GCC -c test.c -o<br /><br />上面这条命令将编译后的目标文件命名为mytest.o，而不是默认的test.o。<br /><br />迄今为止，我们谈论的程序仅涉及到一个源文件；现实中，一个程序的源代码通常包含在多个源文件之中，这该怎么办？没关系，即使这样，用GCC处理起来也并不复杂，见下例：<br /><br />$ GCC -o test&nbsp;&nbsp;&nbsp; first.c second.c third.c<br /><br />需要注意的是，要生成可执行程序时，一个程序无论有有一个源文件还是多个源文件，所有被编译和连接的源文件中必须有且仅有一个mai n函数，因为main 函数是该程序的入口点（换句话说，当系统调用该程序时，首先将控制权授予程序的main函数）。但如果仅仅是把源文件编译成目标文件的时候，因为不会进行连接，所以main函数不是必需的。<br /><br />四、常用选项<br /><br />许多情况下，头文件和源文件会单独存放在不同的目录中。例如，假设存放源文件的子目录名为./src，而包含文件则放在层次的其他目录下，如./inc。当我们在./src 目录下进行编译工作时，如何告诉GCC到哪里找头文件呢？方法如下所示：<br /><br />$ gcc test.c &ndash;I../inc -o test<br /><br />上面的命令告诉GCC包含文件存放在./inc 目录下，在当前目录的上一级。如果在编译时需要的包含文件存放在多个目录下，可以使用多个-I 来指定各个目录：<br /><br />$ gcc test.c &ndash;I../inc &ndash;I../../inc2 -o test<br /><br />这里指出了另一个包含子目录inc2，较之前目录它还要在再上两级才能找到。<br /><br />另外，我们还可以在编译命令行中定义符号常量。为此，我们可以简单的在命令行中使用-D选项即可，如下例所示：<br /><br />$ gcc -DTEST_CONFIGURATION test.c -o test<br /><br />上面的命令与在源文件中加入下列命令是等效的：<br /><br />#define TEST_CONFIGURATION<br /><br />在编译命令行中定义符号常量的好处是，不必修改源文件就能改变由符号常量控制的行为。<br /><br />五、警告功能<br /><br />当GCC 在编译过程中检查出错误的话，它就会中止编译；但检测到警告时却能继续编译生成可执行程序，因为警告只是针对程序结构的诊断信息，它不能说明程序一定有错误，而是存在风险，或者可能存在错误。虽然GCC提供了非常丰富的警告，但前提是你已经启用了它们，否则它不会报告这些检测到的警告。<br /><br />在众多的警告选项之中，最常用的就是-Wall选项。该选项能发现程序中一系列的常见错误警告，该选项用法举例如下：<br /><br />$ gcc -Wall test.c -o test<br /><br />该选项相当于同时使用了下列所有的选项：<br /><br />◆unused-function：遇到仅声明过但尚未定义的静态函数时发出警告。<br /><br />◆unused-label：遇到声明过但不使用的标号的警告。<br /><br />◆unused-parameter：从未用过的函数参数的警告。<br /><br />◆unused-variable：在本地声明但从未用过的变量的警告。<br /><br />◆unused-value：仅计算但从未用过的值得警告。<br /><br />◆Format：检查对printf和scanf等函数的调用，确认各个参数类型和格式串中的一致。<br /><br />◆implicit-int：警告没有规定类型的声明。<br /><br />◆implicit-function-：在函数在未经声明就使用时给予警告。<br /><br />◆char-subscripts：警告把char类型作为数组下标。这是常见错误，程序员经常忘记在某些机器上char有符号。<br /><br />◆missing-braces：聚合初始化两边缺少大括号。<br /><br />◆Parentheses：在某些情况下如果忽略了括号，编译器就发出警告。<br /><br />◆return-type：如果函数定义了返回类型，而默认类型是int型，编译器就发出警告。同时警告那些不带返回值的 return语句，如果他们所属的函数并非void类型。<br /><br />◆sequence-point：出现可疑的代码元素时，发出报警。<br /><br />◆Switch：如果某条switch语句的参数属于枚举类型，但是没有对应的case语句使用枚举元素，编译器就发出警告（在switch语句中使用default分支能够防止这个警告）。超出枚举范围的case语句同样会导致这个警告。<br /><br />◆strict-aliasing：对变量别名进行最严格的检查。<br /><br />◆unknown-pragmas：使用了不允许的#pragma。<br /><br />◆Uninitialized：在初始化之前就使用自动变量。<br /><br />需要注意的是，各警告选项既然能使之生效，当然也能使之关闭 。比如假设我们想要使用-Wall来启用个选项，同时又要关闭unused警告，利益通过下面的命令来达到目的：<br /><br />$ gcc -Wall -Wno-unused test.c -o test<br /><br />下面是使用-Wall选项的时候没有生效的一些警告项：<br /><br />◆cast-align：一旦某个指针类型强制转换时，会导致目标所需的地址对齐边界扩展，编译器就发出警告。例如，某些机器上只能在2或4字节边界上访问整数，如果在这种机型上把char *强制转换成int *类型， 编译器就发出警告。<br /><br />◆sign-compare：将有符号类型和无符号类型数据进行比较时发出警告。<br /><br />◆missing-prototypes ：如果没有预先声明函数原形就定义了全局函数，编译器就发出警告。即使函数定义自身提供了函数原形也会产生这个警告。这样做的目的是检查没有在头文件中声明的全局函数。<br /><br />◆Packed：当结构体带有packed属性但实际并没有出现紧缩式给出警告。<br /><br />◆Padded：如果结构体通过充填进行对齐则给出警告。<br /><br />◆unreachable-code：如果发现从未执行的代码时给出警告。<br /><br />◆Inline：如果某函数不能内嵌（inline），无论是声明为inline或者是指定了-finline-functions 选项，编译器都将发出警告。<br /><br />◆disabled-optimization：当需要太长时间或过多资源而导致不能完成某项优化时给出警告。<br /><br />上面是使用-Wall选项时没有生效，但又比较常用的一些警告选项。本文中要介绍的最后一个常用警告选项是-Werror。使用该选项后，GCC发现可疑之处时不会简单的发出警告就算完事，而是将警告作为一个错误而中断编译过程。该选项在希望得到高质量代码时非常有用。<br /><br />六、小结<br /><br />本文介绍了GCC的基本编译过程和编译模式，并详细阐述了GCC的一些常用选项以及警告功能。这些是在利用GCC进行应用编程时最基本也最常用的一些内容，我们会在后续文章中继续介绍GCC的调试和优化技术。<br />该命令将同时编译三个源文件，即first.c、second.c和 third.c，然后将它们连接成一个可执行程序，名为test。</span></p>
<p><span>附录：</span></p>
<p><span>[参数详解]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -x&nbsp;&nbsp;&nbsp; language&nbsp;&nbsp;&nbsp; filename&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp; 设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp; 据约定c语言的后缀名称是.c的，而c++的后缀名是.c或者.cpp,如果&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp; 你很个性，决定你的c代码文件的后缀名是.pig&nbsp;&nbsp;&nbsp; 哈哈，那你就要用这&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp; 个参数,这个参数对他后面的文件名都起作用，除非到了下一个参数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp; 的使用。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp; 可以使用的参数吗有下面的这些&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　　　&nbsp;&nbsp;&nbsp; `c,&nbsp;&nbsp;&nbsp; `objective-c,&nbsp;&nbsp;&nbsp; `c-header,&nbsp;&nbsp;&nbsp; `c++,&nbsp;&nbsp;&nbsp; `cpp-output,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　　　&nbsp;&nbsp;&nbsp; `assembler,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; `assembler-with-cpp.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp; 看到英文，应该可以理解的。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp; 例子用法:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp; gcc&nbsp;&nbsp;&nbsp; -x&nbsp;&nbsp;&nbsp; c&nbsp;&nbsp;&nbsp; hello.pig&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -x&nbsp;&nbsp;&nbsp; none&nbsp;&nbsp;&nbsp; filename&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　关掉上一个选项，也就是让gcc根据文件名后缀，自动识别文件类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　例子用法:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　gcc&nbsp;&nbsp;&nbsp; -x&nbsp;&nbsp;&nbsp; c&nbsp;&nbsp;&nbsp; hello.pig&nbsp;&nbsp;&nbsp; -x&nbsp;&nbsp;&nbsp; none&nbsp;&nbsp;&nbsp; hello2.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　只激活预处理,编译,和汇编,也就是他只把程序做成obj文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　例子用法:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　gcc&nbsp;&nbsp;&nbsp; -c&nbsp;&nbsp;&nbsp; hello.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　他将生成.o的obj文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　只激活预处理和编译，就是指把文件编译成为汇编代码。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　例子用法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　gcc&nbsp;&nbsp;&nbsp; -s&nbsp;&nbsp;&nbsp; hello.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　他将生成.s的汇编代码，你可以用文本编辑器察看&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　面.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　例子用法:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　gcc&nbsp;&nbsp;&nbsp; -e&nbsp;&nbsp;&nbsp; hello.c&nbsp;&nbsp;&nbsp; &gt;&nbsp;&nbsp;&nbsp; pianoapan.txt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　gcc&nbsp;&nbsp;&nbsp; -e&nbsp;&nbsp;&nbsp; hello.c&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; more&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　慢慢看吧,一个hello&nbsp;&nbsp;&nbsp; word&nbsp;&nbsp;&nbsp; 也要与处理成800行的代码&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　制定目标名称,缺省的时候,gcc&nbsp;&nbsp;&nbsp; 编译出来的文件是a.out,很难听,如果&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　你和我有同感，改掉它,哈哈&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　例子用法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　gcc&nbsp;&nbsp;&nbsp; -o&nbsp;&nbsp;&nbsp; hello.exe&nbsp;&nbsp;&nbsp; hello.c&nbsp;&nbsp;&nbsp; (哦,windows用习惯了)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　gcc&nbsp;&nbsp;&nbsp; -o&nbsp;&nbsp;&nbsp; hello.asm&nbsp;&nbsp;&nbsp; -s&nbsp;&nbsp;&nbsp; hello.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -pipe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　题&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　gcc&nbsp;&nbsp;&nbsp; -pipe&nbsp;&nbsp;&nbsp; -o&nbsp;&nbsp;&nbsp; hello.exe&nbsp;&nbsp;&nbsp; hello.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -ansi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　关闭gnu&nbsp;&nbsp;&nbsp; c中与ansi&nbsp;&nbsp;&nbsp; c不兼容的特性,激活ansi&nbsp;&nbsp;&nbsp; c的专有特性(包括禁止一&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　些asm&nbsp;&nbsp;&nbsp; inline&nbsp;&nbsp;&nbsp; typeof关键字,以及unix,vax等预处理宏,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -fno-asm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　此选项实现ansi选项的功能的一部分，它禁止将asm,inline和typeof用作&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　关键字。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -fno-strict-prototype&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　的对参数的个数和类型说明,而不是没有参数.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　明的类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -fthis-is-varialble&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　就是向传统c++看齐,可以使用this当一般变量使用.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -fcond-mismatch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -funsigned-char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -fno-signed-char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -fsigned-char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -fno-unsigned-char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　这四个参数是对char类型进行设置,决定将char类型设置成unsigned&nbsp;&nbsp;&nbsp; char(前&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　两个参数)或者&nbsp;&nbsp;&nbsp; signed&nbsp;&nbsp;&nbsp; char(后两个参数)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -include&nbsp;&nbsp;&nbsp; file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　用它设定,功能就相当于在代码中使用#include&lt;filename&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　例子用法:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　gcc&nbsp;&nbsp;&nbsp; hello.c&nbsp;&nbsp;&nbsp; -include&nbsp;&nbsp;&nbsp; /root/pianopan.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -imacros&nbsp;&nbsp;&nbsp; file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　中&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -dmacro&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　相当于c语言中的#define&nbsp;&nbsp;&nbsp; macro&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -dmacro=defn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　相当于c语言中的#define&nbsp;&nbsp;&nbsp; macro=defn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -umacro&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　相当于c语言中的#undef&nbsp;&nbsp;&nbsp; macro&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -undef&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　取消对任何非标准宏的定义&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -idir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　在你是用#include&quot;file&quot;的时候,gcc/g++会先在当前目录查找你所制定的头&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　文件,如果没有找到,他回到缺省的头文件目录找,如果使用-i制定了目录,他&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　回先在你所制定的目录查找,然后再按常规的顺序去找.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　对于#include&lt;file&gt;,gcc/g++会到-i制定的目录查找,查找不到,然后将到系&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　统的缺省的头文件目录查找&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -i-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　就是取消前一个参数的功能,所以一般在-idir之后使用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -idirafter&nbsp;&nbsp;&nbsp; dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　在-i的目录里面查找失败,讲到这个目录里面查找.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -iprefix&nbsp;&nbsp;&nbsp; prefix&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -iwithprefix&nbsp;&nbsp;&nbsp; dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　一般一起使用,当-i的目录查找失败,会到prefix+dir下查找&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -nostdinc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　使编译器不再系统缺省的头文件目录里面找头文件,一般和-i联合使用,明确&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　限定头文件的位置&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -nostdin&nbsp;&nbsp;&nbsp; c++&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创建&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　libg++库使用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　在预处理的时候,不删除注释信息,一般和-e使用,有时候分析程序，用这个很&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　方便的&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -m&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　生成文件关联的信息。包含目标文件所依赖的所有源代码&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　你可以用gcc&nbsp;&nbsp;&nbsp; -m&nbsp;&nbsp;&nbsp; hello.c来测试一下，很简单。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -mm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　和上面的那个一样，但是它将忽略由#include&lt;file&gt;造成的依赖关系。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -md&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　和-m相同，但是输出将导入到.d的文件里面&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -mmd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　和-mm相同，但是输出将导入到.d的文件里面&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -wa,option&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　项,然后传递给会汇编程序&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -wl.option&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　项,然后传递给会连接程序.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -llibrary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　制定编译的时候使用的库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　例子用法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　gcc&nbsp;&nbsp;&nbsp; -lcurses&nbsp;&nbsp;&nbsp; hello.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　使用ncurses库编译程序&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -ldir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　制定编译的时候，搜索库的路径。比如你自己的库，可以用它制定目录，不然&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　编译器将只在标准库的目录找。这个dir就是目录的名称。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -o0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -o1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -o2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -o3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　编译器的优化选项的4个级别，-o0表示没有优化,-o1为缺省值，-o3优化级别最&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　高　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　只是编译器，在编译的时候，产生条是信息。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -gstabs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　此选项以stabs格式声称调试信息,但是不包括gdb调试信息.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -gstabs+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; -ggdb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; 　　此选项将尽可能的生成gdb的可以使用的调试信息.</span></p>]]></description>
		</item>
		    
		
		<item>
			<title>一年之后的第一面：瑞星</title>
			<link>http://anchoretic.blog.sohu.com/85273415.html</link>
			<comments>http://anchoretic.blog.sohu.com/85273415.html#comment</comments>
			<dc:creator>我在隐身</dc:creator>
			<pubDate>Mon, 21 Apr 2008 14:33:43 +0800</pubDate>
			<category>我和工作</category>
			<guid>http://anchoretic.blog.sohu.com/85273415.html</guid>
			<description><![CDATA[上午面试笔试了瑞星，时间10：30到12：30。其中一个小时笔试，六道机试编程，两道问答；题目还不错，只不过我没答好，一年没面试笔试了，这次只当练兵了。结果，一周or两周给答复！~]]></description>
		</item>
		    
		
	</channel>
</rss>
