﻿<?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>IT博客-IT小小鸟的学习日记</title><link>http://www.cnitblog.com/lenatem/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 05 May 2026 04:35:23 GMT</lastBuildDate><pubDate>Tue, 05 May 2026 04:35:23 GMT</pubDate><ttl>60</ttl><item><title>程序员每天该做的事</title><link>http://www.cnitblog.com/lenatem/archive/2010/04/22/65523.html</link><dc:creator>雅量</dc:creator><author>雅量</author><pubDate>Thu, 22 Apr 2010 03:59:00 GMT</pubDate><guid>http://www.cnitblog.com/lenatem/archive/2010/04/22/65523.html</guid><wfw:comment>http://www.cnitblog.com/lenatem/comments/65523.html</wfw:comment><comments>http://www.cnitblog.com/lenatem/archive/2010/04/22/65523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/lenatem/comments/commentRss/65523.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/lenatem/services/trackbacks/65523.html</trackback:ping><description><![CDATA[摘自：<a href="http://blog.chinaunix.net/u1/33167/showart_463485.html">http://blog.chinaunix.net/u1/33167/showart_463485.html</a><br><br><span style="COLOR: red">每天该做的事</span><br>1、总结自己一天任务的完成情况 <br>最好的方式是写工作日志，把自己今天完成了什么事情，遇见了什么问题都记录下来，日后翻看好处多多 <br>2、考虑自己明天应该做的主要工作 <br>把明天要做的事情列出来，并按照优先级排列，第二天应该把自己效率最高的时间分配给最重要的工作 <br>3、考虑自己一天工作中失误的地方，并想出避免下一次再犯的方法 <br>出错不要紧，最重要的是不要重复犯相同的错误，那是愚蠢 <br>4、考虑自己一天工作完成的质量和效率能否还能提高 <br>一天只提高1%，365天你的效率就能提高多少倍你知道吗？ (1+0.01)^365 = 37 倍 <br>5、看一个有用的新闻网站或读一张有用的报纸，了解业界动态 <br>闭门造车是不行的，了解一下别人都在做什么，对自己能带来很多启示 <br>6、记住一位同事的名字及其特点 <br>你认识公司的所有同事吗？你了解他们吗？ <br>7、清理自己的代码 <br>今天完成的代码，把中间的调试信息，测试代码清理掉，按照编码风格整理好，注释都写好了吗？ <br>8、清理自己的桌面 <br>当日事当日毕，保持清洁干劲的桌面才能让你工作时不分心，程序员特别要把电脑的桌面清理干净 <br><br><span style="COLOR: red">程序员每周该做的事 <br></span>1、向你的老板汇报一次工作 <br>让你的老板知道你在做什么，这很重要。可以口头、书面、邮件，看你老板的工作方式而定 <br>2、进行一次自我总结（非正式） <br>这周之内自己表现得怎么样？该加分还是扣分？ <br>3、制定下周计划 <br>把下周要做的事情列出来，一样要分清楚优先级 <br>4、整理自己的文件夹、书柜和电脑文件 <br>把桌面以外的地方也要清理干净，电脑的文件夹，收到的邮件，把过时的垃圾全部清理掉 <br>5、与一个非公司的朋友沟通 <br>它山之石，可以攻玉 <br>6、看一本杂志 <br>找一本适合自己的专业杂志 <br>7、纠正自己或同事一个细节上的不正确做法 <br>《细节决定成败》看过了吗？没看过强烈建议先看看 <br><br><span style="COLOR: red">程序员每月该做的事</span> <br>1、至少和一个同事一起吃饭或喝茶 <br>不光了解自己工作伙伴的工作，还要了解他们的生活 <br>2、自我考核一次 <br>相对正式地考核自己一下，你对得起这个月的工资吗？ <br>3、对你的同事考核一次 <br>你的同事表现怎么样？哪些人值得学习，哪些人需要帮助？ <br>3、制定下月的计划，确定下月的工作重点 <br>4、总结自己工作质量改进状况 <br>自己的质量提高了多少？ <br>5、有针对性地对一项工作指标做深入地分析并得出改进的方案 <br>可以是对自己的，也可以是对公司的，一定要深入地分析后拿出自己的观点来。要想在老板面前说得上话，做的成事，工作上功夫要做足。 <br>6、与老板沟通一次 <br>最好是面对面地沟通，好好表现一下自己，虚心听取老板的意见，更重要的是要了解老板当前关心的重点<br>&nbsp;<br><span style="COLOR: red">程序员每年该做的事 <br></span>1、年终总结 <br>每个公司都会做的事情，但你真正认真地总结过自己吗？ <br>2、兑现给自己、给家人的承诺 <br>给老婆、儿子的新年礼物买了没有？给自己的呢？ <br>3、下年度工作规划 <br>好好想想自己明年的发展目标，争取升职/加薪、跳槽还是自己出来干？ <br>4、掌握一项新技术 <br>至少是一项，作为程序员一年要是一项新技术都学不到手，那就一定会被淘汰。 <br>掌握可不是看本书就行的，要真正懂得应用，最好你能够写一篇教程发表到你的blog <br>5、推出一种新产品 <br>可以是一个真正的产品，也可以只是一个类库，只要是你创造的东西就行，让别人使用它，也为世界作点贡献。当然如果真的很有价值，收点注册费也是应该的 <br>6、与父母团聚一次 <br>常回家看看，常回家看看 
<img src ="http://www.cnitblog.com/lenatem/aggbug/65523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/lenatem/" target="_blank">雅量</a> 2010-04-22 11:59 <a href="http://www.cnitblog.com/lenatem/archive/2010/04/22/65523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言多线程编程(一)</title><link>http://www.cnitblog.com/lenatem/archive/2010/03/30/64930.html</link><dc:creator>雅量</dc:creator><author>雅量</author><pubDate>Tue, 30 Mar 2010 05:49:00 GMT</pubDate><guid>http://www.cnitblog.com/lenatem/archive/2010/03/30/64930.html</guid><wfw:comment>http://www.cnitblog.com/lenatem/comments/64930.html</wfw:comment><comments>http://www.cnitblog.com/lenatem/archive/2010/03/30/64930.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnitblog.com/lenatem/comments/commentRss/64930.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/lenatem/services/trackbacks/64930.html</trackback:ping><description><![CDATA[先来看一个基本的例子：<br><span style="COLOR: #000000">
<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.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">pthread.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_68_161_Open_Image onclick="this.style.display='none'; Codehighlighter1_68_161_Open_Text.style.display='none'; Codehighlighter1_68_161_Closed_Image.style.display='inline'; Codehighlighter1_68_161_Closed_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_68_161_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_68_161_Closed_Text.style.display='none'; Codehighlighter1_68_161_Open_Image.style.display='inline'; Codehighlighter1_68_161_Open_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;tprocess1(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;args)</span><span id=Codehighlighter1_68_161_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnitblog.com/Images/dot.gif"></span><span id=Codehighlighter1_68_161_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_87_137_Open_Image onclick="this.style.display='none'; Codehighlighter1_87_137_Open_Text.style.display='none'; Codehighlighter1_87_137_Closed_Image.style.display='inline'; Codehighlighter1_87_137_Closed_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_87_137_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_87_137_Closed_Text.style.display='none'; Codehighlighter1_87_137_Open_Image.style.display='inline'; Codehighlighter1_87_137_Open_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span id=Codehighlighter1_87_137_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnitblog.com/Images/dot.gif"></span><span id=Codehighlighter1_87_137_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">tprocess1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;NULL;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_191_283_Open_Image onclick="this.style.display='none'; Codehighlighter1_191_283_Open_Text.style.display='none'; Codehighlighter1_191_283_Closed_Image.style.display='inline'; Codehighlighter1_191_283_Closed_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_191_283_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_191_283_Closed_Text.style.display='none'; Codehighlighter1_191_283_Open_Image.style.display='inline'; Codehighlighter1_191_283_Open_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;tprocess2(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;args)</span><span id=Codehighlighter1_191_283_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnitblog.com/Images/dot.gif"></span><span id=Codehighlighter1_191_283_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_210_259_Open_Image onclick="this.style.display='none'; Codehighlighter1_210_259_Open_Text.style.display='none'; Codehighlighter1_210_259_Closed_Image.style.display='inline'; Codehighlighter1_210_259_Closed_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_210_259_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_210_259_Closed_Text.style.display='none'; Codehighlighter1_210_259_Open_Image.style.display='inline'; Codehighlighter1_210_259_Open_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span id=Codehighlighter1_210_259_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnitblog.com/Images/dot.gif"></span><span id=Codehighlighter1_210_259_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">tprocess2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;NULL;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_296_495_Open_Image onclick="this.style.display='none'; Codehighlighter1_296_495_Open_Text.style.display='none'; Codehighlighter1_296_495_Closed_Image.style.display='inline'; Codehighlighter1_296_495_Closed_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_296_495_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_296_495_Closed_Text.style.display='none'; Codehighlighter1_296_495_Open_Image.style.display='inline'; Codehighlighter1_296_495_Open_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()</span><span id=Codehighlighter1_296_495_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnitblog.com/Images/dot.gif"></span><span id=Codehighlighter1_296_495_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;t1;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;t2;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_create(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">t1,NULL,tprocess1,NULL);<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_create(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">t2,NULL,tprocess2,NULL);<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(t1,NULL);<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br></span>在上面的例子中，我们首先加入了pthread.h文件包含，这是所以pthread多线程程序所必须的，接着是iostream我们进行输入输出时要用到，接着就是两个函数的定义，这和普通的函数没有什么区别，之所以写成的<br>&nbsp;程序代码<br><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;tprocess1(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;args)<br>这样的形式，完全是为了迎合pthread_create函数的参数类型，你也可以不这样定义，只要在调用pthread_create创建线程的时候强制转换一下指针类型就可以了。<br><br>这两个函数将被用做线程的执行体，也就是说在两个线程里同时运行这两个函数。<br><br>现在我们来看main函数，和pthread有关的调用都在这里了。<br>pthread_t是线程结构，用来保存线程相关数据，你也可以理解为是线程类型，声明一个线程对象（变量）。<br>&nbsp;程序代码<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;t1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;t2;<br>这里我们声明了两个线程变量t1,t2<br><br>&nbsp;程序代码<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_create(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">t1,NULL,tprocess1,NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_create(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">t2,NULL,tprocess2,NULL);<br>这两句非常重要，pthread_create用来创建线程并启动，他的原型是<br>&nbsp;程序代码<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;pthread_create(pthread_t&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;thread,&nbsp;pthread_attr_t&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;attr,&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">start_routine)(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">),&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;arg);<br>我们可以知道第一个参数是线程指针，第二参数是线程属性指针,线程属性pthread_attr_t用来指定线程优先级等属性，一般的情况下，我们没有必要修改，使用默认属性来构造线程，所以这里一般取NULL，我们也是这样做的，第三个参数是一个函数指针，就是线程要执行的代码，这里我们分别要执行tprocess1&nbsp;tprocess2就写成了上面的样子，这里这个函数指针的类型定义是返回一个空类型指针，接收一个空类型指针参数的函数指针，如果你的函数不是这个定义，那就可以直接转化一下就可以了。<br><br>写完这两行代码，两个线程就已经执行起来了，但是如果你省略了<br>&nbsp;程序代码<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(t1,NULL);<br>然后尝试编译运行程序的时候你会发现程序似乎什么也没干就退出了，是的，那是因为程序的主线程退出的时候操作系统会关闭应用程序使用的所有资源，包括线程&#8230;&#8230;所以在main函数结束前我们得想办法让程序停下来，pthread_join方法的功能就是等待线程结束，要等的线程就是第一个参数，程序会在这个地方停下来，直到线程结束，第二个参数用来接受线程函数的返回值，是void</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">类型的指针，如果没有返回值，就直接设为NULL吧。<br><br>程序写好了，我们怎么编译运行它呢？<br>如果你使用的是Linux:<br>在终端里输入<br>g</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;thread.cpp&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">othread&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">lpthread<br>.</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">thread<br>就可以完成程序的编译及运行<br></span><br><br><br>摘自：<a href="http://www.cnblogs.com/lovko/archive/2009/01/15/1376032.html">http://www.cnblogs.com/lovko/archive/2009/01/15/1376032.html</a>
<img src ="http://www.cnitblog.com/lenatem/aggbug/64930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/lenatem/" target="_blank">雅量</a> 2010-03-30 13:49 <a href="http://www.cnitblog.com/lenatem/archive/2010/03/30/64930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>strftime（）函数</title><link>http://www.cnitblog.com/lenatem/archive/2010/03/24/64801.html</link><dc:creator>雅量</dc:creator><author>雅量</author><pubDate>Wed, 24 Mar 2010 02:04:00 GMT</pubDate><guid>http://www.cnitblog.com/lenatem/archive/2010/03/24/64801.html</guid><wfw:comment>http://www.cnitblog.com/lenatem/comments/64801.html</wfw:comment><comments>http://www.cnitblog.com/lenatem/archive/2010/03/24/64801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/lenatem/comments/commentRss/64801.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/lenatem/services/trackbacks/64801.html</trackback:ping><description><![CDATA[我们可以使用strftime（）函数将时间格式化为我们想要的格式。它的原型如下：<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.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">size_t&nbsp;strftime(<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strDest,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;maxsize,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">format,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;tm&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">timeptr&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>);</span></div>
我们可以根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中，最多向strDest中存放maxsize个字符。该函数返回向strDest指向的字符串中放置的字符数。<br><br>函数strftime()的操作有些类似于sprintf()：识别以百分号(%)开始的格式命令集合，格式化输出结果放在一个字符串中。格式化命令说明串strDest中各种日期和时间信息的确切表示方法。格式串中的其他字符原样放进串中。格式命令列在下面，它们是区分大小写的。<br><br>%a 星期几的简写 <br>%A 星期几的全称 <br>%b 月分的简写 <br>%B 月份的全称 <br>%c 标准的日期的时间串 <br>%C 年份的后两位数字 <br>%d 十进制表示的每月的第几天 <br>%D 月/天/年 <br>%e 在两字符域中，十进制表示的每月的第几天 <br>%F 年-月-日 <br>%g 年份的后两位数字，使用基于周的年 <br>%G 年分，使用基于周的年 <br>%h 简写的月份名 <br>%H 24小时制的小时 <br>%I 12小时制的小时<br>%j 十进制表示的每年的第几天 <br>%m 十进制表示的月份 <br>%M 十时制表示的分钟数 <br>%n 新行符 <br>%p 本地的AM或PM的等价显示 <br>%r 12小时的时间 <br>%R 显示小时和分钟：hh:mm <br>%S 十进制的秒数 <br>%t 水平制表符 <br>%T 显示时分秒：hh:mm:ss <br>%u 每周的第几天，星期一为第一天 （值从0到6，星期一为0）<br>%U 第年的第几周，把星期日做为第一天（值从0到53）<br>%V 每年的第几周，使用基于周的年 <br>%w 十进制表示的星期几（值从0到6，星期天为0）<br>%W 每年的第几周，把星期一做为第一天（值从0到53） <br>%x 标准的日期串 <br>%X 标准的时间串 <br>%y 不带世纪的十进制年份（值从0到99）<br>%Y 带世纪部分的十制年份 <br>%z，%Z 时区名称，如果不能得到时区名称则返回空字符。<br>%% 百分号<br><br>如果想显示现在是几点了，并以12小时制显示，就象下面这段程序：<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.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">＃include&nbsp;&#8220;time.h&#8221;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>＃include&nbsp;&#8220;stdio.h&#8221;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_52_194_Open_Image onclick="this.style.display='none'; Codehighlighter1_52_194_Open_Text.style.display='none'; Codehighlighter1_52_194_Closed_Image.style.display='inline'; Codehighlighter1_52_194_Closed_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_52_194_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_52_194_Closed_Text.style.display='none'; Codehighlighter1_52_194_Open_Image.style.display='inline'; Codehighlighter1_52_194_Open_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_52_194_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnitblog.com/Images/dot.gif"></span><span id=Codehighlighter1_52_194_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;tm&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">ptr;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>time_t&nbsp;lt;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;str[</span><span style="COLOR: #000000">80</span><span style="COLOR: #000000">];<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>lt</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">time(NULL);<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>ptr</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">localtime(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">lt);<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>strftime(str,</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">It&nbsp;is&nbsp;now&nbsp;%I&nbsp;%p</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,ptr);<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>printf(str);<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
其运行结果为：<br>It is now 4PM<br><br>摘自：<a href="http://www.cnblogs.com/caolisong/archive/2007/04/11/709732.html">http://www.cnblogs.com/caolisong/archive/2007/04/11/709732.html</a><br>
<img src ="http://www.cnitblog.com/lenatem/aggbug/64801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/lenatem/" target="_blank">雅量</a> 2010-03-24 10:04 <a href="http://www.cnitblog.com/lenatem/archive/2010/03/24/64801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>stdarg.h中三个宏va_start ，va_arg和va_end </title><link>http://www.cnitblog.com/lenatem/archive/2010/03/24/64800.html</link><dc:creator>雅量</dc:creator><author>雅量</author><pubDate>Wed, 24 Mar 2010 01:39:00 GMT</pubDate><guid>http://www.cnitblog.com/lenatem/archive/2010/03/24/64800.html</guid><wfw:comment>http://www.cnitblog.com/lenatem/comments/64800.html</wfw:comment><comments>http://www.cnitblog.com/lenatem/archive/2010/03/24/64800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/lenatem/comments/commentRss/64800.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/lenatem/services/trackbacks/64800.html</trackback:ping><description><![CDATA[<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.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdarg.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;N</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Stdarg(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a1,<img src="http://www.cnitblog.com/Images/dot.gif">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_111_333_Open_Image onclick="this.style.display='none'; Codehighlighter1_111_333_Open_Text.style.display='none'; Codehighlighter1_111_333_Closed_Image.style.display='inline'; Codehighlighter1_111_333_Closed_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_111_333_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_111_333_Closed_Text.style.display='none'; Codehighlighter1_111_333_Open_Image.style.display='inline'; Codehighlighter1_111_333_Open_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_111_333_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnitblog.com/Images/dot.gif"></span><span id=Codehighlighter1_111_333_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;va_list&nbsp;argp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;ary[N];<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;va_start(argp,a1);<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ary[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a1;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;N;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ary[i]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">va_arg(argp,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">);<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;va_end(argp);&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;N;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">ary[i]</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main()<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_352_383_Open_Image onclick="this.style.display='none'; Codehighlighter1_352_383_Open_Text.style.display='none'; Codehighlighter1_352_383_Closed_Image.style.display='inline'; Codehighlighter1_352_383_Closed_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_352_383_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_352_383_Closed_Text.style.display='none'; Codehighlighter1_352_383_Open_Image.style.display='inline'; Codehighlighter1_352_383_Open_Text.style.display='inline';" src="http://www.cnitblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_352_383_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnitblog.com/Images/dot.gif"></span><span id=Codehighlighter1_352_383_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Stdarg(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">64</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">34</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">23</span><span style="COLOR: #000000">);<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p>(一)写一个简单的可变参数的C函数</p>
<p>下面我们来探讨如何写一个简单的可变参数的C函数.写可变参数的<br>C函数要在程序中用到以下这些宏:<br>void va_start( va_list arg_ptr, prev_param );</p>
<p>type va_arg( va_list arg_ptr, type );</p>
<p>void va_end( va_list arg_ptr );<br>va在这里是variable-argument(可变参数)的意思.<br>这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个<br>头文件.下面我们写一个简单的可变参数的函数,改函数至少有一个整数<br>参数,第二个参数也是整数,是可选的.函数只是打印这两个参数的值.<br>void simple_va_fun(int i, ...)<br>{<br>va_list arg_ptr;<br>int j=0;</p>
<p>va_start(arg_ptr, i);<br>j=va_arg(arg_ptr, int);<br>va_end(arg_ptr);<br>printf("%d %d\n", i, j);<br>return;<br>}<br>我们可以在我们的头文件中这样声明我们的函数:<br>extern void simple_va_fun(int i, ...);<br>我们在程序中可以这样调用:<br>simple_va_fun(100);<br>simple_va_fun(100,200);<br>从这个函数的实现可以看到,我们使用可变参数应该有以下步骤:<br>1)首先在函数里定义一个va_list型的变量,这里是arg_ptr,这个变<br>量是指向参数的指针.<br>2)然后用va_start宏初始化变量arg_ptr,这个宏的第二个参数是第<br>一个可变参数的前一个参数,是一个固定的参数.<br>3)然后用va_arg返回可变的参数,并赋值给整数j. va_arg的第二个<br>参数是你要返回的参数的类型,这里是int型.<br>4)最后用va_end宏结束可变参数的获取.然后你就可以在函数里使<br>用第二个参数了.如果函数有多个可变参数的,依次调用va_arg获<br>取各个参数.<br>如果我们用下面三种方法调用的话,都是合法的,但结果却不一样:<br>1)simple_va_fun(100);<br>结果是:100 -123456789(会变的值)<br>2)simple_va_fun(100,200);<br>结果是:100 200<br>3)simple_va_fun(100,200,300);<br>结果是:100 200</p>
<p>我们看到第一种调用有错误,第二种调用正确,第三种调用尽管结果<br>正确,但和我们函数最初的设计有冲突.下面一节我们探讨出现这些结果<br>的原因和可变参数在编译器中是如何处理的.</p>
<p>(二)可变参数在编译器中的处理</p>
<p>我们知道va_start,va_arg,va_end是在stdarg.h中被定义成宏的,<br>由于1)硬件平台的不同 2)编译器的不同,所以定义的宏也有所不同,下<br>面以VC++中stdarg.h里x86平台的宏定义摘录如下(&#8217;\&#8217;号表示折行):</p>
<p>typedef char * va_list;</p>
<p>#define _INTSIZEOF(n) \<br>((sizeof(n)+sizeof(int)-1)&amp;~(sizeof(int) - 1) )</p>
<p>#define va_start(ap,v) ( ap = (va_list)&amp;v + _INTSIZEOF(v) )</p>
<p>#define va_arg(ap,t) \<br>( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )</p>
<p>#define va_end(ap) ( ap = (va_list)0 )</p>
<p>定义_INTSIZEOF(n)主要是为了某些需要内存的对齐的系统.C语言的函<br>数是从右向左压入堆栈的,图(1)是函数的参数在堆栈中的分布位置.我<br>们看到va_list被定义成char*,有一些平台或操作系统定义为void*.再<br>看va_start的定义,定义为&amp;v+_INTSIZEOF(v),而&amp;v是固定参数在堆栈的<br>地址,所以我们运行va_start(ap, v)以后,ap指向第一个可变参数在堆<br>栈的地址,如图:</p>
<p>高地址|-----------------------------|<br>|函数返回地址 |<br>|-----------------------------|<br>|....... |<br>|-----------------------------|<br>|第n个参数(第一个可变参数) |<br>|-----------------------------|&lt;--va_start后ap指向<br>|第n-1个参数(最后一个固定参数)|<br>低地址|-----------------------------|&lt;-- &amp;v<br>图( 1 )</p>
<p>然后,我们用va_arg()取得类型t的可变参数值,以上例为int型为例,我<br>们看一下va_arg取int型的返回值:<br>j= ( *(int*)((ap += _INTSIZEOF(int))-_INTSIZEOF(int)) );<br>首先ap+=sizeof(int),已经指向下一个参数的地址了.然后返回<br>ap-sizeof(int)的int*指针,这正是第一个可变参数在堆栈里的地址<br>(图2).然后用*取得这个地址的内容(参数值)赋给j.</p>
<p>高地址|-----------------------------|<br>|函数返回地址 |<br>|-----------------------------|<br>|....... |<br>|-----------------------------|&lt;--va_arg后ap指向<br>|第n个参数(第一个可变参数) |<br>|-----------------------------|&lt;--va_start后ap指向<br>|第n-1个参数(最后一个固定参数)|<br>低地址|-----------------------------|&lt;-- &amp;v<br>图( 2 )</p>
<p>最后要说的是va_end宏的意思,x86平台定义为ap=(char*)0;使ap不再<br>指向堆栈,而是跟NULL一样.有些直接定义为((void*)0),这样编译器不<br>会为va_end产生代码,例如gcc在linux的x86平台就是这样定义的.<br>在这里大家要注意一个问题:由于参数的地址用于va_start宏,所<br>以参数不能声明为寄存器变量或作为函数或数组类型.<br>关于va_start, va_arg, va_end的描述就是这些了,我们要注意的<br>是不同的操作系统和硬件平台的定义有些不同,但原理却是相似的.</p>
<p>(三)可变参数在编程中要注意的问题</p>
<p>因为va_start, va_arg, va_end等定义成宏,所以它显得很愚蠢,<br>可变参数的类型和个数完全在该函数中由程序代码控制,它并不能智能<br>地识别不同参数的个数和类型.<br>有人会问:那么printf中不是实现了智能识别参数吗?那是因为函数<br>printf是从固定参数format字符串来分析出参数的类型,再调用va_arg<br>的来获取可变参数的.也就是说,你想实现智能识别可变参数的话是要通<br>过在自己的程序里作判断来实现的.<br>另外有一个问题,因为编译器对可变参数的函数的原型检查不够严<br>格,对编程查错不利.如果simple_va_fun()改为:<br>void simple_va_fun(int i, ...)<br>{<br>va_list arg_ptr;<br>char *s=NULL;</p>
<p>va_start(arg_ptr, i);<br>s=va_arg(arg_ptr, char*);<br>va_end(arg_ptr);<br>printf("%d %s\n", i, s);<br>return;<br>}<br>可变参数为char*型,当我们忘记用两个参数来调用该函数时,就会出现<br>core dump(Unix) 或者页面非法的错误(window平台).但也有可能不出<br>错,但错误却是难以发现,不利于我们写出高质量的程序.<br>以下提一下va系列宏的兼容性.<br>System V Unix把va_start定义为只有一个参数的宏:<br>va_start(va_list arg_ptr);<br>而ANSI C则定义为:<br>va_start(va_list arg_ptr, prev_param);<br>如果我们要用system V的定义,应该用vararg.h头文件中所定义的<br>宏,ANSI C的宏跟system V的宏是不兼容的,我们一般都用ANSI C,所以<br>用ANSI C的定义就够了,也便于程序的移植.</p>
<p><br>小结:<br>可变参数的函数原理其实很简单,而va系列是以宏定义来定义的,实<br>现跟堆栈相关.我们写一个可变函数的C函数时,有利也有弊,所以在不必<br>要的场合,我们无需用到可变参数.如果在C++里,我们应该利用C++的多<br>态性来实现可变参数的功能,尽量避免用C语言的方式来实现.&nbsp; <br><br>摘自：<a href="http://blog.csdn.net/zxianrong/archive/2009/01/04/3706405.aspx">http://blog.csdn.net/zxianrong/archive/2009/01/04/3706405.aspx</a><br></p>
<img src ="http://www.cnitblog.com/lenatem/aggbug/64800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/lenatem/" target="_blank">雅量</a> 2010-03-24 09:39 <a href="http://www.cnitblog.com/lenatem/archive/2010/03/24/64800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WSAStartup（）函数</title><link>http://www.cnitblog.com/lenatem/archive/2010/03/17/64704.html</link><dc:creator>雅量</dc:creator><author>雅量</author><pubDate>Wed, 17 Mar 2010 08:16:00 GMT</pubDate><guid>http://www.cnitblog.com/lenatem/archive/2010/03/17/64704.html</guid><wfw:comment>http://www.cnitblog.com/lenatem/comments/64704.html</wfw:comment><comments>http://www.cnitblog.com/lenatem/archive/2010/03/17/64704.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/lenatem/comments/commentRss/64704.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/lenatem/services/trackbacks/64704.html</trackback:ping><description><![CDATA[函数原型<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;WSAStartup<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;wVersionRequested,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPWSADATA&nbsp;lpWSAData<br>}；</span></div>
使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本，其中高位字节
指明副版本、低位字节指明主版本；操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时，操作系统根
据请求的Socket版本来搜索相应的Socket库，然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的
其它Socket函数了。该函数执行成功后返回0.例：假如一个程序要使用2.1版本的Socket，那么程序代码如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">wVersionRequested&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MAKEWORD(&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;);<br>err&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;WSAStartup(&nbsp;wVersionRequested,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">wsaData&nbsp;);</span></div>
返回值：0表示成功。<img src ="http://www.cnitblog.com/lenatem/aggbug/64704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/lenatem/" target="_blank">雅量</a> 2010-03-17 16:16 <a href="http://www.cnitblog.com/lenatem/archive/2010/03/17/64704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>