﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Only C/C++-随笔分类-c/c++</title><link>http://www.cppblog.com/cc/category/580.html</link><description>半亩方塘 天光云影</description><language>zh-cn</language><lastBuildDate>Sat, 25 Feb 2012 22:28:31 GMT</lastBuildDate><pubDate>Sat, 25 Feb 2012 22:28:31 GMT</pubDate><ttl>60</ttl><item><title>使用jpeglib库实现bmp转jpg (转)</title><link>http://www.cppblog.com/cc/archive/2012/02/22/166217.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Wed, 22 Feb 2012 03:04:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2012/02/22/166217.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/166217.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2012/02/22/166217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/166217.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/166217.html</trackback:ping><description><![CDATA[<div><h3><div><h1><span style="color:#3354AE">一、</span><span style="color:#3354AE">vc</span>编译jpeglib库</h1>  <h2><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;; color:#3354AE">1</span>、下载源代码</h2>  <p><span style="font-family:宋体;">下载地址：</span>http://www.ijg.org/<span style="font-family:宋体;">。注意：一定要下载</span>win32&nbsp;<span style="font-family:宋体;">版本</span></p>  <h2><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;; color:#3354AE">2</span><span style="color:#3354AE">、编译源代码</span><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;;color:#3354AE">.</span></h2>  <p>&nbsp;&nbsp;&nbsp;&nbsp;A<span style="font-family:宋体;">、解压源代码，修改源代码中</span>jconfig.vc<span style="font-family:宋体;">为</span>jconfig.h<span style="font-family:宋体;">；</span></p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;B<span style="font-family:宋体;">、添加环境变量</span>PATH<span style="font-family:宋体;">，</span>C:/Program Files/Microsoft Visual Studio/VC98/Bin&nbsp;<span style="font-family:宋体;">；</span></p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;C<span style="font-family:宋体;">、修改</span>makefile.vc<span style="font-family:宋体;">，将</span>&nbsp;Pull in standard variable definitions<span style="font-family:宋体;">下面的一行换为：</span>!include &lt;C:/Program Files/Microsoft Visual Studio/VC98/Include/win32.mak&gt;&nbsp;<span style="font-family:宋体;">；</span></p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;D<span style="font-family:宋体;">、进入命令提示环境下，输入：</span>vcvars32&nbsp;<span style="font-family:宋体;">回车，这是一个用来设置</span>VC<span style="font-family:宋体;">路径环境的批处理；</span></p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;E<span style="font-family:宋体;">、编译生成库文件</span>&nbsp;<span style="font-family:宋体;">命令：</span>nmake /f makefile.vc nodebug=1<span style="font-family:宋体;">；</span></p>  <p><span style="font-family:宋体;">这样就</span>OK<span style="font-family:宋体;">了</span></p>  <h2><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;; color:#3354AE">3</span><span style="color:#3354AE">、</span><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;;color:#3354AE">jpeglib</span><span style="color:#3354AE">库</span><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;;color:#3354AE">VC</span><span style="color:#3354AE">下使用</span></h2>  <p><span style="font-family:宋体;">对于库的使用只需要有相应的</span>.lib<span style="font-family:宋体;">文件和头文件就可以了。</span>Vc<span style="font-family:宋体;">中要添加</span>libjpeg.lib<span style="font-family:宋体;">库的连接</span></p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family:宋体;">将这几个文件拷贝到你的项目中：</span>libjpeg.lib<span style="font-family:宋体;">，</span>jconfig.h<span style="font-family:宋体;">，</span>jmorecfg.h<span style="font-family:宋体;">，</span>jpeglib.h<span style="font-family:宋体;">，在你需要进行压缩的文件中加入</span></p>  <p>extern "C" {</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include "jpeglib.h"</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include "jmorecfg.h"</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include "jconfig.h"</p>  <p>}</p>  <p><span style="font-family:宋体;">参考：</span></p>  <p><span style=" font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;Times New Roman&quot;;"><a href="http://blog.csdn.net/xingyu19871124/archive/2009/06/30/4310800.aspx"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:purple">http://blog.csdn.net/xingyu19871124/archive/2009/06/30/4310800.aspx</span></a></span></p>  <p><span style="font-family: 宋体; ">小知识：</span>bmp<span style="font-family: 宋体; ">文件的前</span>54<span style="font-family: 宋体; ">个字节是头，后面才是像素值。</span></p>  <h1><span style="color:#3354AE">二、使用jpeg</span><span style=" color:#3354AE">库压缩</span></h1>  <p><span style="font-family:宋体;">在源代码的文件夹下面有一个</span>example.c<span style="font-family:宋体;">的文件和</span>libjpeg.txt<span style="font-family:宋体;">，很有参考价值。</span></p>  <h2><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;; color:#3354AE">1</span><span style="color:#3354AE">、基本思路</span></h2>  <p><span style="font-family:宋体;">首先调用截屏程序，将屏幕的位图信息存放在一个</span>buffer<span style="font-family:宋体;">里面，然后调用</span>jpg<span style="font-family:宋体;">压缩函数，在当前的目录下生成一个</span>ok.jpg<span style="font-family:宋体;">的文件。</span></p>  <h2><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;; color:#3354AE">2</span>、出现的问题：</h2>  <p>A<span style="font-family:宋体;">、运行是总是报错：</span></p>  <p><span style="font-family: 宋体; ">我参考源代码的例子，也用</span>JSAMPLE * image_buffer;<span style="font-family: 宋体; ">来指向位图的像素的首地址，编译可以通过但是运行时就会报错，后来我用</span>BYTE *image_buffer;<span style="font-family: 宋体; ">来定义就可以正常运行了。</span></p>  <p>B<span style="font-family:宋体;">、生成的</span>jpg<span style="font-family:宋体;">图像失真：</span></p>  <p><span style="font-family: 宋体; ">由于</span>window<span style="font-family: 宋体; ">的位图的像素格式是：</span>BGRA<span style="font-family: 宋体; ">，</span>4<span style="font-family: 宋体; ">个字节，</span>jpeglib<span style="font-family: 宋体; ">库使用的是</span>RGB<span style="font-family: 宋体; ">，</span>3<span style="font-family: 宋体; ">个字节的格式，所以需要将源像素去掉其透明字节，同时改变</span>RGB<span style="font-family: 宋体; ">的顺序。代码如下：</span></p>  <p>//RGB<span style="font-family: 宋体; ">顺序调整</span></p>  <p>for (int i=0, int j=0; j &lt; 1440*900*4; i+=3, j+=4)</p>  <p>{</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;*(image_buffer+i)=*(image_buffer+j+2);</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;*(image_buffer+i+1)=*(image_buffer+j+1);</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;*(image_buffer+i+2)=*(image_buffer+j);</p>  <p>}</p>  <p>C<span style="font-family:宋体;">、生成的</span>jpg<span style="font-family:宋体;">文件图像是倒的：</span></p>  <p><span style="font-family: 宋体; ">原因没有找到，后来修改了压缩函数的代码，生成了正确的</span>jpg<span style="font-family: 宋体; ">文件</span></p>  <p>while (cinfo.next_scanline &lt; cinfo.image_height) {</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<span style="font-family: 宋体; ">这里我做过修改，由于</span>jpg<span style="font-family: 宋体; ">文件的图像是倒的，所以改了一下读的顺序</span></p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<span style="font-family: 宋体; ">这是原代码：</span>row_pointer[0] = &amp; bits[cinfo.next_scanline * row_stride];</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row_pointer[0] = &amp; bits[(cinfo.image_height - cinfo.next_scanline - 1) * row_stride];</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;(void) jpeg_write_scanlines(&amp;cinfo, row_pointer, 1);</p>  <p>}</p>  <h2><span style="font-family:&quot;Cambria&quot;,&quot;serif&quot;; color:#3354AE">3</span>、测试结果：</h2>  <p><span style="font-family:宋体;">我编写了测试代码，连续截屏并生成</span>jpg<span style="font-family:宋体;">文件</span>100<span style="font-family:宋体;">次，大约花费</span>7<span style="font-family:宋体;">秒左右，也就是说</span>1<span style="font-family:宋体;">秒可以截屏</span>13<span style="font-family:宋体;">次左右。同时生成的</span>jpg<span style="font-family:宋体;">文件有</span>100<span style="font-family:宋体;">多</span>K<span style="font-family:宋体;">的样子。</span></p>  <h1>三、代码：</h1>  <p>&nbsp;</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;"stdafx.h"<br />#include&nbsp;&lt;atlbase.h&gt;<br />#include&nbsp;&lt;afxwin.h&gt;<br />#include&nbsp;&lt;WINDOWSX.H&gt;<br />&nbsp;<br /><span style="color: #0000FF; ">#define</span>&nbsp;JPEG_QUALITY&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">它的大小决定jpg的质量好坏</span><br />&nbsp;<br /><span style="color: #0000FF; ">extern</span>&nbsp;"C"&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;"jpeglib.h"<br />&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;"jmorecfg.h"<br />&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;"jconfig.h"<br />}<br />&nbsp;<br /><span style="color: #0000FF; ">int</span>&nbsp;savejpeg(<span style="color: #0000FF; ">char</span>&nbsp;*filename,&nbsp;unsigned&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*bits,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;width,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;height,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;depth);<br /><span style="color: #0000FF; ">void</span>&nbsp;CapScreen(<span style="color: #0000FF; ">char</span>&nbsp;filename[]);<br />&nbsp;<br />BYTE&nbsp;*image_buffer;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">指向位图buffer的全局指针，window下像素格式:&nbsp;BGRA(4个字节)</span><span style="color: #008000; "><br /></span>&nbsp;<br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;argv[])<br />{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;image_buffer&nbsp;=&nbsp;(BYTE&nbsp;*)malloc(1440&nbsp;*&nbsp;900&nbsp;*&nbsp;4);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;100;&nbsp;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CapScreen("ok.bmp");&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">RGB顺序调整</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i=0,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j=0;&nbsp;j&nbsp;&lt;&nbsp;1440*900*4;&nbsp;i+=3,&nbsp;j+=4)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(image_buffer+i)=*(image_buffer+j+2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(image_buffer+i+1)=*(image_buffer+j+1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(image_buffer+i+2)=*(image_buffer+j);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;savejpeg("ok.jpg",&nbsp;image_buffer,&nbsp;1440,&nbsp;900,&nbsp;3);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]&nbsp;image_buffer;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br />&nbsp;<br />&nbsp;<br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">===================================================================================<br />function:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jpeg压缩<br />input:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1:生成的文件名,2:bmp的指针,3:位图宽度,4:位图高度,5:颜色深度<br />return:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int<br />description:&nbsp;&nbsp;&nbsp;&nbsp;bmp的像素格式为(RGB)<br />===================================================================================</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">int</span>&nbsp;savejpeg(<span style="color: #0000FF; ">char</span>&nbsp;*filename,&nbsp;unsigned&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*bits,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;width,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;height,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;depth)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;jpeg_compress_struct&nbsp;cinfo;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;jpeg_error_mgr&nbsp;jerr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE&nbsp;*&nbsp;outfile;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;target&nbsp;file&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSAMPROW&nbsp;row_pointer[1];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;pointer&nbsp;to&nbsp;JSAMPLE&nbsp;row[s]&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row_stride;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;physical&nbsp;row&nbsp;width&nbsp;in&nbsp;image&nbsp;buffer&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cinfo.err&nbsp;=&nbsp;jpeg_std_error(&amp;jerr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jpeg_create_compress(&amp;cinfo);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;((outfile&nbsp;=&nbsp;fopen(filename,&nbsp;"wb"))&nbsp;==&nbsp;NULL)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;"can't&nbsp;open&nbsp;%s/n",&nbsp;filename);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jpeg_stdio_dest(&amp;cinfo,&nbsp;outfile);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cinfo.image_width&nbsp;=&nbsp;width;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;image&nbsp;width&nbsp;and&nbsp;height,&nbsp;in&nbsp;pixels&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cinfo.image_height&nbsp;=&nbsp;height;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cinfo.input_components&nbsp;=&nbsp;3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;#&nbsp;of&nbsp;color&nbsp;components&nbsp;per&nbsp;pixel&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cinfo.in_color_space&nbsp;=&nbsp;JCS_RGB;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;colorspace&nbsp;of&nbsp;input&nbsp;image&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jpeg_set_defaults(&amp;cinfo);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jpeg_set_quality(&amp;cinfo,&nbsp;JPEG_QUALITY,&nbsp;TRUE&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;limit&nbsp;to&nbsp;baseline-JPEG&nbsp;values&nbsp;</span><span style="color: #008000; ">*/</span>);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jpeg_start_compress(&amp;cinfo,&nbsp;TRUE);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row_stride&nbsp;=&nbsp;width&nbsp;*&nbsp;depth;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;JSAMPLEs&nbsp;per&nbsp;row&nbsp;in&nbsp;image_buffer&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(cinfo.next_scanline&nbsp;&lt;&nbsp;cinfo.image_height)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">这里我做过修改，由于jpg文件的图像是倒的，所以改了一下读的顺序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">这是原代码：row_pointer[0]&nbsp;=&nbsp;&amp;&nbsp;bits[cinfo.next_scanline&nbsp;*&nbsp;row_stride];</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row_pointer[0]&nbsp;=&nbsp;&amp;&nbsp;bits[(cinfo.image_height&nbsp;-&nbsp;cinfo.next_scanline&nbsp;-&nbsp;1)&nbsp;*&nbsp;row_stride];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">void</span>)&nbsp;jpeg_write_scanlines(&amp;cinfo,&nbsp;row_pointer,&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jpeg_finish_compress(&amp;cinfo);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(outfile);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jpeg_destroy_compress(&amp;cinfo);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br />&nbsp;<br />&nbsp;<br /><span style="color: #0000FF; ">void</span>&nbsp;CapScreen(<span style="color: #0000FF; ">char</span>&nbsp;filename[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;CDC&nbsp;*pDC;<br />&nbsp;&nbsp;&nbsp;&nbsp;pDC&nbsp;=&nbsp;CDC::FromHandle(GetDC(GetDesktopWindow()));<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(pDC&nbsp;==&nbsp;NULL)&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;BitPerPixel&nbsp;=&nbsp;pDC-&gt;GetDeviceCaps(BITSPIXEL);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;Width&nbsp;=&nbsp;pDC-&gt;GetDeviceCaps(HORZRES);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;Height&nbsp;=&nbsp;pDC-&gt;GetDeviceCaps(VERTRES);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CDC&nbsp;memDC;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(memDC.CreateCompatibleDC(pDC)&nbsp;==&nbsp;0)&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CBitmap&nbsp;memBitmap,&nbsp;*oldmemBitmap;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(memBitmap.CreateCompatibleBitmap(pDC,&nbsp;Width,&nbsp;Height)&nbsp;==&nbsp;NULL)&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;oldmemBitmap&nbsp;=&nbsp;memDC.SelectObject(&amp;memBitmap);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(oldmemBitmap&nbsp;==&nbsp;NULL)&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(memDC.BitBlt(0,&nbsp;0,&nbsp;Width,&nbsp;Height,&nbsp;pDC,&nbsp;0,&nbsp;0,&nbsp;SRCCOPY)&nbsp;==&nbsp;0)&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BITMAP&nbsp;bmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;memBitmap.GetBitmap(&amp;bmp);<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">fp&nbsp;=&nbsp;fopen(filename,&nbsp;"w+b");</span><span style="color: #008000; "><br /></span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BITMAPINFOHEADER&nbsp;bih&nbsp;=&nbsp;{0};<br />&nbsp;&nbsp;&nbsp;&nbsp;bih.biBitCount&nbsp;=&nbsp;bmp.bmBitsPixel;<br />&nbsp;&nbsp;&nbsp;&nbsp;bih.biCompression&nbsp;=&nbsp;BI_RGB;<br />&nbsp;&nbsp;&nbsp;&nbsp;bih.biHeight&nbsp;=&nbsp;bmp.bmHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;bih.biPlanes&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;bih.biSize&nbsp;=&nbsp;<span style="color: #0000FF; ">sizeof</span>(BITMAPINFOHEADER);<br />&nbsp;&nbsp;&nbsp;&nbsp;bih.biSizeImage&nbsp;=&nbsp;bmp.bmWidthBytes&nbsp;*&nbsp;bmp.bmHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;bih.biWidth&nbsp;=&nbsp;bmp.bmWidth;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BITMAPFILEHEADER&nbsp;bfh&nbsp;=&nbsp;{0};<br />&nbsp;&nbsp;&nbsp;&nbsp;bfh.bfOffBits&nbsp;=&nbsp;<span style="color: #0000FF; ">sizeof</span>(BITMAPFILEHEADER)&nbsp;+&nbsp;<span style="color: #0000FF; ">sizeof</span>(BITMAPINFOHEADER);<br />&nbsp;&nbsp;&nbsp;&nbsp;bfh.bfSize&nbsp;=&nbsp;bfh.bfOffBits&nbsp;+&nbsp;bmp.bmWidthBytes&nbsp;*&nbsp;bmp.bmHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;bfh.bfType&nbsp;=&nbsp;(WORD)0x4d42;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">fwrite(&amp;bfh,&nbsp;1,&nbsp;sizeof(BITMAPFILEHEADER),&nbsp;fp);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">fwrite(&amp;bih,&nbsp;1,&nbsp;sizeof(BITMAPINFOHEADER),&nbsp;fp);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;image_buffer&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BYTE[bmp.bmWidthBytes&nbsp;*&nbsp;bmp.bmHeight];<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;GetDIBits(memDC.m_hDC,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(HBITMAP)&nbsp;memBitmap.m_hObject,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Height,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image_buffer,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(LPBITMAPINFO)&nbsp;&amp;bih,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIB_RGB_COLORS);<br />&nbsp;&nbsp;&nbsp;&nbsp;memDC.SelectObject(oldmemBitmap);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">fwrite(p,&nbsp;1,&nbsp;1280&nbsp;*&nbsp;800&nbsp;*&nbsp;4,&nbsp;fp);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">fclose(fp);</span><span style="color: #008000; "><br /></span>}<br />&nbsp;</div><p>&nbsp;</p></div><div><div></div></div></h3></div><img src ="http://www.cppblog.com/cc/aggbug/166217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2012-02-22 11:04 <a href="http://www.cppblog.com/cc/archive/2012/02/22/166217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC6.0下的GDI+配置(转)</title><link>http://www.cppblog.com/cc/archive/2012/02/21/166167.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Tue, 21 Feb 2012 12:23:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2012/02/21/166167.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/166167.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2012/02/21/166167.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/166167.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/166167.html</trackback:ping><description><![CDATA[<div><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><strong style="font-size: 12pt; ">GDI Plus 描述：</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">&nbsp;&nbsp;&nbsp;</span><span style="font-size: 12pt; "> GDIPlus是微软出的一个C++面向对象库，它为windows的图形设备接口提供了更好的访问。与标准的windows GDI相比，二维绘图和图片使用得到很大改进。使用GDIPlus你可以绘制定制的对象，打开各种图片并以各种格式存储它们，使用多种字体和文本绘制轨迹 和各种调色板功能。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><strong style="font-size: 12pt; ">GDI Plus兼容性：</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">&nbsp;&nbsp;&nbsp; GDIPlus最初是为MS Visual Studio 7开发的，但是因为这个产品的发布推迟了，所以微软就为Visual Studio 6发行了这个库的版本。如果你使用Visual Studio 6，可以从这里下载MFC GDI Plus库文件。</span><a target="_blank" style="color: #1463c4; text-decoration: none; "><span style="font-size: 12pt; ">http://www.codersource.net/samples/mfcgdiplus.zip</span></a></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">a）Visual Studio 7或者更新版本使用这个类库，只需要在你的工程里面包含&lt;gdiplus.h&gt;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">b）早期版本的MSVS要使用这个类库，需要将下载的zip文件解压到一个文件夹，设其路径为your_path，然后将目录your_path\ gdiplus\includes加入到开发环境的包含路径中（Tools-&gt;Options-&gt;Directories-&gt; Include files），然后在你的工程中你必须包含文件&lt;gdiplus&gt;，但是在那之前你必须定义define ULONG_PTR（这是GDIPlus中的一个定义，在老版本的VS中没有定义过）。也就是说，在StdAfx.h中你需要添加如下代码：</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">#define ULONG_PTR ULONG</span><br /><span style="font-size: 12pt; ">include &lt;gdiplus.h&gt;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">然后将目录your_path\gdiplus\lib包含到你的工程（Tools-&gt;Options-&gt;Directories-&gt;Library files），以使它们可以链接到你的程序。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">【efivol补充：还必须在StdAfx.h中#include &lt;gdiplus.h&gt;之后加入这两句，不然有错。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">using namespace Gdiplus;</span><br /><span style="font-size: 12pt; ">#pragma comment(lib, "gdiplus.lib")</span></p><span style="color: #9a9a9a; font-family: arial; line-height: 18px; background-color: #ffffff; font-size: 12pt; ">补充完毕】</span><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">在编译完你的工程之后，将your_path\gdiplus\gdiplus.dll拷贝到生成的执行文件所在的文件夹（\Debug或者\Release）</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><strong style="font-size: 12pt; ">使用GDI Plus类库：</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">要使用GDI Plus类库，你必须首先初始化类库。初始化是一个调用两个参数的函数，这两个参数是必须在整个GDIPlus会话中都存在的变量。在使用完GDIPlus之后，必须调用一个函数来关闭会话。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">如果你使用MFC，一个好的方法是在你的CWinApp派生的类中（比如CYourProjectApp）添加变量：</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">private：</span><br /><span style="font-size: 12pt; ">GdiplusStartupInput m_gdiplusStartupInput;</span><br /><span style="font-size: 12pt; ">ULONG_PTR m_pGdiToken;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">然后在app的InitInstance函数中的开始添加一行代码：</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">GdiplusStartup(&amp;m_pGdiToken,&amp;m_gdiplusStartupInput,NULL); //gdi+ init</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">然后重载ExitInstance函数（如果没有的话），在其中添加一行代码：</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">GdiplusShutdown(m_pGdiToken); //gdi+ end session</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">这些操作之后你就可以在你的程序中使用类库的功能了。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">可以使用了么？不可以。我们新建一个单文档的工程，按上面的步骤做完，然后在View类的OnDraw（）函数里添加如下代码：</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">Graphics graphics(pDC-&gt;m_hDC);</span><br /><span style="font-size: 12pt; ">Pen pen(Color(255, 0, 255));</span><br /><span style="font-size: 12pt; ">graphics.DrawLine(&amp;pen, 0, 0, 200, 100);</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">编译，出错。就这样还是被很多人转载，可恶吧。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">错误提示为：</span><br /><span style="font-size: 12pt; ">f:\includes\gdiplusenums.h(29) : error C2146: syntax error : missing ';' before identifier 'GraphicsState'</span><br /><span style="font-size: 12pt; ">f:\includes\gdiplusenums.h(29) : fatal error C1004: unexpected end of file found</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">这个错误在网上百度一下有很多，问的人多，回答的人也多，但就是几乎没有人答对。解决方法是</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">在#include &lt;gdiplus.h&gt;之前加上#include &lt;afxdtctl.h&gt;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">好了，一条线画出来了。为什么啊，这就不知道了，据说这个文件的作用是为IE4公共控件提供MFC支持。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">柳暗花明之后，才发现这里有篇文章&nbsp;</span><a target="_blank" style="color: #1463c4; text-decoration: none; "><span style="font-size: 12pt; ">Hints to get GDI+ running</span></a><span style="font-size: 12pt; ">，是一个人写的建议。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #6d6d6d; line-height: 26px; font-family: arial; font-size: 12px; background-color: #ffffff; "><span style="font-size: 12pt; ">里面说，要防止编译错误和问题，需要在#include &lt;gdiplus.h&gt;之前加上#include &lt;afxwin.h&gt;、&lt;afxext.h&gt;、&lt;afxdisp.h&gt;和&lt;afxdtctl.h&gt;。</span></p></div><img src ="http://www.cppblog.com/cc/aggbug/166167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2012-02-21 20:23 <a href="http://www.cppblog.com/cc/archive/2012/02/21/166167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C 代码优化（转）</title><link>http://www.cppblog.com/cc/archive/2010/05/24/116216.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Mon, 24 May 2010 06:04:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2010/05/24/116216.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/116216.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2010/05/24/116216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/116216.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/116216.html</trackback:ping><description><![CDATA[<span  style="font-family: sans-serif; font-size: 14px; line-height: 25px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">谈到优化，很多人都会直接想到汇编。难道优化只能在汇编层次吗？当然不是，C++层次一样可以作代码优化，其中有些常常是意想不到的。在C++层次进行优化，比在汇编层次优化具有更好的移植性，应该是优化中的首选做法。&nbsp;<br>1.确定浮点型变量和表达式是 float 型&nbsp;<br>&nbsp;&nbsp;&nbsp; 为了让编译器产生更好的代码(比如说产生3DNow! 或SSE指令的代码)，必须确定浮点型变量和表达式是 float 型的。要特别注意的是，以 "；F"； 或 "；f"； 为后缀（比如：3.14f）的浮点常量才是 float 型，否则默认是 double 型。为了避免 float 型参数自动转化为 double，请在函数声明时使用 float。&nbsp;<br>2.使用32位的数据类型&nbsp;<br>　　编译器有很多种，但它们都包含的典型的32位类型是：int，signed，signed int，unsigned，unsigned int，long，signed long，long int，signed long int，unsigned long，unsigned long int。尽量使用32位的数据类型，因为它们比16位的数据甚至8位的数据更有效率。&nbsp;<br>3.明智使用有符号整型变量&nbsp;<br>　　在很多情况下，你需要考虑整型变量是有符号还是无符号类型的。比如，保存一个人的体重数据时不可能出现负数，所以不需要使用有符号类型。但是，如果是要保存温度数据，就必须使用到有符号的变量。&nbsp;<br>　　在许多地方，考虑是否使用有符号的变量是必要的。在一些情况下，有符号的运算比较快；但在一些情况下却相反。&nbsp;<br>　　比如：整型到浮点转化时，使用大于16位的有符号整型比较快。因为x86构架中提供了从有符号整型转化到浮点型的指令，但没有提供从无符号整型转化到浮点的指令。看看编译器产生的汇编代码：&nbsp;<br>　　不好的代码：&nbsp;<br>编译前 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译后&nbsp;<br>double x；&nbsp;&nbsp;&nbsp;&nbsp;mov [foo + 4], 0&nbsp;<br>unsigned int i；&nbsp;&nbsp;&nbsp;mov eax, i&nbsp;<br>x = i；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov [foo], eax&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flid qword ptr [foo]&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fstp qword ptr [x]&nbsp;<br>　　上面的代码比较慢。不仅因为指令数目比较多，而且由于指令不能配对造成的FLID指令被延迟执行。最好用以下代码代替：&nbsp;<br>&nbsp;&nbsp;&nbsp; 推荐的代码：&nbsp;<br>编译前&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译后&nbsp;<br>double x；&nbsp;&nbsp;&nbsp;&nbsp;fild dword ptr&nbsp;<br>int i；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fstp qword ptr [x]&nbsp;<br>x = i；&nbsp;<br>　　在整数运算中计算商和余数时，使用无符号类型比较快。以下这段典型的代码是编译器产生的32位整型数除以4的代码：&nbsp;<br>　　不好的代码&nbsp;&nbsp;<br>编译前 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译后&nbsp;<br>int i；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov eax, i&nbsp;<br>i = i / 4； &nbsp;&nbsp;&nbsp;&nbsp;cdq&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and edx, 3&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add eax, edx&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sar eax, 2&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov i, eax&nbsp;<br>&nbsp;&nbsp;&nbsp; 推荐的代码<br>编译前 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译后&nbsp;<br>unsigned int i； &nbsp;&nbsp;&nbsp;shr i, 2&nbsp;<br>i = i / 4；&nbsp;<br>　总结：<br>　无符号类型用于：除法和余数,循环计数,数组下标<br>&nbsp; 有符号类型用于：整型到浮点的转化<br>4.while VS. for&nbsp;<br>　　在编程中，我们常常需要用到无限循环，常用的两种方法是while (1) 和 for (；；)。这两种方法效果完全一样，但那一种更好呢？然我们看看它们编译后的代码：&nbsp;<br>编译前 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译后&nbsp;<br>while (1)； &nbsp;&nbsp;&nbsp;&nbsp;mov eax,1&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test eax,eax&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;je foo+23h&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp foo+18h&nbsp;<br>编译前 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译后&nbsp;&nbsp;<br>for (；；)； &nbsp;&nbsp;&nbsp;&nbsp;jmp foo+23h&nbsp;<br>　　一目了然，for (；；)指令少，不占用寄存器，而且没有判断跳转，比while (1)好。&nbsp;<br>5.使用数组型代替指针型&nbsp;<br>　　使用指针会使编译器很难优化它。因为缺乏有效的指针代码优化的方法，编译器总是假设指针可以访问内存的任意地方，包括分配给其他变量的储存空间。所以为了编译器产生优化得更好的代码，要避免在不必要的地方使用指针。一个典型的例子是访问存放在数组中的数据。C++ 允许使用操作符 [] 或指针来访问数组，使用数组型代码会让优化器减少产生不安全代码的可能性。比如，x[0] 和x[2] 不可能是同一个内存地址，但 *p 和 *q 可能。强烈建议使用数组型，因为这样可能会有意料之外的性能提升。&nbsp;<br>&nbsp;&nbsp;&nbsp; 不好的代码<br>typedef struct<br>{<br>　　float x,y,z,w；<br>} VERTEX；<br>typedef struct<p>{<br>　　float m[4][4]；<br>} MATRIX；<br>void XForm(float* res, const float* v, const float* m, int nNumVerts)<br>{<br>　　float dp；<br>　　int i；<br>　　　const VERTEX* vv = (VERTEX *)v；<br>　　　for (i = 0； i &lt;； nNumVerts； i++)<br>　　{<br>　　　　dp = vv-&gt;；x * *m ++；<br>　　　　dp += vv-&gt;；y * *m ++；<br>　　　　dp += vv-&gt;；z * *m ++；<br>　　　　dp += vv-&gt;；w * *m ++；<br>　　　　*res ++ = dp；　　　　　　// 写入转换了的 x<br>　　　　dp = vv-&gt;；x * *m ++；<br>　　　　dp += vv-&gt;；y * *m ++；<br>　　　　dp += vv-&gt;；z * *m ++；<br>　　　　dp += vv-&gt;；w * *m ++；<br>　　　　*res ++ = dp；　　　　　// 写入转换了的 y<br>　　　　dp = vv-&gt;；x * *m ++；<br>　　　　dp += vv-&gt;；y * *m ++；<br>　　　　dp += vv-&gt;；z * *m ++；<br>　　　　dp += vv-&gt;；w * *m ++；<br>　　　　*res ++ = dp；　　　　// 写入转换了的 z<br>　　　　dp = vv-&gt;；x * *m ++；<br>　　　　dp += vv-&gt;；y * *m ++；<br>　　　　dp += vv-&gt;；z * *m ++；<br>　　　　dp += vv-&gt;；w * *m ++；<br>　　　　*res ++ = dp；　　　　// 写入转换了的 w<br>　　　　vv ++；　　　　　　　 // 下一个矢量<br>　　　　m -= 16；<br>　　}<br>}<br>&nbsp;&nbsp;&nbsp; 推荐的代码&nbsp;<br>typedef struct<br>{<br>　　float x,y,z,w；<br>} VERTEX；<br>typedef struct<br>{<br>　　float m[4][4]；<br>} MATRIX；<br>void XForm (float* res, const float* v, const float* m, int nNumVerts)<br>{<br>　　int i；<br>　　const VERTEX* vv = (VERTEX*)v；<br>　　const MATRIX* mm = (MATRIX*)m；<br>　　VERTEX* rr = (VERTEX*)res；<br>　　for (i = 0； i &lt;； nNumVerts； i++)<br>　　{<br>　　　　rr-&gt;；x = vv-&gt;；x * mm-&gt;；m[0][0] + vv-&gt;；y * mm-&gt;；m[0][1]<br>　　　　　　　　+ vv-&gt;；z * mm-&gt;；m[0][2] + vv-&gt;；w * mm-&gt;；m[0][3]；<br>　　　　rr-&gt;；y = vv-&gt;；x * mm-&gt;；m[1][0] + vv-&gt;；y * mm-&gt;；m[1][1]<br>　　　　　　　　+ vv-&gt;；z * mm-&gt;；m[1][2] + vv-&gt;；w * mm-&gt;；m[1][3]；<br>　　　　rr-&gt;；z = vv-&gt;；x * mm-&gt;；m[2][0] + vv-&gt;；y * mm-&gt;；m[2][1]<br>　　　　　　　　+ vv-&gt;；z * mm-&gt;；m[2][2] + vv-&gt;；w * mm-&gt;；m[2][3]；<br>　　　　rr-&gt;；w = vv-&gt;；x * mm-&gt;；m[3][0] + vv-&gt;；y * mm-&gt;；m[3][1]<br>　　　　　　　　+ vv-&gt;；z * mm-&gt;；m[3][2] + vv-&gt;；w * mm-&gt;；m[3][3]；<br>　　}<br>}&nbsp;<br>　　注意: 源代码的转化是与编译器的代码发生器相结合的。从源代码层次很难控制产生的机器码。依靠编译器和特殊的源代码，有可能指针型代码编译成的机器码比同等条件下的数组型代码运行速度更快。明智的做法是在源代码转化后检查性能是否真正提高了，再选择使用指针型还是数组型。&nbsp;<br>6.充分分解小的循环&nbsp;<br>　　要充分利用CPU的指令缓存，就要充分分解小的循环。特别是当循环体本身很小的时候，分解循环可以提高性能。BTW:很多编译器并不能自动分解循环。&nbsp;<br>不好的代码 推荐的代码&nbsp;<br>// 3D转化：把矢量 V 和 4x4 矩阵 M 相乘<br>for (i = 0； i &lt;； 4； i ++)<br>{<br>　　r = 0；<br>　　for (j = 0； j &lt;； 4； j ++)<br>　　{<br>　　　　r += M[j]*V[j]；<br>　　}<br>}<br>r[0] = M[0][0]*V[0] + M[1][0]*V[1] + M[2][0]*V[2] + M[3][0]*V[3]；<br>r[1] = M[0][1]*V[0] + M[1][1]*V[1] + M[2][1]*V[2] + M[3][1]*V[3]；<br>r[2] = M[0][2]*V[0] + M[1][2]*V[1] + M[2][2]*V[2] + M[3][2]*V[3]；<br>r[3] = M[0][3]*V[0] + M[1][3]*V[1] + M[2][3]*V[2] + M[3][3]*v[3]；&nbsp;<br>7.避免没有必要的读写依赖&nbsp;<br>　　当数据保存到内存时存在读写依赖，即数据必须在正确写入后才能再次读取。虽然AMD Athlon等CPU有加速读写依赖延迟的硬件，允许在要保存的数据被写入内存前读取出来，但是，如果避免了读写依赖并把数据保存在内部寄存器中，速度会更快。在一段很长的又互相依赖的代码链中，避免读写依赖显得尤其重要。如果读写依赖发生在操作数组时，许多编译器不能自动优化代码以避免读写依赖。所以推荐程序员手动去消除读写依赖，举例来说，引进一个可以保存在寄存器中的临时变量。这样可以有很大的性能提升。下面一段代码是一个例子：&nbsp;<br>&nbsp;&nbsp;&nbsp; 不好的代码<br>float x[VECLEN], y[VECLEN], z[VECLEN]；<br>......&nbsp;<br>for (unsigned int k = 1； k &lt;； VECLEN； k ++)<br>{<br>　　x[k] = x[k-1] + y[k]；<br>}<br>for (k = 1； k &lt;； VECLEN； k++)<br>{<br>　　x[k] = z[k] * (y[k] - x[k-1])；<br>}<br>　　 推荐的代码&nbsp;<br>float x[VECLEN], y[VECLEN], z[VECLEN]；<br>......&nbsp;<br>float t(x[0])；<br>for (unsigned int k = 1； k &lt;； VECLEN； k ++)<br>{<br>　　t = t + y[k]；<br>　　x[k] = t；<br>}<br>t = x[0]；<br>for (k = 1； k &lt;； VECLEN； k ++)<br>{<br>　　t = z[k] * (y[k] - t)；<br>　　x[k] = t；<br>}&nbsp;<br>8.Switch 的用法&nbsp;<br>　　Switch 可能转化成多种不同算法的代码。其中最常见的是跳转表和比较链/树。推荐对case的值依照发生的可能性进行排序，把最有可能的放在第一个，当switch用比较链的方式转化时，这样可以提高性能。此外，在case中推荐使用小的连续的整数，因为在这种情况下，所有的编译器都可以把switch 转化成跳转表。&nbsp;<br>&nbsp;&nbsp;&nbsp; 不好的代码<br>int days_in_month, short_months, normal_months, long_months；<br>......&nbsp;<br>switch (days_in_month)<br>{<br>　　case 28:<br>　　case 29:<br>　　　　short_months ++；<br>　　　　break；<br>　　case 30:<br>　　　　normal_months ++；<br>　　　　break；<br>　　case 31:<br>　　　　long_months ++；<br>　　　　break；<br>　　default:<br>　　　　cout &lt;；&lt;； "；month has fewer than 28 or more than 31 days"； &lt;；&lt;； endl；<br>　　　　break；<br>}<br>&nbsp;&nbsp;&nbsp; 推荐的代码&nbsp;<br>int days_in_month, short_months, normal_months, long_months；<br>......&nbsp;<br>switch (days_in_month)<br>{<br>　　case 31:<br>　　　　long_months ++；<br>　　　　break；<br>　　case 30:<br>　　　　normal_months ++；<br>　　　　break；<br>　　case 28:<br>　　case 29:<br>　　　　short_months ++；&nbsp;<br>　　　　break；<br>　　default:<br>　　　　cout &lt;；&lt;； "；month has fewer than 28 or more than 31 days"； &lt;；&lt;； endl；<br>　　　　break；<br>}&nbsp;<br>9.所有函数都应该有原型定义&nbsp;<br>　　一般来说，所有函数都应该有原型定义。原型定义可以传达给编译器更多的可能用于优化的信息。&nbsp;<br>　　尽可能使用常量(const)。C++ 标准规定，如果一个const声明的对象的地址不被获取，允许编译器不对它分配储存空间。这样可以使代码更有效率，而且可以生成更好的代码。&nbsp;<br>10.提升循环的性能<br>　　要提升循环的性能，减少多余的常量计算非常有用（比如，不随循环变化的计算）。&nbsp;<br>　　不好的代码(在for()中包含不变的if()) 推荐的代码&nbsp;<br>for( i ... )<br>{<br>　　if( CONSTANT0 )<br>　　{<br>　　　　DoWork0( i )； // 假设这里不改变CONSTANT0的值<br>　　}<br>　　else<br>　　{<br>　　　　DoWork1( i )； // 假设这里不改变CONSTANT0的值<br>　　}<br>}<br>if( CONSTANT0 )<br>{<br>　　for( i ... )<br>　　{<br>　　　　DoWork0( i )；<br>　　}<br>}<br>else<br>{<br>　　for( i ... )<br>　　{<br>　　　　DoWork1( i )；<br>　　}<br>}&nbsp;<br>　　如果已经知道if()的值，这样可以避免重复计算。虽然不好的代码中的分支可以简单地预测，但是由于推荐的代码在进入循环前分支已经确定，就可以减少对分支预测的依赖。 　　把本地函数声明为静态的(static)&nbsp;<br>　　如果一个函数在实现它的文件外未被使用的话，把它声明为静态的(static)以强制使用内部连接。否则，默认的情况下会把函数定义为外部连接。这样可能会影响某些编译器的优化——比如，自动内联。&nbsp;<br>11.考虑动态内存分配&nbsp;<br>　　动态内存分配（C++中的"；new"；）可能总是为长的基本类型（四字对齐）返回一个已经对齐的指针。但是如果不能保证对齐，使用以下代码来实现四字对齐。这段代码假设指针可以映射到 long 型。&nbsp;<br>　　例子&nbsp;<br>　　double* p = (double*)new BYTE[sizeof(double) * number_of_doubles+7L]；<br>&nbsp;&nbsp;&nbsp; double* np = (double*)((long(p) + 7L) &amp;； &#8211;8L)；&nbsp;<br>　　现在，你可以使用 np 代替 p 来访问数据。注意：释放储存空间时仍然应该用delete p。&nbsp;<br>12.使用显式的并行代码&nbsp;<br>　　尽可能把长的有依赖的代码链分解成几个可以在流水线执行单元中并行执行的没有依赖的代码链。因为浮点操作有很长的潜伏期，所以不管它被映射成 x87 或 3DNow! 指令，这都很重要。很多高级语言，包括C++，并不对产生的浮点表达式重新排序，因为那是一个相当复杂的过程。需要注意的是，重排序的代码和原来的代码在代数上一致并不等价于计算结果一致，因为浮点操作缺乏精确度。在一些情况下，这些优化可能导致意料之外的结果。幸运的是，在大部分情况下，最后结果可能只有最不重要的位（即最低位）是错误的。&nbsp;<br>　　不好的代码<br>double a[100], sum；<br>int i；<br>sum = 0.0f；<br>for (i=0； i&lt;；100； i++)<br>　　sum += a；&nbsp;<br>&nbsp;&nbsp;&nbsp; 推荐的代码&nbsp;<br>double a[100], sum1, sum2, sum3, sum4, sum；<br>int i；<br>sum1 = sum2 = sum3 = sum4 = 0.0；<br>for (i = 0； i &lt;； 100； i += 4)<br>{<br>　　sum1 += a；<br>　　sum2 += a[i+1]；<br>　　sum3 += a[i+2]；<br>　　sum4 += a[i+3]；<br>}<br>sum = (sum4+sum3)+(sum1+sum2)；&nbsp;<br>　　要注意的是：使用4 路分解是因为这样使用了4阶段流水线浮点加法，浮点加法的每一个阶段占用一个时钟周期，保证了最大的资源利用率。&nbsp;<br>13.提出公共子表达式&nbsp;<br>　　在某些情况下，C++编译器不能从浮点表达式中提出公共的子表达式，因为这意味着相当于对表达式重新排序。需要特别指出的是，编译器在提取公共子表达式前不能按照代数的等价关系重新安排表达式。这时，程序员要手动地提出公共的子表达式（在VC.net里有一项&#8220;全局优化&#8221;选项可以完成此工作，但效果就不得而知了）。&nbsp;<br>推荐的代码&nbsp;<br>float a, b, c, d, e, f；<br>...<br>e = b * c / d；<br>f = b / d * a；<br>float a, b, c, d, e, f；<br>...<br>const float t(b / d)；<br>e = c * t；<br>f = a * t；&nbsp;<br>推荐的代码&nbsp;<br>float a, b, c, e, f；<br>...<br>e = a / c；<br>f = b / c；<br>float a, b, c, e, f；<br>...<br>const float t(1.0f / c)；<br>e = a * t；<br>f = b * t；&nbsp;<br>14.结构体成员的布局&nbsp;<br>　　很多编译器有&#8220;使结构体字，双字或四字对齐&#8221;的选项。但是，还是需要改善结构体成员的对齐，有些编译器可能分配给结构体成员空间的顺序与他们声明的不同。但是，有些编译器并不提供这些功能，或者效果不好。所以，要在付出最少代价的情况下实现最好的结构体和结构体成员对齐，建议采取这些方法：&nbsp;<br>　　A按类型长度排序&nbsp;<br>　　把结构体的成员按照它们的类型长度排序，声明成员时把长的类型放在短的前面。&nbsp;<br>　　把结构体填充成最长类型长度的整倍数&nbsp;<br>　　把结构体填充成最长类型长度的整倍数。照这样，如果结构体的第一个成员对齐了，所有整个结构体自然也就对齐了。下面的例子演示了如何对结构体成员进行重新排序：&nbsp;<br>　　不好的代码，普通顺序 推荐的代码，新的顺序并手动填充了几个字节<br>struct<br>{<br>　　char a[5]；<br>　　long k；<br>　　double x；<br>} baz；<br>struct<br>{<br>　　double x；<br>　　long k；<br>　　char a[5]；<br>char pad[7]；<br>} baz；</p><p>　　这个规则同样适用于类的成员的布局。&nbsp;<br>　　B按数据类型的长度排序本地变量&nbsp;<br>　　当编译器分配给本地变量空间时，它们的顺序和它们在源代码中声明的顺序一样，和上一条规则一样，应该把长的变量放在短的变量前面。如果第一个变量对齐了，其它变量就会连续的存放，而且不用填充字节自然就会对齐。有些编译器在分配变量时不会自动改变变量顺序，有些编译器不能产生4字节对齐的栈，所以4字节可能不对齐。下面这个例子演示了本地变量声明的重新排序：&nbsp;<br>　　不好的代码，普通顺序 推荐的代码，改进的顺序&nbsp;<br>short ga, gu, gi；<br>long foo, bar；<br>double x, y, z[3]；<br>char a, b；<br>float baz；<br>double z[3]；<br>double x, y；<br>long foo, bar；<br>float baz；<br>short ga, gu, gi；&nbsp;<br>14.避免不必要的整数除法&nbsp;<br>　　整数除法是整数运算中最慢的，所以应该尽可能避免。一种可能减少整数除法的地方是连除，这里除法可以由乘法代替。这个替换的副作用是有可能在算乘积时会溢出，所以只能在一定范围的除法中使用。&nbsp;<br>　　不好的代码 推荐的代码&nbsp;<br>int i, j, k, m；<br>m = i / j / k；<br>int i, j, k, m；<br>m = i / (j * k)；&nbsp;<br>15.把频繁使用的指针型参数拷贝到本地变量&nbsp;<br>　　避免在函数中频繁使用指针型参数指向的值。因为编译器不知道指针之间是否存在冲突，所以指针型参数往往不能被编译器优化。这样是数据不能被存放在寄存器中，而且明显地占用了内存带宽。注意，很多编译器有&#8220;假设不冲突&#8221;优化开关（在VC里必须手动添加编译器命令行/Oa或/Ow），这允许编译器假设两个不同的指针总是有不同的内容，这样就不用把指针型参数保存到本地变量。否则，请在函数一开始把指针指向的数据保存到本地变量。如果需要的话，在函数结束前拷贝回去。 　　<br>&nbsp;&nbsp;&nbsp; 不好的代码&nbsp;<br>// 假设 q != r<br>void isqrt(unsigned long a, unsigned long* q, unsigned long* r)<br>{<br>　　*q = a；<br>　　if (a &gt;； 0)<br>　　{<br>　　　　while (*q &gt;； (*r = a / *q))<br>　　　　{<br>　　　　　　*q = (*q + *r) &gt;；&gt;； 1；<br>　　　　}<br>　　}<br>　　*r = a - *q * *q；<br>}<br>&nbsp;&nbsp;&nbsp; 推荐的代码<br>// 假设 q != r<br>void isqrt(unsigned long a, unsigned long* q, unsigned long* r)<br>{<br>　　unsigned long qq, rr；<br>　　qq = a；<br>　　if (a &gt;； 0)<br>　　{<br>　　　　while (qq &gt;； (rr = a / qq))<br>　　　　{<br>　　　　　　qq = (qq + rr) &gt;；&gt;； 1；<br>　　　　}<br>　　}<br>　　rr = a - qq * qq；<br>　　*q = qq；<br>　　*r = rr；<br>}&nbsp;<br>16.赋值与初始化<br>先看看以下代码：&nbsp;<br>class CInt<br>{<br>　　int m_i；&nbsp;<br>public:<br>　　CInt(int a = 0):m_i(a) { cout &lt;；&lt;； "；CInt"； &lt;；&lt;； endl； }<br>　　~CInt() { cout &lt;；&lt;； "；~CInt"； &lt;；&lt;； endl； }&nbsp;<br>　　CInt operator + (const CInt&amp;； a) { return CInt(m_i + a.GetInt())； }&nbsp;<br>　　void SetInt(const int i)　　{ m_i = i； }<br>　　int GetInt() const　　　　　　{ return m_i； }<br>}；<br>&nbsp;&nbsp;&nbsp; 不好的代码&nbsp;<br>void main()<br>{<br>　　CInt a, b, c；<br>　　a.SetInt(1)；<br>　　b.SetInt(2)；<br>　　c = a + b；<br>}<br>&nbsp;&nbsp;&nbsp; 推荐的代码<br>void main()<br>{<br>　　CInt a(1), b(2)；<br>　　CInt c(a + b)；<br>}&nbsp;<br>　　这两段代码所作的事都一样，但那一个更好呢？看看输出结果就会发现，不好的代码输出了四个"；CInt"；和四个"；~CInt"；，而推荐的代码只输出三个。也就是说，第二个例子比第一个例子少生成一次临时对象。Why? 请注意，第一个中的c用的是先声明再赋值的方法，第二个用的是初始化的方法，它们有本质的区别。第一个例子的"；c = a + b"；先生成一个临时对象用来保存a + b的值，再把该临时对象用位拷贝的方法给c赋值，然后临时对象被销毁。这个临时对象就是那个多出来的对象。第二个例子直接用拷贝构造函数的方法对c初始化，不产生临时对象。所以，尽量在需要使用一个对象时才声明，并用初始化的方法赋初值。&nbsp;<br>17.尽量使用成员初始化列表&nbsp;<br>　　在初始化类的成员时，尽量使用成员初始化列表而不是传统的赋值方式。&nbsp;<br>　　不好的代码&nbsp;<br>class CMyClass<br>{<br>　　string strName；&nbsp;<br>public:<br>　　CMyClass(const string&amp;； str)；<br>}；&nbsp;<br>CMyClass::CMyClass(const string&amp;； str)<br>{<br>　　strName = str；<br>}<br>&nbsp;&nbsp;&nbsp; 推荐的代码<br>class CMyClass<br>{<br>　　string strName；<br>　　int i；<br>public:<br>　　CMyClass(const string&amp;； str)；<br>}；&nbsp;<br>CMyClass::CMyClass(const string&amp;；str)<br>&nbsp;&nbsp; :strName(str)<br>{</p><p>}&nbsp;<br>　　不好的例子用的是赋值的方式。这样，strName会先被建立（调用了string的默认构造函数），再由参数str赋值。而推荐的例子用的是成员初始化列表，strName直接构造为str，少调用一次默认构造函数，还少了一些安全隐患。zhuan</p></span><img src ="http://www.cppblog.com/cc/aggbug/116216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2010-05-24 14:04 <a href="http://www.cppblog.com/cc/archive/2010/05/24/116216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C 高效编程忠告（转）</title><link>http://www.cppblog.com/cc/archive/2010/05/24/116212.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Mon, 24 May 2010 05:09:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2010/05/24/116212.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/116212.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2010/05/24/116212.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/116212.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/116212.html</trackback:ping><description><![CDATA[<font  color="#B20000" face="sans-serif" size="6"><span  style="font-size: 20px;"><strong><span  style="color: rgb(0, 0, 0); font-weight: normal; font-size: 14px; line-height: 25px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><strong><span style="color: red; ">一、#include &#8220;filename.h&#8221;和#include &lt;filename.h&gt;的区别</span></strong><br>#include &#8220;filename.h&#8221;是指编译器将从当前工作目录上开始查找此文件<br>#include &lt;filename.h&gt;是指编译器将从标准库目录中开始查找此文件<br><br><strong><span style="color: red; ">二、头文件的作用</span></strong><br>加强安全检测<br>通过头文件可能方便地调用库功能，而不必关心其实现方式<br><br><strong><span style="color: red; ">三、* , &amp;修饰符的位置<br></span></strong>int *i,j; // better for read<br>&nbsp;i = new int(0);<br>&nbsp;j = 0;<br>&nbsp;int *&amp;y = i; // pointer's reference<br>对于*和&amp;修饰符，为了避免误解，最好将修饰符紧靠变量名<br><br><strong><span style="color: red; ">四、if语句</span></strong><br>不要将布尔变量与任何值进行比较，那会很容易出错的。<br>整形变量必须要有类型相同的值进行比较<br>浮点变量最好少比相等，可以通过求差与较小的数比较<br>指针变量要和NULL进行比较，不要和布尔型和整形比较<br><br><strong><span style="color: red; ">五、const和#define的比较</span></strong><br>const有数据类型，#define没有数据类型<br>个别编译器中const可以进行调试，#define不可以进行调试<br>在类中定义常量有两种方式<br>1、 在类在声明常量，但不赋值，在构造函数初始化表中进行赋值；（常量和引用类型的成员变量必须通过初始化列表来初始化赋值）<br>2、 用枚举代替const常量。<br><br><strong><span style="color: red; ">六、C++函数中值的传递方式</span></strong><br>有三种方式：值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference)<br>void fun(char c) //pass by value<br>void fun(char *str) //pass by pointer<br>void fun(char &amp;str) //pass by reference<br>如果输入参数是以值传递的话，最好使用引用传递代替，因为引用传递省去了临时对象的构造和析构<br>函数的返回类型不能省略，就算没有也要加个void<br><br><strong><span style="color: red; ">七、函数体中的指针或引用常量不能被返回</span></strong><div class="code">Char *func(void)<br>{<br>&nbsp;char str[]=&#8221;Hello Word&#8221;;<br>&nbsp;//这个是不能被返回的，因为str是个指定变量，不是一般的值，函数结束后会被注销掉<br>&nbsp;return str;&nbsp;<br>}</div>函数体内的指针变量并不会随着函数的消亡而自动释放<br><br><strong><span style="color: red; ">八、一个内存拷贝函数的实现体</span></strong><div class="code">void *memcpy(void *pvTo,const void *pvFrom,size_t size)<br><br>{<br><br>&nbsp;assert((pvTo!=NULL)&amp;&amp;(pvFrom!=NULL));<br><br>&nbsp;byte *pbTo=(byte*)pvTo; //防止地址被改变<br><br>&nbsp;byte *pbFrom=(byte*)pvFrom;<br><br>&nbsp;while (size-- &gt;0)<br><br>&nbsp;pbTo++ = pbForm++;<br><br>&nbsp;return pvTo;<br><br>}&nbsp;<br></div><br><strong><span style="color: red; ">九、内存的分配方式</span></strong><br>分配方式有三种，请记住，说不定那天去面试的时候就会有人问你这问题<br>1、 静态存储区，是在程序编译时就已经分配好的，在整个运行期间都存在，如全局变量、常量。（程序编译后运行时包含code和data两部分，其中data即为静态存储区分配，程序一开始运行便分配整个data的东东）<br>2、 栈上分配，函数内的局部变量就是从这分配的，但分配的内存容易有限。<br>3、 堆上分配，也称动态分配，如我们用new,malloc分配内存，用delete,free来释放的内存。<br><br><strong><span style="color: red; ">十、内存分配的注意事项</span></strong><br>用new或malloc分配内存时，必须要对此指针赋初值。<br>用delete 或free释放内存后，必须要将指针指向NULL<br>不能修改指向常量的指针数据<br><br><strong><span style="color: red; ">十一、内容复制与比较</span></strong><div class="code">//数组&#8230;&#8230;<br>char a[]=&#8221;Hello Word!&#8221;;<br>char b[10];<br>strcpy(b,a);<br>if (strcmp(a,b)==0)<br>{}</div><div class="code">//指针&#8230;&#8230;<br>char a[]=&#8221;Hello Word!&#8221;;<br>char *p;<br>p=new char[strlen(a)+1];<br>strcpy(p,a);<br>if (strcmp(p,a)==0)<br>{}</div><br><strong><span style="color: red; ">十二、sizeof的问题</span></strong><br>记住一点，C++无法知道指针所指对象的大小，指针的大小永远为4字节<div class="code">char a[]=&#8221;Hello World!&#8221;<br>char *p=a;<br>count&lt;&lt;sizeof(a)&lt;&lt;end; //12字节<br>count&lt;&lt;sizeof(p)&lt;&lt;endl; //4字节</div>而且，在函数中，数组参数退化为指针，所以下面的内容永远输出为4<div class="code">void fun(char a[1000])<br>{<br>count&lt;&lt;sizeof(a)&lt;&lt;endl; //输出4而不是1000<br>}</div><br><strong><span style="color: red; ">十三、关于指针</span></strong><br>1、 指针创建时必须被初始化<br>2、 指针在free 或delete后必须置为NULL<br>3、 指针的长度都为4字节<br>4、释放内存时，如果是数组指针，必须要释放掉所有的内存，如<div class="code">char *p=new char[100];<br>strcpy(p,&#8221;Hello World&#8221;);<br>delete []p; //注意前面的［］号<br>p=NULL;</div>5、数组指针的内容不能超过数组指针的最大容易。<br>如:<div class="code">char *p=new char[5];<br>strcpy(p,&#8221;Hello World&#8221;); //报错 目标容易不够大<br>delete []p; //注意前面的［］号<br>p=NULL;</div><br><strong><span style="color: red; ">十四、关于malloc/free 和new /delete</span></strong><br>malloc/free 是C/C+的内存分配符，new /delete是C++的内存分配符。<br>注意：malloc/free是库函数，new/delete是运算符<br>malloc/free不能执行构造函数与析构函数，而new/delete可以<br>new/delete不能在C上运行，所以malloc/free不能被淘汰<br>两者都必须要成对使用<br>C++中可以使用_set_new_hander函数来定义内存分配异常的处理<br><br><strong><span style="color: red; ">十五、Ｃ++的特性</span></strong><br>Ｃ++新增加有重载(overload)，内联（inline），Const，Virtual四种机制<br>重载和内联：即可用于全局函数，也可用于类的成员函数；<br>Const和Virtual：只可用于类的成员函数；<br>重载：在同一类中，函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数，必须用全局引用符号::引用。<br>覆盖是指派生类函数覆盖基类函数：函数名相同；参数相同；基类函数必须有Virtual关键字；不同的范围(派生类和基类)。<br>隐藏是指派生类屏蔽了基类的同名函数相同<br>1、 函数名相同，但参数不同，此时不论基类有无Virtual关键字，基类函数将被隐藏。<br>2、 函数名相同，参数也相同，但基类无Virtual关键字(有就是覆盖)，基类函数将被隐藏。<br>内联：inline关键字必须与定义体放在一起，而不是单单放在声明中。<br>Const：const是constant的缩写，&#8220;恒定不变&#8221;的意思。被const修饰的东西都受到强制保护，可以预防意外的变动，能提高程序的健壮性。<br>1、 参数做输入用的指针型参数，加上const可防止被意外改动。<br>2、 按值引用的用户类型做输入参数时，最好将按值传递的改为引用传递，并加上const关键字，目的是为了提高效率。数据类型为内部类型的就没必要做这件事情；如：<br>将void Func(A a) 改为void Func(const A &amp;a)。<br>而void func(int a)就没必要改成void func(const int &amp;a);<br>3、 给返回值为指针类型的函数加上const，会使函数返回值不能被修改，赋给的变量也只能是const型变量。如：函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。<br>4、 Const成员函数是指此函数体内只能调用Const成员变量，提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。<br>Virtual：虚函数：派生类可以覆盖掉的函数，纯虚函数：只是个空函数，没有函数实现体；<br><br><strong><span style="color: red; ">十六、extern&#8220;C&#8221;有什么作用？</span></strong><br>Extern &#8220;C&#8221;是由Ｃ＋＋提供的一个连接交换指定符号，用于告诉Ｃ＋＋这段代码是Ｃ函数。这是因为C++编译后库中函数名会变得很长，与C生成的不一致，造成Ｃ＋＋不能直接调用C函数，加上extren &#8220;c&#8221;后，C++就能直接调用C函数了。<br>Extern &#8220;C&#8221;主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern &#8220;c&#8221; 关键字即可。<br><br><strong><span style="color: red; ">十七、构造函数与析构函数</span></strong><br>派生类的构造函数应在初始化表里调用基类的构造函数；<br>派生类和基类的析构函数应加Virtual关键字。<br>不要小看构造函数和析构函数，其实编起来还是不容易。<div class="code">#include &lt;iostream.h&gt;<br>class Base<br>{<br>public:&nbsp;<br>virtual ~Base() { cout&lt;&lt; "~Base" &lt;&lt; endl ; }<br>};<br><br>class Derived : public Base<br>{<br>public:&nbsp;<br>virtual ~Derived() { cout&lt;&lt; "~Derived" &lt;&lt; endl ; }<br>};<br><br>void main(void)<br>{<br>Base * pB = new Derived; // upcast<br>delete pB;<br>}</div>输出结果为：<br>~Derived<br>~Base<br><br>如果析构函数不为虚，那么输出结果为<br>~Base<br><br><strong><span style="color: red; ">十八、#IFNDEF/#DEFINE/#ENDIF有什么作用</span></strong><br>仿止该头文件被重复引用&nbsp;</span></strong></span></font><img src ="http://www.cppblog.com/cc/aggbug/116212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2010-05-24 13:09 <a href="http://www.cppblog.com/cc/archive/2010/05/24/116212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Solaris环境下编译头文件的注意事项</title><link>http://www.cppblog.com/cc/archive/2009/07/29/91597.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Wed, 29 Jul 2009 07:45:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2009/07/29/91597.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/91597.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2009/07/29/91597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/91597.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/91597.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 18pt">&nbsp;&nbsp;&nbsp;最近在Solaris上编译程序的时候，发现它的编译器有个奇怪的习惯，就是头文件的最后一行要加上一行回车行，不知道是什么回事，否则就会产生警告，在Solaris上装的就是sun公司自己的sunstudio开发工具，在HPUX跟AIX上都没有这个问题，应该是编译器的事情吧。<br>下面截个图给大家看看，<br></span><br>
<div align=center src_cetemp="/images/cppblog_com/cc/2009_7/error.jpg"><img height=111 alt="" src="http://www.cppblog.com/images/cppblog_com/cc/2009_7/error.jpg" width=906 border=0></div><img src ="http://www.cppblog.com/cc/aggbug/91597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2009-07-29 15:45 <a href="http://www.cppblog.com/cc/archive/2009/07/29/91597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单介绍UNIX下编写定时器程序</title><link>http://www.cppblog.com/cc/archive/2009/06/02/86548.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Tue, 02 Jun 2009 07:46:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2009/06/02/86548.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/86548.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2009/06/02/86548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/86548.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/86548.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚好写程序的时候要使用定时器，就是定时的做一些操作，网上查了一下，自己也学着写了写，网上倒是说的好多种，我在这里就不做过多介绍了，就说我用的这个，使用<span lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font face=宋体><strong style="COLOR: #0000ff">setitimer</strong>函数。<br><br><strong>函数原型</strong><br></font><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);<br></span><br><font face=宋体><strong>参数说明</strong><br><br>&nbsp;&nbsp;<em style="COLOR: red">&nbsp;参数which</em><br><em>&nbsp; 参数 which是定时器类型</em><br></font>
<table class=MsoNormalTable style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; WIDTH: 100%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black 1.5pt; mso-yfti-tbllook: 32; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.5pt solid black; mso-border-insidev: 1.5pt solid black" cellSpacing=0 cellPadding=0 width="100%" border=1>
    <tbody>
        <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
            <td style="BORDER-RIGHT: #ece9d8 1pt inset; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8 1pt inset; WIDTH: 26.4%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: inset #ECE9D8 .75pt; mso-border-bottom-alt: solid black .25pt; mso-border-right-alt: inset #ECE9D8 .75pt" vAlign=top width="26%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><strong style="mso-bidi-font-weight: normal"><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">取值</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><o:p></o:p></span></strong></p>
            </td>
            <td style="BORDER-RIGHT: #ece9d8 1pt inset; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 49.86%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: inset #ECE9D8 .75pt; mso-border-bottom-alt: solid black .25pt; mso-border-right-alt: inset #ECE9D8 .75pt" vAlign=top width="49%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><strong style="mso-bidi-font-weight: normal"><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">含义</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><o:p></o:p></span></strong></p>
            </td>
            <td style="BORDER-RIGHT: #ece9d8 1pt inset; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 23.74%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: inset #ECE9D8 .75pt; mso-border-bottom-alt: solid black .25pt; mso-border-right-alt: inset #ECE9D8 .75pt" vAlign=top width="23%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><strong style="mso-bidi-font-weight: normal"><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">信号发送</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><o:p></o:p></span></strong></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 1">
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1.5pt solid; WIDTH: 26.4%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt" vAlign=top width="26%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><font face=宋体>ITIMER_REAL<o:p></o:p></font></span></p>
            </td>
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 49.86%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black 1.5pt" vAlign=top width="49%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">定时真实时间，与</span><font face=宋体><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm">alarm</span><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">类型相同。</span><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><o:p></o:p></span></font></p>
            </td>
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 23.74%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black 1.5pt" vAlign=top width="23%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><font face=宋体>SIGALRM<o:p></o:p></font></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 2">
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1.5pt solid; WIDTH: 26.4%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt" vAlign=top width="26%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><font face=宋体>ITIMER_VIRT<o:p></o:p></font></span></p>
            </td>
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 49.86%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black 1.5pt" vAlign=top width="49%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">定时进程在用户态下的实际执行时间。</span><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 23.74%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black 1.5pt" vAlign=top width="23%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><font face=宋体>SIGVTALRM<o:p></o:p></font></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 3; mso-yfti-lastrow: yes">
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1.5pt solid; WIDTH: 26.4%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt" vAlign=top width="26%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><font face=宋体>ITIMER_PROF<o:p></o:p></font></span></p>
            </td>
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 49.86%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black 1.5pt" vAlign=top width="49%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">定时进程在用户态和核心态下</span><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><br></span><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">的实际执行时间。</span><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 23.74%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black 1.5pt" vAlign=top width="23%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><font face=宋体>SIGPROF<o:p></o:p></font></span></p>
            </td>
        </tr>
    </tbody>
</table>
<br><font face=宋体>&nbsp;</font>
<p align=left><span style="FONT-SIZE: 12pt"><font face=宋体>&nbsp;&nbsp; </font>这三种定时器定时完成时给进程发送的信号各不相同，其中ITIMER_REAL类定时器发送SIGALRM信号，ITIMER_VIRT类定时器发送SIGVTALRM信号，<span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm">ITIMER_PROF</span>类定时器发送SIGPROF信号。</span></p>
<font face="宋体, MS Song">&nbsp;&nbsp;<span style="FONT-SIZE: 14pt"><em style="COLOR: red">&nbsp;参数 value</em><br>&nbsp;&nbsp;&nbsp;结构itimerval描述了定时器的组成。<br></span>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;itimerval&nbsp;<br></span><span style="COLOR: #008080">2</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">3</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;timeval&nbsp;&nbsp;it_interval;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;下次定时取值&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">4</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;timeval&nbsp;&nbsp;it_value;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;本次定时设置值&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">5</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">6</span>&nbsp;<span style="COLOR: #000000"></span></div>
</font></span><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; <span style="FONT-SIZE: 12pt">结构timeval描述的是精确到微秒的结构。<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"><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;timeval&nbsp;<br></span><span style="COLOR: #008080">2</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">3</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;tv_sec;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;秒（1000000微秒）&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">4</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;tv_usec;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;微妙&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">5</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">6</span>&nbsp;<span style="COLOR: #000000"></span></div>
</span></span><font style="FONT-SIZE: 12pt" face=宋体 size=5><br>&nbsp;&nbsp; itimerval结构中的it_value是代表首次定时的时间，而it_interval代表下一次定时的时间，执行完第一次之后，it_interval中的时间会赋值给it_value，周而复始。如果it_value值被设置为0，则定时器停止定时；如果it_value值不为0但it_interval值为0，则定时器在一次定时后终止。<br>&nbsp;&nbsp;&nbsp;setitimer执行成功返回0，否则返回-1<br><br><em>参数ovalue<br></em>&nbsp; 该参数可以使用空值NULL，如果不为空的话，返回的是上一个时刻的定时器状态。<br><br>下面写的一个简单的例子程序。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdlib.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">unistd.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">signal.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">time.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">sys</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">time.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;doAction(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sig)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">你要做的事情</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">让一切痛苦随风而去&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,n</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;signal(SIGALRM,doAction);<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setMyTimer(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;val)<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;itimerval&nbsp;value;<br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;value.it_value.tv_sec</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">val;<br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;value.it_value.tv_usec</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;value.it_interval.tv_sec</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">val;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">val秒</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;value.it_interval.tv_usec</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">21</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;signal(SIGALRM,&nbsp;doAction);<br></span><span style="COLOR: #008080">22</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;setitimer(ITIMER_REAL,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">value,NULL);<br></span><span style="COLOR: #008080">23</span>&nbsp;<span style="COLOR: #000000">&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">);<br></span><span style="COLOR: #008080">24</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">25</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">26</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">argv&nbsp;)<br></span><span style="COLOR: #008080">27</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">28</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(argc</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">29</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">30</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">请您输入参数:\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">第二个参数是定时器的时长的，单位是秒</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">31</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&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">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">32</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">33</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;val</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">atoi(argv[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]);<br></span><span style="COLOR: #008080">34</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,val);<br></span><span style="COLOR: #008080">35</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setMyTimer(val);<br></span><span style="COLOR: #008080">36</span>&nbsp;<span style="COLOR: #000000">&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></span><span style="COLOR: #008080">37</span>&nbsp;<span style="COLOR: #000000">}</span></div>
</font><br>代码就不解释了，就是启动的时候获得第二个参数，用作定时器的时间，然后打印出&#8220;让一切痛苦随风去 0&#8221;，如此循环。<br>在AIX5.2下，使用XLC++V7.0编译通过。<br><br>运行效果如下<br><img height=225 alt="" src="http://www.cppblog.com/images/cppblog_com/cc/2009_6/tk.jpg" width=234 border=0><br><img src ="http://www.cppblog.com/cc/aggbug/86548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2009-06-02 15:46 <a href="http://www.cppblog.com/cc/archive/2009/06/02/86548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C实现转动的短棒</title><link>http://www.cppblog.com/cc/archive/2008/08/29/60340.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Fri, 29 Aug 2008 03:18:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2008/08/29/60340.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/60340.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2008/08/29/60340.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/60340.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/60340.html</trackback:ping><description><![CDATA[<p><font style="FONT-SIZE: 14pt; BACKGROUND-COLOR: #c7edcc">&nbsp;&nbsp;&nbsp;在UNIX环境下的文字界面工作时，如过程序在运行等待，可能就会看到转动的短棒，表示程序正在执行中，今天刚好看到资料，上面说了一下，我就按照意思写了一个，不知道别的是怎么实现的，反正下面的代码看似能工作了，不过正式使用可能还需要改进吧。<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include</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.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_30_309_Open_Image onclick="this.style.display='none'; Codehighlighter1_30_309_Open_Text.style.display='none'; Codehighlighter1_30_309_Closed_Image.style.display='inline'; Codehighlighter1_30_309_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_30_309_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_30_309_Closed_Text.style.display='none'; Codehighlighter1_30_309_Open_Image.style.display='inline'; Codehighlighter1_30_309_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_30_309_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.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_30_309_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;c;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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">)<br><img id=Codehighlighter1_74_276_Open_Image onclick="this.style.display='none'; Codehighlighter1_74_276_Open_Text.style.display='none'; Codehighlighter1_74_276_Closed_Image.style.display='inline'; Codehighlighter1_74_276_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_74_276_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_74_276_Closed_Text.style.display='none'; Codehighlighter1_74_276_Open_Image.style.display='inline'; Codehighlighter1_74_276_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_74_276_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.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_74_276_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\\</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%c\b</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,c);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="COLOR: #000000">300</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;system(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pause</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</font><br><br>以上代码在DEV-CPP 4.9.9.2中测试通过<br><img src ="http://www.cppblog.com/cc/aggbug/60340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2008-08-29 11:18 <a href="http://www.cppblog.com/cc/archive/2008/08/29/60340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言获取目录中文件名</title><link>http://www.cppblog.com/cc/archive/2008/08/28/60292.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Thu, 28 Aug 2008 10:10:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2008/08/28/60292.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/60292.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2008/08/28/60292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/60292.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/60292.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.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;&nbsp;&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">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">dirent.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;typedef&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;FileList&nbsp;<br><img id=Codehighlighter1_103_176_Open_Image onclick="this.style.display='none'; Codehighlighter1_103_176_Open_Text.style.display='none'; Codehighlighter1_103_176_Closed_Image.style.display='inline'; Codehighlighter1_103_176_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_103_176_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_103_176_Closed_Text.style.display='none'; Codehighlighter1_103_176_Open_Image.style.display='inline'; Codehighlighter1_103_176_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_103_176_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.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_103_176_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;filename[</span><span style="COLOR: #000000">64</span><span style="COLOR: #000000">];&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;FileList&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">next;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">FILENODE;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_218_224_Open_Image onclick="this.style.display='none'; Codehighlighter1_218_224_Open_Text.style.display='none'; Codehighlighter1_218_224_Closed_Image.style.display='inline'; Codehighlighter1_218_224_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_218_224_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_218_224_Closed_Text.style.display='none'; Codehighlighter1_218_224_Open_Image.style.display='inline'; Codehighlighter1_218_224_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>FILENODE</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;getFiles(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dir</span><span id=Codehighlighter1_218_224_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">/**/</span><span id=Codehighlighter1_218_224_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">文目录</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_227_838_Open_Image onclick="this.style.display='none'; Codehighlighter1_227_838_Open_Text.style.display='none'; Codehighlighter1_227_838_Closed_Image.style.display='inline'; Codehighlighter1_227_838_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_227_838_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_227_838_Closed_Text.style.display='none'; Codehighlighter1_227_838_Open_Image.style.display='inline'; Codehighlighter1_227_838_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_227_838_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.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_227_838_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;DIR&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">directory_pointer;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;dirent&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">entry;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;directory_pointer</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">opendir(dir);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;FileList&nbsp;start;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;FileList&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">filesNode;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;start.next</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filesNode</span><span style="COLOR: #000000">=&amp;</span><span style="COLOR: #000000">start;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;((entry</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">readdir(directory_pointer))</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL)&nbsp;<br><img id=Codehighlighter1_498_732_Open_Image onclick="this.style.display='none'; Codehighlighter1_498_732_Open_Text.style.display='none'; Codehighlighter1_498_732_Closed_Image.style.display='inline'; Codehighlighter1_498_732_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_498_732_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_498_732_Closed_Text.style.display='none'; Codehighlighter1_498_732_Open_Image.style.display='inline'; Codehighlighter1_498_732_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_498_732_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.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_498_732_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filesNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">&nbsp;next</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;FileList&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)malloc(</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;FileList));&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filesNode</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">filesNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">&nbsp;next;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(filesNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">&nbsp;filename,entry</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">&nbsp;d_name);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filesNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">&nbsp;next</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closedir(directory_pointer);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filesNode</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">start.next;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;filesNode;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;main()&nbsp;<br><img id=Codehighlighter1_855_1186_Open_Image onclick="this.style.display='none'; Codehighlighter1_855_1186_Open_Text.style.display='none'; Codehighlighter1_855_1186_Closed_Image.style.display='inline'; Codehighlighter1_855_1186_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_855_1186_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_855_1186_Closed_Text.style.display='none'; Codehighlighter1_855_1186_Open_Image.style.display='inline'; Codehighlighter1_855_1186_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_855_1186_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.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_855_1186_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;FileList&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">filesNode;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;dir[</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">D:\\down</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;filesNode</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">getFiles(dir);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(filesNode</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL)<br><img id=Codehighlighter1_991_1031_Open_Image onclick="this.style.display='none'; Codehighlighter1_991_1031_Open_Text.style.display='none'; Codehighlighter1_991_1031_Closed_Image.style.display='inline'; Codehighlighter1_991_1031_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_991_1031_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_991_1031_Closed_Text.style.display='none'; Codehighlighter1_991_1031_Open_Image.style.display='inline'; Codehighlighter1_991_1031_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_991_1031_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.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_991_1031_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">没有成功</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(filesNode)&nbsp;<br><img id=Codehighlighter1_1059_1144_Open_Image onclick="this.style.display='none'; Codehighlighter1_1059_1144_Open_Text.style.display='none'; Codehighlighter1_1059_1144_Closed_Image.style.display='inline'; Codehighlighter1_1059_1144_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1059_1144_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1059_1144_Closed_Text.style.display='none'; Codehighlighter1_1059_1144_Open_Image.style.display='inline'; Codehighlighter1_1059_1144_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1059_1144_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.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1059_1144_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s\n&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,filesNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">&nbsp;filename);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;filesNode</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">filesNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">&nbsp;next;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pause</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div><img src ="http://www.cppblog.com/cc/aggbug/60292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2008-08-28 18:10 <a href="http://www.cppblog.com/cc/archive/2008/08/28/60292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AIX环境下获取当前程序所在路径</title><link>http://www.cppblog.com/cc/archive/2008/04/03/46192.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Thu, 03 Apr 2008 10:04:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2008/04/03/46192.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/46192.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2008/04/03/46192.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/46192.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/46192.html</trackback:ping><description><![CDATA[<br><br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">unistd.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.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></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img id=Codehighlighter1_49_206_Open_Image onclick="this.style.display='none'; Codehighlighter1_49_206_Open_Text.style.display='none'; Codehighlighter1_49_206_Closed_Image.style.display='inline'; Codehighlighter1_49_206_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_49_206_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_49_206_Closed_Text.style.display='none'; Codehighlighter1_49_206_Open_Image.style.display='inline'; Codehighlighter1_49_206_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()</span><span id=Codehighlighter1_49_206_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.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_49_206_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;buffer[</span><span style="COLOR: #000000">260</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;getcwd(&nbsp;buffer,&nbsp;sizeof(buffer)&nbsp;)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;NULL&nbsp;)<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">getcwd&nbsp;error</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;buffer&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
&nbsp;参考了msdn _getcwd 函数<img src ="http://www.cppblog.com/cc/aggbug/46192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2008-04-03 18:04 <a href="http://www.cppblog.com/cc/archive/2008/04/03/46192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>extern "C"转帖</title><link>http://www.cppblog.com/cc/archive/2007/09/19/32476.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Wed, 19 Sep 2007 06:18:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2007/09/19/32476.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/32476.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2007/09/19/32476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/32476.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/32476.html</trackback:ping><description><![CDATA[<p>时常在cpp的代码之中看到这样的代码:&nbsp; </p>
<p>#ifdef __cplusplu* <br>**tern "C" { <br>#endif </p>
<p>//一段代码 </p>
<p>#ifdef __cplusplus <br>} <br>#endif&nbsp; </p>
<p>　　这样的代码到底是什么意思呢？首先，__cplusplus是cpp中的自定义宏，那么定义了这个宏的话表示这是一段cpp的代码，也就是说，上面的代码的含义是:如果这是一段cpp的代码，那么加入extern "C"{和}处理其中的代码。 </p>
<p>　　要明白为何使用extern "C"，还得从cpp中对函数的重载处理开始说起。在c++中，为了支持重载机制，在编译生成的汇编码中，要对函数的名字进行一些处理，加入比如函数的返回类型等等.而在C中，只是简单的函数名字而已，不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的. </p>
<p>　　比如下面的一段简单的函数，我们看看加入和不加入extern "C"产生的汇编代码都有哪些变化: </p>
<p>int f(void) <br>{ <br>return 1; <br>}&nbsp; </p>
<p>　　在加入extern "C"的时候产生的汇编代码是: </p>
<p>.file "test.cxx" <br>.text <br>.align 2 <br>.globl _f <br>.def _f; .scl 2; .type 32; .endef <br>_f: <br>pushl %ebp <br>movl %esp， %ebp <br>movl $1， %eax <br>popl %ebp <br>ret&nbsp; </p>
<p>　　但是不加入了extern "C"之后 </p>
<p>.file "test.cxx" <br>.text <br>.align 2 <br>.globl __Z1fv <br>.def __Z1fv; .scl 2; .type 32; .endef <br>__Z1fv: <br>pushl %ebp <br>movl %esp， %ebp <br>movl $1， %eax <br>popl %ebp <br>ret&nbsp; </p>
<p>　　两段汇编代码同样都是使用gcc -S命令产生的，所有的地方都是一样的，唯独是产生的函数名，一个是_f，一个是__Z1fv。 </p>
<p>　　明白了加入与不加入extern "C"之后对函数名称产生的影响，我们继续我们的讨论:为什么需要使用extern "C"呢？C++之父在设计C++之时，考虑到当时已经存在了大量的C代码，为了支持原来的C代码和已经写好C库，需要在C++中尽可能的支持C，而extern "C"就是其中的一个策略。&nbsp; <br>试想这样的情况:一个库文件已经用C写好了而且运行得很良好，这个时候我们需要使用这个库文件，但是我们需要使用C++来写这个新的代码。如果这个代码使用的是C++的方式链接这个C库文件的话，那么就会出现链接错误.我们来看一段代码:首先，我们使用C的处理方式来写一个函数，也就是说假设这个函数当时是用C写成的: </p>
<p>//f1.c <br>extern "C" <br>{ <br>void f1() <br>{ <br>return; <br>} <br>}&nbsp; </p>
<p>　　编译命令是:gcc -c f1.c -o f1.o 产生了一个叫f1.o的库文件。再写一段代码调用这个f1函数: </p>
<p>// test.cxx <br>//这个extern表示f1函数在别的地方定义，这样可以通过 <br>//编译，但是链接的时候还是需要 <br>//链接上原来的库文件. <br>extern void f1(); </p>
<p>int main() <br>{ <br>f1(); </p>
<p>return 0; <br>}&nbsp; </p>
<p>　　通过gcc -c test.cxx -o test.o 产生一个叫test.o的文件。然后，我们使用gcc test.o f1.o来链接两个文件，可是出错了，错误的提示是: </p>
<p>test.o(.text + 0x1f):test.cxx: undefine reference to 'f1()'&nbsp; </p>
<p>　　也就是说，在编译test.cxx的时候编译器是使用C++的方式来处理f1()函数的，但是实际上链接的库文件却是用C的方式来处理函数的，所以就会出现链接过不去的错误:因为链接器找不到函数。 </p>
<p>　　因此，为了在C++代码中调用用C写成的库文件，就需要用extern "C"来告诉编译器:这是一个用C写成的库文件，请用C的方式来链接它们。 </p>
<p>　　比如，现在我们有了一个C库文件，它的头文件是f.h，产生的lib文件是f.lib，那么我们如果要在C++中使用这个库文件，我们需要这样写: <br>extern "C" <br>{ <br>＃i nclude "f.h" <br>}&nbsp; </p>
<p>　　回到上面的问题，如果要改正链接错误，我们需要这样子改写test.cxx: </p>
<p>extern "C" <br>{ <br>extern void f1(); <br>} </p>
<p>int main() <br>{ <br>f1(); </p>
<p>return 0; <br>}&nbsp; </p>
<p>　　重新编译并且链接就可以过去了. </p>
<p>　　总结 </p>
<p>　　C和C++对函数的处理方式是不同的.extern "C"是使C++能够调用C写作的库文件的一个手段，如果要对编译器提示使用C的方式来处理函数的话，那么就要使用extern "C"来说明。 <br>&nbsp;</p>
<p>&nbsp;<br>&nbsp;<br>&nbsp;<br>作者：宋宝华&nbsp; e-mail:21cnbao@21cn.com　出处：太平洋电脑网</p>
<p>1.引言</p>
<p>C++语言的创建初衷是&#8220;a better C&#8221;，但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言，C++保留了一部分过程式语言的特点（被世人称为&#8220;不彻底地面向对象&#8221;），因而它可以定义不属于任何类的全局变量和函数。但是，C++毕竟是一种面向对象的程序设计语言，为了支持函数的重载，C++对全局函数的处理方式与C有明显的不同。</p>
<p>2.从标准头文件说起</p>
<p>某企业曾经给出如下的一道面试题：</p>
<p>面试题</p>
<p>为什么标准头文件都有类似以下的结构？</p>
<p>&nbsp;&nbsp; #ifndef __INCvxWorksh</p>
<p>&nbsp;&nbsp; #define __INCvxWorksh</p>
<p>&nbsp;&nbsp; #ifdef __cplusplus</p>
<p>&nbsp;&nbsp; extern "C" {</p>
<p>&nbsp;&nbsp; #endif</p>
<p>&nbsp;&nbsp; /*...*/</p>
<p>&nbsp;&nbsp; #ifdef __cplusplus</p>
<p>&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; #endif</p>
<p>&nbsp;&nbsp; #endif /* __INCvxWorksh */</p>
<p>分析</p>
<p>显然，头文件中的编译宏&#8220;#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif&#8221; 的作用是防止该头文件被重复引用。</p>
<p>那么</p>
<p>&nbsp;&nbsp; #ifdef __cplusplus</p>
<p>&nbsp;&nbsp; extern "C" {</p>
<p>&nbsp;&nbsp; #endif</p>
<p>&nbsp; #ifdef __cplusplus</p>
<p>&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; #endif</p>
<p>的作用又是什么呢？我们将在下文一一道来。</p>
<p>3.深层揭密extern "C"</p>
<p>extern "C" 包含双重含义，从字面上即可得到：首先，被它修饰的目标是&#8220;extern&#8221;的；其次，被它修饰的目标是&#8220;C&#8221;的。让我们来详细解读这两重含义。</p>
<p>（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被extern "C"限定的函数或变量是extern类型的；</p>
<p>extern是C/C++语言中表明函数和全局变量作用范围（可见性）的关键字，该关键字告诉编译器，其声明的函数和变量可以在本模块或其它模块中使用。记住，下列语句：</p>
<p>extern int a;</p>
<p>仅仅是一个变量的声明，其并不是在定义变量a，并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次，否则会出现连接错误。</p>
<p>通常，在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如，如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样，模块B中调用模块A中的函数时，在编译阶段，模块B虽然找不到该函数，但是并不会报错；它会在连接阶段中从模块A编译生成的目标代码中找到此函数。</p>
<p>与extern对应的关键字是static，被它修饰的全局变量和函数只能在本模块中使用。因此，一个函数或变量只可能被本模块使用时，其不可能被extern &#8220;C&#8221;修饰。</p>
<p>（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被extern "C"修饰的变量和函数是按照C语言方式编译和连接的；</p>
<p>未加extern &#8220;C&#8221;声明时的编译方式</p>
<p>首先看看C++中对类似C的函数是怎样编译的。</p>
<p>作为一种面向对象的语言，C++支持函数重载，而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如，假设某个函数的原型为：</p>
<p>void foo( int x, int y );</p>
<p>该函数被C编译器编译后在符号库中的名字为_foo，而C++编译器则会产生像_foo_int_int之类的名字（不同的编译器可能生成的名字不同，但是都采用了相同的机制，生成的新名字称为&#8220;mangled name&#8221;）。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息，C++就是靠这种机制来实现函数重载的。例如，在C++中，函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的，后者为_foo_int_float。</p>
<p>同样地，C++中的变量除支持局部变量外，还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名，我们以"."来区分。而本质上，编译器在进行编译时，与函数的处理相似，也为类中的变量取了一个独一无二的名字，这个名字与用户程序中同名的全局变量名字不同。</p>
<p>未加extern "C"声明时的连接方式</p>
<p>假设在C++中，模块A的头文件如下：</p>
<p>// 模块A头文件　moduleA.h</p>
<p>#ifndef MODULE_A_H</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define MODULE_A_H</p>
<p>&nbsp;&nbsp;&nbsp; int foo( int x, int y );</p>
<p>#endif</p>
<p>在模块B中引用该函数：</p>
<p>// 模块B实现文件　moduleB.cpp</p>
<p>＃i nclude "moduleA.h"</p>
<p>foo(2,3);</p>
<p>实际上，在连接阶段，连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号！</p>
<p>加extern "C"声明后的编译和连接方式</p>
<p>加extern "C"声明后，模块A的头文件变为：</p>
<p>// 模块A头文件　moduleA.h</p>
<p>#ifndef MODULE_A_H</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define MODULE_A_H</p>
<p>&nbsp;&nbsp;&nbsp; extern "C" int foo( int x, int y );</p>
<p>#endif</p>
<p>在模块B的实现文件中仍然调用foo( 2,3 )，其结果是：</p>
<p>（1）模块A编译生成foo的目标代码时，没有对其名字进行特殊处理，采用了C语言的方式；</p>
<p>（2）连接器在为模块B的目标代码寻找foo(2,3)调用时，寻找的是未经修改的符号名_foo。</p>
<p>如果在模块A中函数声明了foo为extern "C"类型，而模块B中包含的是extern int foo( int x, int y ) ，则模块B找不到模块A中的函数；反之亦然。</p>
<p>所以，可以用一句话概括extern &#8220;C&#8221;这个声明的真实目的（任何语言中的任何语法特性的诞生都不是随意而为的，来源于真实世界的需求驱动。我们在思考问题时，不能只停留在这个语言是怎么做的，还要问一问它为什么要这么做，动机是什么，这样我们可以更深入地理解许多问题）：</p>
<p>实现C++与C及其它语言的混合编程。</p>
<p>明白了C++中extern "C"的设立动机，我们下面来具体分析extern "C"通常的使用技巧。</p>
<p>4.extern "C"的惯用法</p>
<p>（1）在C++中引用C语言中的函数和变量，在包含C语言头文件（假设为cExample.h）时，需进行下列处理：</p>
<p>extern "C"</p>
<p>{</p>
<p>＃i nclude "cExample.h"</p>
<p>}</p>
<p>而在C语言的头文件中，对其外部函数只能指定为extern类型，C语言中不支持extern "C"声明，在.c文件中包含了extern "C"时会出现编译语法错误。</p>
<p>笔者编写的C++引用C函数例子工程中包含的三个文件的源代码如下：</p>
<p>/* c语言头文件：cExample.h */</p>
<p>#ifndef C_EXAMPLE_H</p>
<p>#define C_EXAMPLE_H</p>
<p>extern int add(int x,int y);</p>
<p>#endif</p>
<p>/* c语言实现文件：cExample.c */</p>
<p>＃i nclude "cExample.h"</p>
<p>int add( int x, int y )</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x + y;</p>
<p>}</p>
<p>// c++实现文件，调用add：cppFile.cpp</p>
<p>extern "C"</p>
<p>{</p>
<p>＃i nclude "cExample.h"</p>
<p>}</p>
<p>int main(int argc, char* argv[])</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add(2,3);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</p>
<p>}</p>
<p>如果C++调用一个C语言编写的.DLL时，当包括.DLL的头文件或声明接口函数时，应加extern "C" {　}。</p>
<p>（2）在C中引用C++语言中的函数和变量时，C++的头文件需添加extern "C"，但是在C语言中不能直接引用声明了extern "C"的该头文件，应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。</p>
<p>笔者编写的C引用C++函数例子工程中包含的三个文件的源代码如下：</p>
<p>//C++头文件 cppExample.h</p>
<p>#ifndef CPP_EXAMPLE_H</p>
<p>#define CPP_EXAMPLE_H</p>
<p>extern "C" int add( int x, int y );</p>
<p>#endif</p>
<p>//C++实现文件 cppExample.cpp</p>
<p>＃i nclude "cppExample.h"</p>
<p>int add( int x, int y )</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x + y;</p>
<p>}</p>
<p>/* C实现文件 cFile.c</p>
<p>/* 这样会编译出错：＃i nclude "cExample.h" */</p>
<p>extern int add( int x, int y );</p>
<p>int main( int argc, char* argv[] )</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add( 2, 3 );&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</p>
<p>}</p><img src ="http://www.cppblog.com/cc/aggbug/32476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2007-09-19 14:18 <a href="http://www.cppblog.com/cc/archive/2007/09/19/32476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>说明以下关键字的作用 auto static register const volatile extern </title><link>http://www.cppblog.com/cc/archive/2007/09/11/32033.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Tue, 11 Sep 2007 15:33:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2007/09/11/32033.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/32033.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2007/09/11/32033.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/32033.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/32033.html</trackback:ping><description><![CDATA[<h3><font size=2>(1)auto </font></h3>
<p><font size=2>　　这个这个关键字用于声明<span class=hilite3>变量</span>的生存期为自动，即将不在任何类、结构、枚举、联合和函数中定义的<span class=hilite3>变量</span>视为全局<span class=hilite3>变量</span>，而在函数中定义的<span class=hilite3>变量</span>视为局部<span class=hilite3>变量</span>。这个关键字不怎么多写，因为所有的<span class=hilite3>变量</span>默认就是auto的。 </font></p>
<p><a name=register><font size=2></font></a></p>
<h3><font size=2>(2)register </font></h3>
<p><font size=2>　　这个关键字命令编译器<font color=red>尽可能</font>的将<span class=hilite3>变量</span>存在<span class=hilite1>C</span>PU内部寄存器中而不是通过内存寻址访问以提高效率。 </font><a name=static></a></p>
<h3><font size=2>(3)stati<span class=hilite1>c</span> </font></h3>
<p><font size=2>　　常见的两种用途: <br>　　　　1&gt;统计函数被调用的次数; <br>　　　　2&gt;减少局部数组建立和赋值的开销.<span class=hilite3>变量</span>的建立和赋值是需要一定的处理器开销的，特别是数组等含有较多元素的存储类型。在一些含有较多的<span class=hilite3>变量</span>并且被经常调用的函数中，可以将一些数组声明为stati<span class=hilite1>c</span>类型，以减少建立或者初始化这些<span class=hilite3>变量</span>的开销. </font></p>
<p><font size=2>　　详细说明: <br>　　　　1&gt;、<span class=hilite3>变量</span>会被放在程序的全局存储区中，这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈<span class=hilite3>变量</span>和堆<span class=hilite3>变量</span>的区别。 <br>　　　　2&gt;、<span class=hilite3>变量</span>用stati<span class=hilite1>c</span>告知编译器，自己仅仅在<span class=hilite3>变量</span>的作用范围内可见。这一点是它与全局<span class=hilite3>变量</span>的区别。 <br>　　　　<font color=red>3&gt;当stati<span class=hilite1>c</span>用来修饰全局<span class=hilite3>变量</span>时，它就改变了全局<span class=hilite3>变量</span>的作用域，使其不能被别的程序<span class=hilite2>extern</span>，限制在了当前文件里，但是没有改变其存放位置，还是在全局静态储存区。</font> </font>
<p><font size=2>　　使用注意: <br>　　　　1&gt;若全局<span class=hilite3>变量</span>仅在单个<span class=hilite1>C</span>文件中访问，则可以将这个<span class=hilite3>变量</span>修改为静态全局<span class=hilite3>变量</span>，以降低模块间的耦合度； <br>　　　　2&gt;若全局<span class=hilite3>变量</span>仅由单个函数访问，则可以将这个<span class=hilite3>变量</span>改为该函数的静态局部<span class=hilite3>变量</span>，以降低模块间的耦合度； <br>　　　　3&gt;设计和使用访问动态全局<span class=hilite3>变量</span>、静态全局<span class=hilite3>变量</span>、静态局部<span class=hilite3>变量</span>的函数时，需要考虑重入问题(只要输入数据相同就应产生相同的输出)。 </font><a name=const></a></p>
<h3><font size=2>(4)<span class=hilite1>c</span>onst </font></h3>
<p><font size=2>　　被<span class=hilite1>c</span>onst修饰的东西都受到强制保护，可以预防意外的变动，能提高程序的健壮性。它可以修饰函数的参数、返回值，甚至函数的定义体。 </font></p>
<p><font size=2>　　作用: <br>　　　　1&gt;修饰输入参数 <br>　　　　　　a.对于非内部数据类型的输入参数，应该将&#8220;值传递&#8221;的方式改为&#8220;<span class=hilite1>c</span>onst引用传递&#8221;，目的是提高效率。例如将void Fun<span class=hilite1>c</span>(A a) 改为void Fun<span class=hilite1>c</span>(<span class=hilite1>c</span>onst A &amp;a)。 <br>　　　　　　b.对于内部数据类型的输入参数，不要将&#8220;值传递&#8221;的方式改为&#8220;<span class=hilite1>c</span>onst引用传递&#8221;。否则既达不到提高效率的目的，又降低了函数的可理解性。例如void Fun<span class=hilite1>c</span>(int x) 不应该改为void Fun<span class=hilite1>c</span>(<span class=hilite1>c</span>onst int &amp;x)。 <br>　　　　2&gt;用<span class=hilite1>c</span>onst修饰函数的返回值 <br>　　　　　　a.如果给以&#8220;指针传递&#8221;方式的函数返回值加<span class=hilite1>c</span>onst修饰，那么函数返回值（即指针）的内容不能被修改，该返回值只能被赋给加<span class=hilite1>c</span>onst修饰的同类型指针。 <br>　　　　　　　如对于： <span class=hilite1>c</span>onst <span class=hilite1>c</span>har * GetString(void); <br>　　　　　　　如下语句将出现编译错误： <br>　　　　　　 　<span class=hilite1>c</span>har *str = GetString();//<span class=hilite1>c</span>annot <span class=hilite1>c</span>onvert from '<span class=hilite1>c</span>onst <span class=hilite1>c</span>har *' to '<span class=hilite1>c</span>har *'； <br>　　　　　　　正确的用法是： <br>　　　　　　　<span class=hilite1>c</span>onst <span class=hilite1>c</span>har *str = GetString(); <br>　　　　　　b.如果函数返回值采用&#8220;值传递方式&#8221;，由于函数会把返回值复制到外部临时的存储单元中，加<span class=hilite1>c</span>onst修饰没有任何价值。 如不要把函数int GetInt(void) 写成<span class=hilite1>c</span>onst int GetInt(void)。 <br>　　　　3&gt;<span class=hilite1>c</span>onst成员函数的声明中，<span class=hilite1>c</span>onst关键字只能放在函数声明的尾部,表示该类成员不修改对象. </font>
<p><font size=2>　　　说明： <br>　　　　<span class=hilite1>c</span>onst type m; //修饰m为不可改变 <br>　　　示例： <br>　　　　typedef <span class=hilite1>c</span>har * pStr; //新的类型pStr; <br>　　　　<span class=hilite1>c</span>har string[4] = "ab<span class=hilite1>c</span>"; <br>　　　　<span class=hilite1>c</span>onst <span class=hilite1>c</span>har *p1 = string； <br>　　　　p1++; //正确，上边修饰的是*p1,p1可变 <br>　　　　<span class=hilite1>c</span>onst pStr p2 = string; <br>　　　　p2++; //错误，上边修饰的是p2，p2不可变,*p2可变 <br>　　　同理，<span class=hilite1>c</span>onst修饰指针时用此原则判断就不会混淆了。 <br>　　　　<span class=hilite1>c</span>onst int *value; //*value不可变，value可变 <br>　　　　int* <span class=hilite1>c</span>onst value; //value不可变，*value可变 <br>　　　　<span class=hilite1>c</span>onst (int *) value; //(int *)是一种type,value不可变,*value可变 <br>　　　　　　　　　　　　　　//逻辑上这样理解，编译不能通过，需要tydef int* NewType; <br>　　　　<span class=hilite1>c</span>onst int* <span class=hilite1>c</span>onst value;//*value,value都不可变 </font><a name=volatile></a></p>
<h3><font size=2>(5)volatile </font></h3>
<p><font size=2>　　表明某个<span class=hilite3>变量</span>的值可能在外部被改变，优化器在用到这个<span class=hilite3>变量</span>时必须每次都小心地重新读取这个<span class=hilite3>变量</span>的值，而不是使用保存在寄存器里的备份。它可以适用于基础类型如：int,<span class=hilite1>c</span>har,long......也适用于<span class=hilite1>C</span>的结构和<span class=hilite1>C</span>++的类。当对结构或者类对象使用volatile修饰的时候，结构或者类的所有成员都会被视为volatile. <br>　　该关键字在多线程环境下经常使用，因为在编写多线程的程序时，同一个<span class=hilite3>变量</span>可能被多个线程修改，而程序通过该<span class=hilite3>变量</span>同步各个线程。 <br>　　简单示例： <br>　　　DWORD __std<span class=hilite1>c</span>all threadFun<span class=hilite1>c</span>(LPVOID signal) <br>　　　{ <br>　　　　　int* intSignal=reinterpret_<span class=hilite1>c</span>ast(signal); <br>　　　　　*intSignal=2; <br>　　　　　while(*intSignal!=1) <br>　　　　　sleep(1000); <br>　　　　　return 0; <br>　　　} <br>　　该线程启动时将intSignal 置为2，然后循环等待直到intSignal 为1 时退出。显然intSignal的值必须在外部被改变，否则该线程不会退出。但是实际运行的时候该线程却不会退出，即使在外部将它的值改为1，看一下对应的伪汇编代码就明白了： <br>　　　　　mov ax,signal <br>　　　　　label: <br>　　　　　if(ax!=1) <br>　　　　　goto label <br>　　对于<span class=hilite1>C</span>编译器来说，它并不知道这个值会被其他线程修改。自然就把它<span class=hilite1>c</span>a<span class=hilite1>c</span>he在寄存器里面。<span class=hilite1>C</span> 编译器是没有线程概念的,这时候就需要用到volatile。volatile 的本意是指：这个值可能会在当前线程外部被改变。也就是说，我们要在threadFun<span class=hilite1>c</span>中的intSignal前面加上volatile关键字，这时候，编译器知道该<span class=hilite3>变量</span>的值会在外部改变，因此每次访问该<span class=hilite3>变量</span>时会重新读取，所作的循环变为如下面伪码所示： <br>　　　　　label: <br>　　　　　mov ax,signal <br>　　　　　if(ax!=1) <br>　　　　　goto label </font></p>
<p><font size=2>　　<font color=red>注意：</font>一个参数既可以是<span class=hilite1>c</span>onst同时是volatile，是volatile因为它可能被意想不到地改变。它是<span class=hilite1>c</span>onst因为程序不应该试图去修改它。 </font><a name=extern></a></p>
<h3><font size=2>(6)<span class=hilite2>extern</span> </font></h3>
<p><font size=2>　　<span class=hilite2>extern</span> 意为&#8220;外来的&#8221;&#183;&#183;&#183;它的作用在于告诉编译器：有这个<span class=hilite3>变量</span>，它可能不存在当前的文件中，但它肯定要存在于工程中的某一个源文件中或者一个Dll的输出中。</font></p><img src ="http://www.cppblog.com/cc/aggbug/32033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2007-09-11 23:33 <a href="http://www.cppblog.com/cc/archive/2007/09/11/32033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 实现trim()函数</title><link>http://www.cppblog.com/cc/archive/2007/08/09/29667.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Thu, 09 Aug 2007 13:32:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2007/08/09/29667.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/29667.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2007/08/09/29667.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/29667.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/29667.html</trackback:ping><description><![CDATA[<p>本来想自己写一个，不过在网上一搜居然找到了一个代码用来处理字符的前后空格，估计还有不少人需要这个，在这里我把代码贴出来。<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">vector</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">algorithm</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">functional</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>using&nbsp;namespace&nbsp;std;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>inline&nbsp;string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;&nbsp;lTrim(string&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ss)&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img id=Codehighlighter1_151_278_Open_Image onclick="this.style.display='none'; Codehighlighter1_151_278_Open_Text.style.display='none'; Codehighlighter1_151_278_Closed_Image.style.display='inline'; Codehighlighter1_151_278_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_151_278_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_151_278_Closed_Text.style.display='none'; Codehighlighter1_151_278_Open_Image.style.display='inline'; Codehighlighter1_151_278_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_151_278_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.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_151_278_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;string::iterator&nbsp;&nbsp;&nbsp;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">find_if(ss.begin(),ss.end(),not1(ptr_fun(isspace)));&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ss.erase(ss.begin(),p);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;&nbsp;ss;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>inline&nbsp;&nbsp;string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;&nbsp;rTrim(string&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ss)&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img id=Codehighlighter1_324_466_Open_Image onclick="this.style.display='none'; Codehighlighter1_324_466_Open_Text.style.display='none'; Codehighlighter1_324_466_Closed_Image.style.display='inline'; Codehighlighter1_324_466_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_324_466_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_324_466_Closed_Text.style.display='none'; Codehighlighter1_324_466_Open_Image.style.display='inline'; Codehighlighter1_324_466_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_324_466_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.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_324_466_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;string::reverse_iterator&nbsp;&nbsp;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">find_if(ss.rbegin(),ss.rend(),not1(ptr_fun(isspace)));&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ss.erase(p.base(),ss.end());&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;ss;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>inline&nbsp;&nbsp;&nbsp;string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;trim(string&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">st)&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img id=Codehighlighter1_513_557_Open_Image onclick="this.style.display='none'; Codehighlighter1_513_557_Open_Text.style.display='none'; Codehighlighter1_513_557_Closed_Image.style.display='inline'; Codehighlighter1_513_557_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_513_557_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_513_557_Closed_Text.style.display='none'; Codehighlighter1_513_557_Open_Image.style.display='inline'; Codehighlighter1_513_557_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_513_557_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.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_513_557_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;lTrim(rTrim(st));&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;st;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>当然除了这个算法还有很多，不过比较了一下还是这个比较清晰，呵呵！<img src ="http://www.cppblog.com/cc/aggbug/29667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2007-08-09 21:32 <a href="http://www.cppblog.com/cc/archive/2007/08/09/29667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>孙鑫VC视频教学笔记20课</title><link>http://www.cppblog.com/cc/archive/2007/05/29/25092.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Tue, 29 May 2007 10:48:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2007/05/29/25092.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/25092.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2007/05/29/25092.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/25092.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/25092.html</trackback:ping><description><![CDATA[<h2 align=center>孙鑫VC视频教学笔记20课<br></h2>
<p style="COLOR: #000000">&nbsp;&nbsp;&nbsp;孙鑫老师的VC教学的视频在网上非常流行，我刚好看到网上有这个视频的学习笔记，这里把它贡献出来与大家分享。<br>下载<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a title=孙鑫VC视频教学笔记 href="http://www.cppblog.com/Files/cc/vc_sx.zip">孙鑫VC视频教学笔记</a></p>
<img height=531 alt="" src="http://www.cppblog.com/images/cppblog_com/cc/2007_5/spbj.jpg" width=670 border=0><br><br><br><br><br><img src ="http://www.cppblog.com/cc/aggbug/25092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2007-05-29 18:48 <a href="http://www.cppblog.com/cc/archive/2007/05/29/25092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编写易于调试的VC代码(转载)</title><link>http://www.cppblog.com/cc/archive/2007/05/29/25065.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Tue, 29 May 2007 06:51:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2007/05/29/25065.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/25065.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2007/05/29/25065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/25065.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/25065.html</trackback:ping><description><![CDATA[<p style="COLOR: #000000" align=center>编写易于调试的VC代码(转载)<br>提供者：<a href="http://vcer.net/bluejoe.vcer" target=_blank>bluejoe</a> 张贴时间：2007-01-23 17:00:05.0 出处：csdn.net 作者：michael&nbsp;<br></p>
<p style="COLOR: #000000">一 程序的设计 <br><br>　　要避免错误，首先要从好的设计开始。对于程序的设计，需考虑到程序的两个特性： <br><br>　　1简单性 <br><br>　　大多数常见的错误来源于程序设计中不必要的复杂成分。一个好的设计应该反映问题本身的要求，而不必为了刻意追求&#8220;满足将来的需要&#8221;而添加不必要的特性。实际上，简单优雅的设计比那些复杂的设计更能迎合未来的需求。 <br><br>　　2 耦合性 <br><br>　　耦合(decoupling)性用来衡量不同对象之间的依赖程度。松耦合的程序易于理解和实现，易于测试和维护，且这种程序包含错误的可能性小，错误也较容易发现和清除。<br>&nbsp;</p>
<p style="COLOR: #000000">二 编程风格 <br><br>　　编程风格是个人问题，有很大的随意性。一个好的编程风格不仅让代码易理解，也易于调试。好的编程风格包括： <br><br>　　1 清晰地书写代码 <br><br>　　如果没有必要，尽量不要使用语言中的高级特性，因为这些特性不易于理解和调试。使用大多数程序员都能理解的语言成分来书写代码不易犯错且易于理解和维护。 <br><br>　　2 编写结构良好的代码 <br><br>　　当程序崩溃时所能得到的最基本的调试信息是源代码文件、问题所在行的行号和一个调用栈(call stack)。调用栈是调试程序时最有帮助的部分，它提供错误出现的上下文，也就是带参数的函数调用序列。你书写的代码结构越好，调用栈就能给你越多信息。 <br><br>　　3 使用良好的标识符 <br><br>　 　一个好名字能使你的代码更容易被理解和维护。流行的匈牙利命名法(Hungarian Notation)实际上是把标识符的意义和表示方法结合起来。 现在，匈牙利命名法表现出不少的局限性，匈牙利命名法过于看重前缀的作用，对一个变量的表达信息不完整，实际上并没有传递多少有用信息，它使代码难于阅 读，难以维护。一个好的命名传统是指示出变量的作用域以便在需要的时候检查它的定义，并明确地指出一个变量是全局的、局部的还是成员数据。依赖变量的定义 比依赖匈牙利前缀更加有用和可靠。 <br><br>　　好的名字能够用平常的语言概括出该标识符所代表的实体的含义。在选择类、函数、变量的名字时可以考虑以下几个原则： <br><br>　　　　取简单的描述性名字，好的名字能简要地概括出这个标识符代表的含义。 <br><br>　　　　避免简写，简写使标识符难于阅读和记忆，尽量使用混合大小写的完整的单词。 <br><br>　　　　避免相似性的文字，避免混淆。 <br><br>　　　　避免采用一般的或随机产生的名字，而应采用有实际意义的名字。如欲从按钮类派生位图按钮，取一个CBitmapButton，而不是CMyButton。 <br><br>　　4 用简单的语句行 <br><br>　　在VC中，一行可写多个语句。但调试是面向行的，过于复杂的行难于调试。因此，从调试的角度出发，每一个语句都应独自成行。 <br><br>　　5 使用统一的排列 <br><br>　　统一的排列方式使类、变量的定义和语句更加明显。 <br><br>　　6 用括号使书写清晰 <br><br>　　你不一定能都记住各种运算符的优先级和结合律，而使用多余的括号并不影响编译后的代码。因此，如果你不能确定是否需要括号时，请加上它。 <br><br>　　7 使用好的注释 <br><br>　　用好的注释能使你的代码不易出错，而且便于其他程序员阅读，便于理解和维护。 </p>
<p style="COLOR: #000000">三 编写程序时应注意的问题 <br><br>　　1 充分利用VC++的特性 <br><br>　　可用下列技术来充分利用VC++的编译器的特性： <br><br>　　（1）用const代替#define来创建常量； <br><br>　　（2）用enum代替#define来创建常量集合； <br><br>　　（3）用内联(inline)函数代替#define； <br><br>　 　这三种技术用C++而不是C预处理。使用预处理的问题在于编译器对于预处理器所作的事情一无所知，因此无法用数据类型检查错误和不一致的地方。预处理的 名字不在符号表里，因此也不能用调试工具来检查预处理常量。相似地，预处理宏被编译进去，不能用调试工具跟踪。编译器能充分了解const、enum和 inline语句，从而能在编译的时候对出现的问题发出警告。 <br><br>　　但预处理在很多调试代码中起重要作用。调试代码经常需要从非调试代码里面得到不同的行为，而最有效的办法就是让预处理为调试创建不同的代码。 <br><br>　　（4）用new和delete代替malloc和free; <br><br>　　在创建对象、类型的安全性和灵活性方面。使用new/delete比malloc/free要好。另外，new可被重载，提供了更大的灵活性。 <br><br>　　（5）用输入输出流(iostreams)代替stdio。 <br><br>　 　使用C++输入输出流（&lt;&lt;和&gt;&gt;）而不使用C标准输入输出库（printf/sprintf和scanf/sscanf）， 有利于安全性和扩展性。从调试的角度来看，标准输入输出函数的最大问题在于编译器不能对控制流参数进行任何类型检测，而输入输出流的任何问题都能在编译时 检测出来。 <br><br>　　2 使用头文件 <br><br>　　要在头文件中声明所有共享的外部符号，而且保留函数原型中的参数名。把所有的共享定义放在头文件中，不要在.cpp文件里面看到extern关键字。 <br><br>　　3 初始化变量 <br><br>　 　在使用变量之前一定要把它们初始化。在初始化之前就使用变量肯定会产生错误。通常不需对对象进行初始化，对对数据成员应在构造函数中初始化。必须明确地 为在栈中和堆中分配的数组和数据结构进行初始化。对于对象，应该初始化每个需要初始化的数据成员。因为变量的使用是由优化器来检查的，所以检测未初始化的 本地变量，发布版本要比调试版本要做得好。 <br><br>　　4 使用布尔表达式 <br><br>C++的布尔类型：bool，值为true和false，大小为一个字节。 <br><br>Windows程序通常用BOOL类型。定义如下：<br></p>
<div style="COLOR: #000000">1<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Typedef&nbsp;int&nbsp;BOOL;&nbsp;&nbsp;&nbsp;&nbsp;<br>2<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br>3<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#define&nbsp;FALSE&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;<br>4<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br>5<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#define&nbsp;TRUE&nbsp;1&nbsp;&nbsp;&nbsp;</div>
<p style="COLOR: #000000">在C++中，一个布尔表达式如果为0则为假，其他则为真。因此，对布尔表达式应该检查是否问假而不是检查是否为真。 <br><br>　　5 使用句柄和指针 <br><br>　　初始化一个指针时，要么让其指向一个有效的内存地址，要么设为0（空指针），避免指针指向无效地址。回收指针所指对象时要重新初始化这个指针，并且在指针被释放前为空时就对其进行处理。对句柄的处理跟指针一样。 <br><br>　　6 用引用而不是指针做参数 <br><br>　　用指针做函数的参数可传递一个空指针，很灵活，但也很容易忘了对指针进行初始化。而引用是对象的别名，它必须和有效的对象相关联，不存在空的和没有初始化的引用。当在函数中收到一个引用参数时，可以肯定这是一个有效的对象。程序用引用做参数比用指针做参数更为健壮。 <br><br>　　7 强制类型转换(cast) <br><br>　 　进行数据类型的强制类型转换时，将会调用相应的构造函数或转换函数来创建一个新类型的临时对象。对指针的正确类型转换可消除一个编译错误，但并没改变指 针。强制类型转换破坏了编译器进行类型检查的功能，而这正是编译器查找错误的最有效的机制。为了保证安全性，每一个强制类型转换都需要手工进行类型检查。 为尽量避免强制类型转换，你可以：避免使用多态数据类型；使用更加广泛的基类；提供特殊的存取函数；让编译器隐式处理类型转换等措施。 <br><br>　　8 使用构造函数和析构函数 <br><br>　 　构造函数需要分配内存，创建资源或者打开文件，这些运算并不总是成功。构造函数没有返回值，没有直接显示错误的方法。一个常见的方法（在很多MFC类中 使用）是把对象创建分为两步：第一步，让构造函数以一种不会出错的方式初始化对象；第二步，让某些初始化函数（如Init或Open）完成工作，这一步可 能出错。另一种方法是在构造函数中使用异常：第一步，以不会出错的方式初始化对象；第二步，用可能在try段内出错的代码初始化对象；第三步，在 catch代码里面处理异常。如果出现异常，就会在构造函数里清除分配的资源，并且再次抛出异常。 <br><br>　　异常处理的一个关键细节就是在栈展 开的过程中抛出的异常会终止整个应用程序。在处理异常时经常要调用析构函数，因此析构函数很容易出错，一定要保证析构函数的异常在析构函数中得到处理。要 保证基类的析构函数是虚函数。这样，就算对象是一个指向基类的指针，也会调用派生类的析构函数。否则，就会引起资源泄漏(resource leak)。&nbsp;&nbsp;</p>
<h1>在VC程序中使用调试语句 </h1>
<p style="COLOR: #000000"><span style="COLOR: #000000">为了更好地对程序调试，可以使用如下方法：使用断言、使用跟踪语句、使用异常和返回值。 <br><br>一、断言 <br><br>1、基本概念 <br><br>　　断言是一种让错误在运行时候自我暴露的简单有效实用的技术。它们帮助你较早较轻易地发现错误，使得整个调试过程效率更高。 <br><br>　　断言是布尔调试语句，用来检测在程序正常运行的时候某一个条件的值是否总为真，它能让错误在运行时刻暴露在程序员面前。使用断言的最大好处在于，能在更解决错误的发源地的地方发现错误。断言具有以下特征： <br><br>.断言是用来发现运行时刻错误的，发现的错误是关于程序实现方面的。 <br><br>.断言中的布尔表达式显示的是某个对象或者状态的有效性而不是正确性。 <br><br>.断言在条件编译后只存在于调试版本中，而不是发布版本里。 <br><br>.断言不能包含程序代码。 <br><br>.断言是为了给程序员而不是用户提供信息。 <br><br>　 　使用断言最根本的好处是自动发现许多运行时产生的错误，但断言不能发现所有错误。断言检查的是程序的有效性而不是正确性，可通过断言把错误限制在一个有 限的范围内。当断言为假，激活调试器显示出错代码时，可用Call Stack命令，通过检查栈里的调用上下文、少量相关参数的值以及输出窗口中 Debug表的内容，通常能检查出导致断言失败的原因。_ASSERTE宏(属于C运行时间库)还能在断言失败时显示出失效断言。下面我们讨论一下MFC 库中的断言。 <br><br>2、MFC库中的断言 <br><br>(1) ASSERT(布尔表达式) <br><br>用MFC时最好选择ASSERT宏，它的优点是即使出现了WM_QUIT消息也能显示断言失效消息框。 <br><br>(2) VERIFY(布尔表达式) <br><br>VERIFY 宏中的布尔表达式在发布版本中被保留下来。VERIFY宏简化了对函数返回值的检查，一般用来检查Windows API的返回值。由于 VERIFY宏里的布尔表达式在发布版本里保留了下来，因此最好尽量不要使用这个宏以实现程序代码和调试代码的完全分离。 <br><br>(3 )ASSERT_VALID(指向CObject派生类对象的指针) <br><br>ASSERT_VALID宏通过调用重载的AssertValid函数来确定指向CObject派生类对象的指针是否有效。无论你什么时候从CObject派生类中得到一个对象，在对这个对象做任何操作之前都应该调用ASSERT_VALID宏。 <br><br>(4) ASSERT_KINDOF(类名, 指向CObject派生类对象的指针) <br><br>这个宏用来验证指向CObject派生类对象的指针是否从某个特殊类中派生，在调用它之前先调用ASSERT_VALID宏。只有在很特殊的场合下才用得到，如检测编译器可能错过的对象类型问题。 <br><br>此外，还有两个没有正式文件的ASSERT宏的变种：ASSERT_POINTER(指针,指针类型)，ASSERT_NULL_OR_POINTER(指针,指针类型)。 <br><br>3、什么时候使用断言 <br><br>　　把断言看作一种简单的制造栅栏的方法，这种栅栏能使错误在穿过自己时暴露。 <br><br>.检查函数的输入 <br><br>.检查函数的输出 <br><br>.检查对象的当前状态 <br><br>.坚持逻辑变量的合理性和一致性 <br><br>.检查类中的不变量 <br><br>公有成员函数比私有和保护的成员函数需要更全面的断言。 <br><br>　　不正确地使用断言会导致错误。断言应该检测那些在程序正常运行的时候永远都不可能出现的状态。断言是用来揭示错误的，而不是用来纠正运行时刻错误的。 <br><br>4、断言与防御性编程(Defensive Programming) <br><br>　 　断言在调试的时候向程序员揭示运行时刻错误（调试版本里），而防御性编程使用户在运行程序（发布版本里）时，当出现意外情况时程序仍能继续工作。实际 上，防御性的编程要求程序在检测到意外时返回一个&#8220;安全&#8221;的值（比如布尔函数返回false，指针和句柄返回空值），一个错误代码或者抛出一个异常来解决 问题。特定的防御性编程技术包括：处理无效函数参数和数据、出现问题的时候程序失败、检查临界函数返回的错误代码以及处理异常。需要防御性编程的标准问题 包括：错误的输入数据、内存或者硬盘空间不够、不能打开一个文件、外部设备不能访问、网络连接不上或者甚至在程序中还有错误，目的是保持程序的运行状态。 如果你的程序是防御性的，别忘了使用断言。如果你使用断言，也别忘了防御性编程。这两种技术最好结合在一起使用。 <br><br>二、跟踪语句 <br><br>1、基本概念 <br><br>　 　跟踪语句(trace statements)可使程序执行，并使程序员可对可变值进行查看。它们提供了一个用于观察的程序，并且独立于一个交互式的调 试器，但是最具有特色的是它们常用于对调试器提供的信息进行补充。在VC中，跟踪消息通常输出到输出窗口中的Debug标签，也可以重新输出到一个文件 中。跟踪语句的特性如下： <br><br>.跟踪语句用于报告代码中重要的运行事件。 <br><br>.跟踪语句的编译通常是有条件的，并只存在于调试版本中，而在发布版本中不被编译。 <br><br>.跟踪语句不能包含程序代码或对程序代码有间接的影响作用。 <br><br>.跟踪语句的目的是向程序员提供信息，而不是向用户。 <br><br>跟踪语句也是调试语句，它可以执行程序，并且在运行中程序员可以查看变量。跟踪语句对于那些使用交互式调试器很难调试的程序是很有效的。 <br><br>跟踪语句和断言的区别如下： <br><br>.跟踪语句是无条件的，断言是有条件的布尔语句。 <br><br>.跟踪语句用于显示程序执行和变量值，不直接显示bug，断言用于显示出bug。 <br><br>.跟踪语句将信息输出到调试窗口或文件中，可被随意地忽略，断言打断程序的执行。 <br><br>2、MFC中的跟踪语句 <br><br>　 　在MFC中，你可以使用TRACE和AfxOutputDebugString宏、CObject::Dump虚拟函数和AfxDumpStack函 数。TRACE宏由AfxDump实现，AfxDump由AfxOutputDebugString实现。AfxOutputDebugString宏和 AfxDumpStack函数可以在所有版本中编译，其他只能在调试版本中编译。 <br><br><br>（1）TRACE宏有以下形式：</span> <br></p>
<div style="COLOR: #000000">1<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>_TRACE(reportType,format);&nbsp;&nbsp;&nbsp;&nbsp;<br>2<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br>3<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>_TRACE0(reportType,format,arg1);&nbsp;&nbsp;&nbsp;&nbsp;<br>4<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br>5<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>_TRACE1(reportType,format,arg1,arg2);&nbsp;&nbsp;&nbsp;&nbsp;<br>6<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br>7<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>_TRACE2(reportType,format,arg1,arg2,arg3);&nbsp;&nbsp;&nbsp;&nbsp;<br>8<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br>9<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>_TRACE3(reportType,format,arg1,arg2,arg3,arg4);</div>
<br><span style="COLOR: #000000">在MFC中，推荐使用TRACEn宏，当使用TRACE宏时需要使用_T宏来格式化参数以正确解决Unicode的校正，而TRACEn不需要。 <br><br>MFC TRACE宏中的一个缺点是AfxTrace函数使用一个512字符固定大小的缓冲区，这使得它在跟踪长字符串时是无用的。 <br><br>（2）CObject::Dump <br><br>CObject类有一个转储(dump)虚拟函数，所有继承CObject的类都可以通过重载这个函数，输出它们的值。 <br><br>3、Visual C++消息Pragma <br><br>消息Pragma实际上是一个编译时的跟踪语句，你可以使用它来警告在预处理过程中发现的潜在的编连(build)问题。典型的例子： <br><br>#if (WINVER&gt;=0x0500) <br><br>#pragma message (&#8220;NOTE:WINVER has been defined as 0x0500 or greater.&#8221;) <br><br>#endif <br><br>　　消息Pragma是非常有用的，尤其是在复杂编连中。然而，如果你要检测一种特定的问题，而不是潜在的问题，使用#error预处理来代替打断编译会更直接一些。 <br><br>　 　每当你的程序中有错误而你想得到更多信息的时候，你应该去查看一下跟踪消息。由于VC输出窗口的缓冲区是有大小限制的，因此如果跟踪消息数据产生的速度 超过输出窗口处理的速度，那么消息会塞满缓冲区，导致数据丢失。避免这个问题的简单方法是在输出大量数据的代码段如转储对象时，调用Sleep API函 数。 <br><br>三、异常 <br><br>1、基本概念 <br><br>　　错误是一种条件，在这种条件下，如果不执行额外的处理，线程就不能正常地 执行下去。异常是用于处理错误的。使用异常的一个很明显的好处就是它们通过发出错误信号，可以让程序代码和错误处理代码分开，而且不会让程序忽略错误，你 不用不断地检查函数的返回值，因此它们将程序代码简单化。另一个好处是它们不需要严格的编程作风。 <br><br>异常的基本特性： <br><br>.异常是基于每个进程而提出并处理的。 <br><br>.异常不能被线程忽略，必须被处理。 <br><br>.未处理的异常会使进程结束，而不仅仅是结束线程。 <br><br>.异常出来在释放栈时会释放所有的栈对象，避免了资源的漏洞。 <br><br>.异常处理需要大量的额外操作，使得它不适于经常运行的代码。 <br><br>.可以抛出任何类型的异常对象，除了整数。 <br><br>如果正确执行，异常处理有下面的特性： <br><br>.异常是不是正常的运行结果，是特殊情况。 <br><br>.异常在返回值无效的情况下使用。 <br><br>.异常是可靠的，不可能被忽略。 <br><br>.异常简化了错误处理，简化了程序代码，使错误处理更加方便。 <br><br>　 　Visual C++的默认情况下，在调试版本中处理异常，而在发布版本中并不进行处理。由于异常也是错误，Windows异常码采用了同 Windows错误码一样的位映射模式，为一个32位的值，这些码由Microsoft定义，任何异常码的最高四位总是1100（二进制），即十六进制里 的0xC。 <br><br>2、Windows结构异常和C++异常 <br><br>　　Windows结构异常作为硬件异常（如访问非法或被零除）或操 作系统异常的结果被抛出，C++异常只能由throw语句抛出。Windows结构异常处理不能处理对象的解析，因此你应该在C++程序中一直使用C++ 异常。然而，C++异常不能处理硬件和操作系统异常，你的程序需要将结构异常转化为C++异常。C++异常并不直接从你的程序代码中抛出而是从C++运行 库中抛出，因此你需要调用栈窗口来返回你的代码。为了正确处理硬件和操作系统异常，你可以创建自己的异常类并使用_set_se_translator函 数安装一个结构异常向C++异常的转化器，但不要捕获那些不能恢复所产生问题的转化后的结构异常。 <br><br>3、MFC中的异常 <br><br>　 　在MFC中，所有的异常对象都是从CException基类（它有使用起来非常方便的GetErrorMessage和ReportError成员函 数）中派生来的。大多数的MFC异常对象都是动态分配的，而且当它们被捕获时，必须被删除，而没有被捕获的MFC异常由MFC本身在 AfxCallWndProc函数中捕获并删除。 <br><br>4、异常的开销 <br><br>　　当抛出C++异常时，函数调用链将从此回溯搜索，寻 找可以处理抛出这类异常的处理器。若没找到，进程结束。如果找到，调用栈将被释放，所有的自动（局部）变量也将释放，然后栈将被整理为异常处理器的上下文 相关设备。因此异常开销由一个异常处理器目录和一个活动的自动变量表（它需要额外的代码、内存，而且不论异常是否抛出，都会运行），还得加上函数调用链的 搜索、自动变量的解析和栈的调整（它只在抛出异常的时候需要执行）组成。 <br><br>5、异常策略 <br><br>(1)抛出时机 <br><br>　　抛出异常的时机应该是一个函数发现一个错误，如果没有一些特殊的操作，该错误能阻止程序正常的运行，而这种操作它自己不能完成，或是在函数不可能有返回值的时候。 <br><br>　　使用异常处理更简单，更可靠，更有效，可以创建更健壮的代码。然而，应该只在意外的情况下使用异常处理。如果你认为一个指针应该是空值，这种条件下就直接在代码中检查这个值，而不要使用异常。 <br><br>(2)何时捕获 <br><br>对于这个问题，有一些可能的标准： <br><br>.当函数知道如何处理这个异常时。 <br><br>.当这个函数可以合理地处理这个异常而高级的函数不知道如何处理时。 <br><br>.当抛出异常可能使进程崩溃时。 <br><br>.当函数可以继续执行它的任务时。 <br><br>.当需要整理分配好的资源时。 <br><br>　　异常处理的一个缺点是它可能导致资源的泄露。因此，防止资源泄露更应该是保持程序异常安全的一部分。栈释放时会自动整理局部变量，但不包括动态分配的变量。可以使用智能(smart)指针来保护你的代码在存在异常的情况下不会产生资源泄漏。 <br><br>(3)怎样捕获 <br><br>.非MFC的C++异常应该通过引用来捕获。使用引用捕获异常不需要删除异常对象（因为使用引用捕获的异常会在栈中传送），而且它保留了多态性（因此你捕获的异常对象正是你抛出的异常对象）。 <br><br>.MFC 异常应该通过指针来捕获。使用指针捕获异常需要你删除对象。因为它们通常从堆中分配，当你处理完异常之后，需要调用Delete成员函数来删除。你不可以 使用省略捕获处理器捕获MFC异常，这会导致一个内存泄露。必须使用Delete成员函数删除MFC异常，而不用delete，因为一些MFC异常为静态 对象创建。 <br><br>在释放栈的过程中抛出异常会导致进程的终止。释放栈涉及到调用析构函数，异常可以阻止调用delete操作符，这样会有资源泄漏，因此异常最好不要从析构函数中抛出。如果非要在析构函数里抛出异常，必须妥善处理，避免资源泄漏。 <br><br>6、异常与防御性编程 <br><br>　　在异常发生时继续执行程序，远比执行一个正常的关闭动作要重要。如果可能，应该将精力集中在继续执行程序，并在必须的情况下才正常地关闭程序。可能最根本的正常关闭是一个在崩溃时可以重新启动自己的进程，这是Windows资源管理器使用的一种技术。 <br><br>　　如果一个与错误相关的C++异常是可预料的，如果它发生在非关键性的代码中，如果它不是发生在程序启动或结束过程中或一个不可恢复的结构异常的结果中，这个程序就可以从其中恢复。 <br><br>　　一旦你的程序可以从与错误相关的异常中恢复，应该先检查程序的状态和它的文档。如果程序和文档已经被破坏了，进程也应该终止运行。否则，程序需要通知客户机确定动作的过程。如果客户机同意执行下去，程序应该恢复错误并继续执行。 <br><br>四、返回值 <br><br>　　并不是在所以场合下都能使用异常，如在使用Windows API编程或带有COM编程时并不使用异常。在异常不适合的时候，使用返回值是一个好的办法。 <br><br>返回值的基本特性： <br><br>.返回值可以指示正常和不正常的函数运行，但不能阻止线程的继续运行。 <br><br>.返回值很容易被忽略。 <br><br>.返回值在典型情况下是一个整数，通常映射符合于一个预定义的值。 <br><br>.返回值能高效地传递和接收。 <br><br>因此，返回值最适合用于以下的情形： <br><br>.用于非错误的状态信息 <br><br>.用于大多数情况下可以随意忽略而不会出问题的错误。 <br><br>.用于更易于出现在循环中的错误。 <br><br>.用于中间语言模块如COM组件中的错误。</span>
<h1>使用Visual C++调试器调试</h1>
<p style="COLOR: #000000">一、调试版本与发布版本 <br><br>　　有时程序能在调试版本运行但不能运行于发布版本，反之也有可能。一般说来，一个发布版本意味着某些类型的优化，而一个调试版本则没有优化。下面我们来看看它们的区别： <br><br>1、特别针对调试版本的编译选项 <br><br>（1）/MDd,/MLd或者/MTd <br><br>　　调试版本的运行时刻库有调试符号，使用了调试堆，调试堆的目的是发现内存破坏和内存泄漏，并且向用户报告源代码的哪个地方出了问题。特性： <br><br>.调试版本的运行时刻库对内存的分配作了跟踪，允许用户检查内存泄漏。 <br><br>.在刚分配的内存里写上0xCD的字节模式，用0xCD来填充刚分配的内存，有助于发现数据未被初始化的错误。 <br><br>.在被释放的内存写上0xDD的字节模式，有助于发现已被释放的内存。 <br><br>.在缓冲区的两边分配了四字节的保护数据，并用0xFD的字节模式作初始化，来检查写内存的上溢出和下溢出。 <br><br>.在每个内存分配的地方对源代码文件名和行号作了记录，有助于用户在源代码中对内存分配进行定位。 <br><br>（2）/Od <br><br>　 　这个选项用来关闭优化开关。因为未被优化的代码直接对应于源代码，所以比优化后的代码更容易读懂。未被优化的代码编译和链接会更快，会有更短的调试周 期。而由于优化，发布版本不见得会比调试版本运行得好，优化代码要求编译器做一些假设，去除冗余，但有时这个假设是错误的，并且去掉的冗余也有可能隐藏错 误。如发布版本的帧指针（EBP寄存器）省略（FPO）隐藏了函数原型不匹配的错误；在同步异常模式（只能由throw语句抛出，编译器默认，由/GX编 译选项设置）下，异常处理程序可能被优化掉，会阻止程序中的C++异常处理代码安全地捕获结构异常，在这种情况下，你必须使用异步异常模式（采取任何指令 都会产生异常的机制，由/Eha编译选项设置）。 <br><br>（3）/D &#8220;_DEBUG&#8221; <br><br>　　打开条件编译调试代码开关。只有这个符号被定义，调试代码才会被编译，MFC使用_DEBUG符号来确定到底链接的是哪个版本的MFC类库。在调试版本中，内联默认情况下是被关闭的。 <br><br>（4）/ZI <br><br>　 　创建编辑继续(Edit and Continue)的程序数据库。这个选项会打开/GF编译选项，/GF编译选项会消除重复字符串，并将字符串放到只 读内存。编辑继续功能需要获取存储在PDB文件里的特殊信息来使得代码的修改对调试器有效。如果被修改文件对应的信息不在PDB文件里，编辑继续功能就不 能进行，而且在调试过程中对代码的任何修改都会出现下面的提示信息 &#8220;One or more files are out of date or do not exist.&#8221;。 <br><br>（5）/GZ <br><br>在调试版本中用来发现那些在发布版本里才发现的错误。其作用如下： <br><br>.用0xCC模式初始化自动（本地）变量。 <br><br>.在通过函数指针调用函数时，检查栈指针，确认是否有调用规则不匹配。 <br><br>.在函数最后检查栈指针是否被改变。 <br><br>（6）/Gm <br><br>　　打开最小化重新链接开关，减少链接时间。 <br><br>2、特别针对发布版本的编译选项 <br><br>（1）/MD,/ML或者/MT <br><br>　　使用发布版本的运行时刻库。 <br><br>（2）/O1或者/O2 <br><br>　　打开优化开关，使得程序会最小或说速度会最快，优化器还可能发现代码中潜在的错误，而这些错误可能会被调试版本掩盖。 <br><br>（3）/D &#8220;NDEBUG&#8221; <br><br>　　关闭条件编译调试代码开关。 <br><br>（4）/GF <br><br>　　消除重复字符串并将它们放到只读内存中以避免被错误地修改。 <br><br>（5）/Zi <br><br>创建包含调试符号的程序数据库。 <br><br>　 　如果一个错误只发生在发布版本里，除非你是个汇编高手，否则你需要调试符号来提示你到底程序出现了什么问题，调试符号保存在程序的数据库文件（PDB） 中。Visual C++的AppWizard默认情况下没有为发布版本创建调试符号。为创建调试符号，打开工程设置对话框，选择 Win32 Release，在C/C++标签里选择Common类，在调试信息里，如果是发布版本选择Program Database，如果是调试版 本选择Program Database for Edit and Continue（编辑继续选项与优化链接不相容，不适于发布版本）。在Link标 签里选择Debug类，然后选择Debug Info和Microsoft format选项，最好不要选择Separate types选项，这样所有 的调试信息才会被合并到单独的一个PDB文件中。对于发布版本，选择Link标签，在Project options对话框的最后加上&#8220;/OPT: REF&#8221;，这个选项使得不被引用的函数和数据不会出现在可执行文件中，避免了文件的无谓增大。对于调试版本不要使用这个选项，它会关闭增量链接 (incremental linking)。 <br><br>二、Visual C++编辑器的&#8220;设置&#8221;菜单 <br><br>　　当你打开或新建一个包 含至少一个工程的Workspace后，Visual C++的Project菜单中的&#8220;Settings&#8230;&#8221;命令就变为有效，选择它或者按下热键Alt +F7后，便可调出工程设置对话框，这里面的选项将影响整个工程的建立和调试过程，因此很重要。 <br><br>　　在这个对话框中，左上方的下拉列表框 用于选择一种工程配置，包括有Win32 Debug、Win32 Release和All Configurations（指前两种配置一起），某些选 项在不同的工程配置中有不同的缺省值。左边的树形视图给出了当前工程所有的文件及分类情况。下面我们就以Win32 Debug为例来看看与工程有关的的 四个主要选项卡的各自功能与含义（一共有十个选项卡）： <br><br>1、 General选项卡 <br><br>　　这个选项卡比较简单，从上向下的 第一个选项用于更改使用MFC类库的方式： DLL的方式或是静态连接。我们可以在两种方式之间进行切换。第二个选项用于指定在编译连接过程中生成的中间 文件和输出文件的存放目录，对于调试版本来说，缺省的目录是工程下面的&#8220;Debug&#8221;子目录。第三个选项用于指定是否允许每种工程配置都有自己的文件依赖 关系（主要指头文件），由于绝大多数工程的调试版本和发布版本都具有相同的文件依赖关系，所以通常不需要更改该选项。 <br><br>2、 Debug选项卡 <br><br>　　Debug选项卡中是一些与调试有关的选项，由于选项比较多，它们被分成了几个类，我们可以从Category中选择不同的类别，选项卡就会切换显示出相应的选项。 <br><br>　　在General类别中，可以指定要调试的可执行文件名。另外三个选项可以指定用于调试的工作目录，开始调试时给程序传送的命令行参数，以及进行远程调试时可执行文件的路径。 <br><br>3、C/C++选项卡 <br><br>　 　C/C++选项卡控制着Visual C++的编译器，其中的选项比较多。下面有一个Project Options编辑框，里面 列出的各种命令开关将会在开始编译时作为命令行参数传送给Visual C++的编译器。这些命令开关会跟随其它选项改变而改变。 <br><br>　 　在General类别中，Warning level用于指定编译器显示警告的级别，如果选中了Warnings as errors，那么显示的每一 个警告都将会引起一个错误，这样在编译完毕后就无法启动连接器来进行连接。Optimizations用于设置代码优化方式，优化的目的主要有提高运行速 度和减小程序体积两种，但有时候这两种目的是相互矛盾的。另外，在极少数情况下，不进行优化，程序能正常运行，打开了优化措施之后，程序却会出现一些莫名 其妙的问题。其实这多半是程序中有潜在的错误，关闭优化措施往往只是暂时解决问题。Debug info用于指定编译器产生的调试信息的类型，为了使用 Visual C++的即编即调功能，必须在这里选择生成&#8220;Program Database for Edit and Continue&#8221;类型的调试 信息。Preprocessor definitions是一些预先定义的宏名。 <br><br>　　C++ Language类别中的选项涉及到了C+ +语言的一些高级特性，包括有成员指针的表示方式、异常处理、运行时类型信息，一般情况下都不用改变它们。Code Generation类别中的选项涉 及如何生成目标代码，一般情况下保持缺省值即可。在Customize类别中，从上到下六个选项的含义分别为：是否禁止使用Microsoft对C++的 扩展；是否允许函数级别的连接；是否消除重复的字符串；是否允许进行最小化的重建；是否允许递增编译方式；是否允许编译器在开始运行时向Output窗口 中输出自己的版本信息。 <br><br>　　在Listing Files类别中，我们可以指定编译器生成浏览信息和列表文件 （Listing file），前者可由浏览信息维护工具BSCMAKE生成浏览信息文件，后者则包含了C/C++源文件经过编译后对应的汇编指令。 Optimizations类别允许我们对优化措施进行更细微的控制，选择了Customize后，便可以选择进行哪几项优化，在 Inline function expansion中我们可以指定对内联函数的扩展方式。Precompiled Headers类别中是关于预编译头 文件的一些选项，一般情况下都不用更改。Preprocessor类别中是关于预处理的一些选择。 <br><br>4、Link 选项卡 <br><br>　 　Link选项卡控制着Visual C++的连接器。在General类别中，可以指定输出的文件名，以及一些在连接过程中需要使用的额外的库文件或目 标文件，下边五个选项的含义分别为：生成调试信息；忽略所有缺省的库文件；允许递增连接方式（这种方式可以加快连接的速度）；生成MAP文件；允许进行性 能分析。在Customize中选中Use program database允许使用程序数据库。在Debug类别中，我们可以指定调试信息的类别是 Microsoft的格式，还是COFF格式，或者两种都有，选中Separate types后连接器会把调试信息分开放在PDB文件中，这样连接起来 会更快一些，但调试时速度却会慢一些。Input类别中是一些与输入库文件有关的选项，我们可以在这里指定使用或不使用某些库文件或目标文件。 Output类别中则是一些与最终输出的可执行文件有关的选项，一般情况下都不用改变。 <br><br>三、Visual C++调试工具 <br><br>1、调试窗口 <br><br>（1）观察窗口(Watch) <br><br>　　调试程序时，可使用观察窗口监视变量和表达式。 <br><br>（2）快速查看窗口(Quick watch) <br><br>　　功能和观察窗口差不多。 <br><br>（3）变量窗口(Variables) <br><br>　　变量窗口有三个标签：Auto标签显示了当前语句和前一条语句用到的变量，Locals标签显示当前函数的局部变量，this标签显示了this指针执行的对象。 <br><br>（4）寄存器窗口(Register) <br><br>　　可以监视CPU的寄存器、标志值以及浮点堆栈 <br><br>（5）内存窗口(Memory) <br><br>　　可显示从一特定地址开始的虚拟内存。Address框允许你指定从哪个虚拟内存地址开始显示。 <br><br>（6）调用栈窗口(Call stack) <br><br>　　可显示引起当前源代码语句执行的一系列函数调用，当前函数在堆栈的顶端。 <br><br>（7）反汇编窗口(Disassembly) <br><br>　　可查看编译器生成的对应于源代码的汇编指令。 <br><br>2、调试符号 <br><br>　 　程序数据库文件(.pdb)包含了Visual C++调试器所需的调试信息和程序信息。调试信息包含了变量的名字和类型、函数原型、源代码行号、类和 结构的布局、FPO调试信息（重建堆栈帧）以及进行增量链接所需的信息。对于设置了 Program Database for Edit and Continue选项的程序，PDB还要包含执行编辑继续功能所需的信息。 <br><br>3、使用断点 <br><br>　　断点(BreakPoint)是运行你向调试器描述环境，并让调试器设置好程序状态的一种机制。如果没有断点，只有在程序里一步一步跟踪使用调试器。在Visual C++中，你可以设置三种类型的断点：代码定位断点、数据断点和消息断点。 <br><br>四、提高调试器的查错能力 <br><br>　　尽量采用编译时刻检查而不是运行时刻检查。 <br><br>1、使用最高的编译警告级别/W4 <br><br>　 　象if(x=2)这样的语句，默认的警告级别为/W3时不显示任何信息，但改成最高警告级别/W4时则会出现&#8220;waning C4706: assignment within conditional expression&#8221;的警告。/W4能给出一些/W3所不能给的警告。 <br><br>2、在调试版本中使用/GZ编译选项 <br><br>　　/GZ选项用来发现那些在发布版本里才发现的错误，包括未被初始化的自动（局部）变量、堆栈错误、不正确的函数原型等。 <br><br>3、使用#pragma warning编译器指示 <br><br>　　你可以使用#pragma warning编译器指示来禁止整个程序、特定的头文件、特定的代码文件或是特定的某一行代码的特定警告，这看你把#pragma放在哪里。 <br><br>4、使用没有警告的编译法则/WX <br><br>　　这个编译选项把所有的警告当成错误来对待，只有在假警告被消除之后才能应用。有时编译警告可能是合理的，处理编译警告的核心是要发现错误，而不是抑制警告本身。这个法则对于大的程序开发小组来说很有帮助。最终目标是消除错误，而不是消除警告。 <br><br>五、内存空间与分配 <br><br>1、内存分配错误 <br><br>　　动态内存分配错误有两种基本类型：内存错误和内存泄漏。 <br><br>（1）内存错误 <br><br>　 　当一个指针或者该指针所指向的内存单元成为无效单元，或者内存中分配的数据结构被破坏时，就会造成内存错误。指针未被初始化，指针被初始化为一个无效地 址，指针被不小心错误地修改，在与指针相关联的内存区域被释放后使用该指针（这种指针被称为虚悬(dangling)指针），这些都会使指针变为无效指 针。当通过一个错误指针或者虚悬指针对内存进行写入，或者将指针强制转换为不匹配的数据结构，又或者是写数据越界，内存自身也会遭到破坏。删除未被初始化 的指针、删除非堆指针、多次删除同一指针或者覆盖一个指针的内部数据结构，都会造成内存分配系统错误。 <br><br>（2）内存泄漏 <br><br>　　内存泄漏在被动态分配的内存没有被释放时产生。有许多情况会导致内存泄漏，如没有在程序的全部执行路径中释放内存，没有在析构函数中释放所有的内存等。一个程序在崩溃之前可运行的时间越长，则导致崩溃的原因与内存泄漏的关系越大。 <br><br>　 　Windows会在程序结束的时候将泄漏的内存收回，因此内存泄漏是个暂时性的问题。但为什么必须消除内存泄露呢？首先，内存泄漏往往会导致系统资源的 泄漏。动态分配内存往往不仅仅代表一块存储区域，还代表了某些类型的系统资源，如文件、窗口、设备上下文、GDI对象等。其次，高质量的程序和特定的服务 器程序必须能够无限地运行下去。最后，内存泄漏往往是其他程序错误或不良编程习惯的征兆。 <br><br>　　导致内参泄漏的原因：忘记释放内存；构造函数失败；存在内存泄漏的析构函数；存在内存泄漏的异常处理程序；多个返回语句；使用错误形式的delete。 <br><br>2、关于内存的初始化 <br><br>　　在调试版本里，堆里未被初始化的内存被0xCD字节模式填充，堆里释放的内存被0xDD字节模式填充。堆栈里被初始化的内存被0xCC字节模式填充。调试版本和发布版本里，未被初始化的全局内存都被初始化为0。 <br><br>3、内存虚拟地址空间 <br><br>　　Windows使用一组固定的范围来分割进程的4GB虚拟地址空间，因此有时可通过查看指针的返回值来判断指针是否有效。 <br><br>（1）Windows2000虚拟地址空间划分 <br><br>0~0XFFFF(64KB)：不能用来检测空指针赋值（访问冲突） <br><br>0x10000(64KB)~0x7FFEFFFF(2GB-64KB)：Win32进程私有的（非保留的），用于程序代码和数据 <br><br>0x7FFF0000(2GB-64KB)~0x7FFFFFFF(2GB)：不能用来防止覆盖OS分区（访问冲突） <br><br>0x800000000(2GB)~0xFFFFFFFF(4GB)：为操作系统保留，不可访问（访问冲突） <br><br>（2）Windows2000虚拟地址空间使用 <br><br>0x00030000~0x0012FFFF：线程栈 <br><br>0x00130000~0x003FFFFF：堆（有时堆位于此处） <br><br>0x00400000~0x005FFFFF：可执行代码 <br><br>0x00600000~0x0FFFFFFF：堆（有时堆位于此处） <br><br>0x10000000~0x5FFFFFFF：App DLLs、Msvcrt.dll、Mfc42.dll <br><br>0x77000000~0xFFFFFFFF：Advapi32.dll、Comctl32.dll、Gdi32.dll、Kernel32.dll、Ntdll.dll、Rpcrt4.dll、Shell32.dll、User32.dll <br><br>其中，0x00400000是所有版本的Windows能使用的最低基地址。 <br><br>六、一些调试技术 <br><br>1、调试死循环 <br><br>　　使用Debug菜单下的Break命令。在Windows2000中，如果程序有输入请求，可以使用F12键中断程序，然后检查窗口的调用栈，或单步跟踪代码找到死循环的发生原因。 <br><br>2、用Spy++调试与消息有关的问题 <br><br>　 　调试消息的最好方案是使用Visual C++提供的Spy++工具。Spy++允许程序员查看窗口、消息、进程和线程。Spy++默认的消息输出：第 一栏显示行号。第二栏显示接受消息的句柄。第三栏中的&#8220;S&#8221;表示消息是用SendMessage发出的，&#8220;P&#8221;代表消息是由PostMessage发出 的，&#8220;R&#8221;是消息句柄的返回值。第四栏给出解码后的消息名，消息参数或返回值。 <br><br>3、非常规方法 <br><br>（1）重新编连你的应用程序 <br><br>　　当你的程序表现出异常的或意外的行为，或者Visual C++编译器因为一个内部编译器错误而失败时，最好删除工程中的Debug或Release文件夹，从头开始重新进行编连。 <br><br>（2）重新启动Visual C++ <br><br>　 　Visual C++有超强的能力，但编译器的某些特性也会引起奇怪的错误。如果你的程序表现得很奇怪，你可是试着清除所有的断点，关闭或隐藏观察窗 口，检查工程设置对话框看最近做了什么修改，直至重新启动Visual C++以便消除由于Visual C++环境引起的异常行为。 <br><br>（3）重新启动Windows <br><br>　　当你发现Windows或者其他程序表现出异常的或出人意料的行为时，就应该重新启动Windows，以消除操作系统给调试带来的干扰。</p><img src ="http://www.cppblog.com/cc/aggbug/25065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2007-05-29 14:51 <a href="http://www.cppblog.com/cc/archive/2007/05/29/25065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的内存对齐</title><link>http://www.cppblog.com/cc/archive/2006/08/01/10765.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Tue, 01 Aug 2006 08:51:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2006/08/01/10765.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/10765.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2006/08/01/10765.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/10765.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/10765.html</trackback:ping><description><![CDATA[<h2 align="center">内存对齐</h2>
  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="#000000" size="4">在我们的程序中，数据结构还有变量等等都需要占有内存，在很多系统中，它都要求内存分配的时候要对齐，这样做的好处就是可以提高访问内存的速度。<br /><br /><br />&#160;我们还是先来看一段简单的程序：<br /><br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 程序一</font></p>
  <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
    <span style="COLOR: #008080">&#160;1</span>&#160;<span style="COLOR: #000000">#include&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">&#160;2</span>&#160;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&#160;std;<br /></span><span style="COLOR: #008080">&#160;3</span>&#160;<span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">&#160;4</span>&#160;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&#160;X1<br /></span><span style="COLOR: #008080">&#160;5</span>&#160;<span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">&#160;6</span>&#160;<span style="COLOR: #000000">&#160;&#160;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&#160;i;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">4个字节</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">&#160;7</span>&#160;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&#160;&#160;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&#160;c1;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">1个字节</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">&#160;8</span>&#160;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&#160;&#160;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&#160;c2;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">1个字节</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">&#160;9</span>&#160;<span style="COLOR: #008000"></span><span style="COLOR: #000000">};<br /></span><span style="COLOR: #008080">10</span>&#160;<span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span>&#160;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&#160;X2<br /></span><span style="COLOR: #008080">12</span>&#160;<span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">13</span>&#160;<span style="COLOR: #000000">&#160;&#160;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&#160;c1;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">1个字节</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">14</span>&#160;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&#160;&#160;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&#160;i;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">4个字节</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">15</span>&#160;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&#160;&#160;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&#160;c2;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">1个字节</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">16</span>&#160;<span style="COLOR: #008000"></span><span style="COLOR: #000000">};<br /></span><span style="COLOR: #008080">17</span>&#160;<span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">18</span>&#160;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&#160;X3<br /></span><span style="COLOR: #008080">19</span>&#160;<span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">20</span>&#160;<span style="COLOR: #000000">&#160;&#160;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&#160;c1;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">1个字节</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">21</span>&#160;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&#160;&#160;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&#160;c2;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">1个字节</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">22</span>&#160;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&#160;&#160;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&#160;i;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">4个字节</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">23</span>&#160;<span style="COLOR: #008000"></span><span style="COLOR: #000000">};<br /></span><span style="COLOR: #008080">24</span>&#160;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&#160;main()<br /></span><span style="COLOR: #008080">25</span>&#160;<span style="COLOR: #000000">{&#160;&#160;&#160;<br /></span><span style="COLOR: #008080">26</span>&#160;<span style="COLOR: #000000">&#160;&#160;&#160;&#160;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">long&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">27</span>&#160;<span style="COLOR: #000000">&#160;&#160;&#160;&#160;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">float&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">28</span>&#160;<span style="COLOR: #000000">&#160;&#160;&#160;&#160;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">int&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">29</span>&#160;<span style="COLOR: #000000">&#160;&#160;&#160;&#160;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">char&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">30</span>&#160;<span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">31</span>&#160;<span style="COLOR: #000000">&#160;&#160;&#160;&#160;X1&#160;x1;<br /></span><span style="COLOR: #008080">32</span>&#160;<span style="COLOR: #000000">&#160;&#160;&#160;&#160;X2&#160;x2;<br /></span><span style="COLOR: #008080">33</span>&#160;<span style="COLOR: #000000">&#160;&#160;&#160;&#160;X3&#160;x3;<br /></span><span style="COLOR: #008080">34</span>&#160;<span style="COLOR: #000000">&#160;&#160;&#160;&#160;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">x1&#160;的大小&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(x1)</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">35</span>&#160;<span style="COLOR: #000000">&#160;&#160;&#160;&#160;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">x2&#160;的大小&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(x2)</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">36</span>&#160;<span style="COLOR: #000000">&#160;&#160;&#160;&#160;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">x3&#160;的大小&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(x3)</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">37</span>&#160;<span style="COLOR: #000000">&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">38</span>&#160;<span style="COLOR: #000000">}</span></div>
  <p>&#160;&#160;&#160;&#160;&#160;&#160;<br /><font color="#000000">&#160;&#160;&#160;&#160;&#160;&#160;<font size="4">这段程序的功能很简单，就是定义了三个结构X1,X2,X3,这三个结构的主要区别就是内存数据摆放的顺序，其他都是一样的，另外程序输入了几种基本类型所占用的字节数，以及我们这里的三个结构所占用的字节数。<br /></font></font><br /><font size="4">这段程序的运行结果为：<br /></font></p>
  <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
    <span style="COLOR: #008080">1</span>&#160;<span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">2</span>&#160;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">3</span>&#160;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">4</span>&#160;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">5</span>&#160;<span style="COLOR: #000000">x1&#160;的大小&#160;</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">6</span>&#160;<span style="COLOR: #000000">x2&#160;的大小&#160;</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">7</span>&#160;<span style="COLOR: #000000">x3&#160;的大小&#160;</span><span style="COLOR: #000000">8</span></div>
  <p>
    <br />&#160;&#160;&#160;<font size="4">&#160; </font><font color="#000000" size="4">结果的前面四行没有什么问题，但是我们在最后三行就可以看到三个结构占用的空间大小不一样，造成这个原因就是内部数据的摆放顺序，怎么会这样呢？<br /><br />&#160;&#160;&#160; 下面就是我们需要讲的内存对齐了。<br /><br />&#160;&#160;&#160; 内存是一个连续的块，我们可以用下面的图来表示,&#160; 它是以4个字节对一个对齐单位的：<br /><br /></font>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 图一<br /></p>
  <p align="center">
    <img height="301" alt="mem1.jpg" src="http://www.cppblog.com/images/cppblog_com/cc/2006_8/mem1.jpg" width="320" border="0" />
  </p>
  <p>
    <font color="#000000">
      <font size="4">&#160;&#160; 让我们看看三个结构在内存中的布局：<br /><br />&#160;&#160; 首先是 X1，如下图所示<br /></font>
    </font>
  </p>
  <p align="center">
    <img height="295" alt="mem2.jpg" src="http://www.cppblog.com/images/cppblog_com/cc/2006_8/mem2.jpg" width="399" border="0" />
  </p>
  <p>
    <br />&#160;&#160;&#160;&#160;<font color="#000000" size="4">X1 中第一个是 Int类型，它占有4字节，所以前面4格就是满了，然后第二个是char类型，这中类型只占一个字节，所以它占有了第二个4字节组块中的第一格，第三个也是char类型，所以它也占用一个字节，它就排在了第二个组块的第二格，因为它们加在一起大小也不超过一个块，所以他们三个变量在内存中的结构就是这样的，因为有内存分块对齐，所以最后出来的结果是8，而不是6，因为后面两个格子其实也算是被用了。<br /><br />&#160;&#160;&#160; 再次看看X2，如图所示<br /></font></p>
  <p align="center">
    <img height="304" alt="mem4.jpg" src="http://www.cppblog.com/images/cppblog_com/cc/2006_8/mem4.jpg" width="311" border="0" />
  </p>
  <p>&#160;&#160;&#160;&#160;<font color="#000000"><font size="4">X2中第一个类型是Char类型，它占用一个字节，所以它首先排在第一组块的第一个格子里面，第二个是Int类型，它占用4个字节，第一组块已经用掉一格，还剩3格，肯定是无法放下第二Int类型的，因为要考虑到对齐，所以不得不把它放到第二个组块，第三个类型是Char类型，跟第一个类似。所因为有内存分块对齐，我们的内存就不是8个格子了，而是12个了。<br /><br /><br />再看看X3，如下图所示：</font><br /><br /></font><br /></p>
  <p align="center">
    <img height="303" alt="mem3.jpg" src="http://www.cppblog.com/images/cppblog_com/cc/2006_8/mem3.jpg" width="401" border="0" />
  </p>
  <p>
    <font color="#000000">
      <font color="#000000" size="4">&#160;&#160;&#160;关于X3的说明其实跟X1是类似的，只不过它把两个1个字节的放到了前面，相信看了前面两种情况的说明这里也是很容易理解的。<br /><br /><br />&#160;&#160; 唉，写到这手都累了，关键是要画图，希望通过此文能让你理解内存对齐的基本概念，如果有问题，请留言。<br /><br />此文完</font>
    </font>
  </p> 
<script type="text/javascript"><!--
google_ad_client = "pub-4544529865097906";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
//2007-05-26: cpp
google_ad_channel = "3662850853";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "0000FF";
google_color_text = "000000";
google_color_url = "008000";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><img src ="http://www.cppblog.com/cc/aggbug/10765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2006-08-01 16:51 <a href="http://www.cppblog.com/cc/archive/2006/08/01/10765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三字符组(三字符序列)</title><link>http://www.cppblog.com/cc/archive/2006/07/30/10709.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Sun, 30 Jul 2006 14:15:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2006/07/30/10709.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/10709.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2006/07/30/10709.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/10709.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/10709.html</trackback:ping><description><![CDATA[<h1 style="MARGIN: auto 0cm 3.75pt; TEXT-ALIGN: center" align=center><font color=#003399><strong><span style="FONT-WEIGHT: normal; FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">三字符组</span> </strong><strong><span lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 18pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">(</span> </strong><strong><span style="FONT-WEIGHT: normal; FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">三字符序列</span> </strong><strong><span lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 18pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">)</span> </strong><span lang=EN-US style="FONT-SIZE: 18pt; mso-bidi-font-family: Arial"><o:p></o:p></span></font></h1>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 42.4pt; mso-char-indent-count: 3.03; mso-char-indent-size: 13.95pt"><font color=#000000><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; text-shadow: none">首先我们来看两段简单的程序，如果你不进行编译运行</span> <span lang=EN-US style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt; text-shadow: none">,</span> <span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; text-shadow: none">猜一猜结果分别是多少？</span> </font><span lang=EN-US style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt; text-shadow: none"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt; TEXT-ALIGN: center" align=center><strong><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; text-shadow: none">程序一<br></span></strong><strong><span lang=EN-US style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt; text-shadow: none"><o:p></o:p></span></strong></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<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></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iomanip</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000"></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></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;结果是多少&nbsp;?递增?????/</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">x;<br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">x</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&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></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000"></span></div>
&nbsp; <br><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><strong>程序二<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"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<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></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iomanip</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000"></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></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;结果是多少&nbsp;?递增?????/</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">x;<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">x</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">&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></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000"></span></div>
</strong></span><br>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">你猜出运行结果了么？现在我们就来揭示谜底，第一个程序的结果是</span><span style="FONT-SIZE: 12pt; text-shadow: none"></span><strong><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">1,</span></strong><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">第二个程序的运行结果是</span><strong><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">2</span></strong><strong><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none"></span></strong><strong><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">。</span></strong></font><strong><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">哈哈，你或许会不解吧，这里就是我们需要讲的&#8220;</span><span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">三字符组</span><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">&#8221;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none">,</span><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">也叫着&#8220;</span><strong><span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">三字符序列</span></strong><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">&#8221;。</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none">&nbsp;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; text-shadow: none">三字符序列不太常见，但</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">C++</span><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; text-shadow: none">标准允许把某些字符指定为三字符序列。三字符序列就是用于表示另一个字符的三个字符序列。以前为了表示键盘上没有的字符，这是必不可少的一种方法。</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">&nbsp;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">&nbsp;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; text-shadow: none">具体的三字符序列转义的对应关系如下表：<br></span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none"><o:p></o:p></span></p>
<div align=center>
<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-top-alt: solid green 1.5pt; mso-border-bottom-alt: solid green 1.5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: green 1.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 55.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: green 0.75pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=74>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; text-shadow: none">字符串</span></strong><strong><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none"><o:p></o:p></span></strong></p>
            </td>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: green 1.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 91.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: green 0.75pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=122>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; text-shadow: none">转义后的含义</span></strong><strong><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none"><o:p></o:p></span></strong></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 55.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid green .75pt" vAlign=top width=74>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">??=<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 91.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid green .75pt" vAlign=top width=122>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">#<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 55.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" vAlign=top width=74>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">??(<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 91.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" vAlign=top width=122>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">[<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 55.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" vAlign=top width=74>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">??)<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 91.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" vAlign=top width=122>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">]<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 55.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" vAlign=top width=74>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">??/<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 91.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" vAlign=top width=122>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">\<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 55.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" vAlign=top width=74>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">??&lt;<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 91.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" vAlign=top width=122>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">{<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 55.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" vAlign=top width=74>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">??&gt;<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 91.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" vAlign=top width=122>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">}<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 55.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" vAlign=top width=74>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">??'<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 91.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" vAlign=top width=122>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">^<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 55.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" vAlign=top width=74>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">??!<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 91.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" vAlign=top width=122>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">|<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 55.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: green 1.5pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=74>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none">??-<o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 91.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: green 1.5pt solid; BACKGROUND-COLOR: transparent" vAlign=top width=122>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; text-shadow: none">～</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-size: 10.5pt; text-shadow: none"><o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">我们现在已经基本知道什么是三字符组了，那么我们在来分析一下前面遇到的程序。</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none"><o:p></o:p></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none">&nbsp;</span><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">程序</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none">1中,</span><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">在第8行，那是一行注释，</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none">//</span><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">让后面的部分编程注释，但是问题就在这里了，</span><strong><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">??/</span></strong><span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">，</span><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">这其实就是一个三字符组了，前面两个</span><strong><span style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none"></span></strong><strong><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">??</span></strong><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none"></span><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">就意味着这里后面就会发生转义。这个程序中，&#8220;</span><strong><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">??/</span></strong><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">&#8221;就会被转义成&#8220;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">\</span><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">&#8221;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none">,<span style="mso-spacerun: yes">&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">而把这个符号放在一行的末尾就相当于将接下来的一行粘贴到这一行的末尾，所以本程序中的&#8220;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">++x</span><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">&#8221;也就成了注释的一部分，那么我们的结果是</span><strong><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">1</span></strong><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">就不足为奇了，而第二个程序的三字符组后面跟的是一行空白，所以不影响到下面的一行代码，&#8220;</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">++x</span><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">&#8221;照常执行，所以结果就是</span><strong><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">2</span></strong><strong><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">。</span></strong><strong><span lang=EN-US style="FONT-SIZE: 12pt; text-shadow: none"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><strong><span lang=EN-US style="FONT-SIZE: 12pt; text-shadow: none"><br></span></strong><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none"><br>此文完。<br>参考自《</span><span lang=EN-US style="FONT-SIZE: 12pt; text-shadow: none">Exceptional C++ style</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">中文版</span><span lang=EN-US style="FONT-SIZE: 12pt; text-shadow: none">/Herb Sutter</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">著》<br><br></span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none"><o:p></o:p></span></p>
</div><img src ="http://www.cppblog.com/cc/aggbug/10709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2006-07-30 22:15 <a href="http://www.cppblog.com/cc/archive/2006/07/30/10709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>冒号初始化列表的一个作用</title><link>http://www.cppblog.com/cc/archive/2006/07/20/10252.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Thu, 20 Jul 2006 08:46:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2006/07/20/10252.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/10252.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2006/07/20/10252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/10252.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/10252.html</trackback:ping><description><![CDATA[<h3 align="center">冒号初始化列表的一个作用</h3>
		<p align="left">   我们在创建C＋＋类的时候，如果类中有const类型的变量，那么这个值的初始化就是一个问题，可以看下面一段代码：<br /><br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">iostream</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #0000ff">using</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">namespace</span>
				<span style="COLOR: #000000"> std;<br /><br /></span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> Test<br />{<br /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">:<br />    Test(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> i)<br />    {<br />        identifier </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">;//这里错误<br />        cout</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">Hello </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">identifier</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">\n</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">;<br />    } <br />    </span>
				<span style="COLOR: #000000">~</span>
				<span style="COLOR: #000000">Test()<br />    {<br />        cout</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">Googbye </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">identifier</span>
				<span style="COLOR: #000000">&lt;&lt;</span>
				<span style="COLOR: #000000">endl;<br />    }<br /></span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000">:<br />    </span>
				<span style="COLOR: #0000ff">const</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> identifier;<br />};<br /><br /></span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> main()<br />{<br />    Test theWorld(</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">);<br />    </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">;<br />}</span>
		</div>在VC6.0下编译的时候，无法通过，编译器提示如下<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"><span style="COLOR: #000000">error C2758: </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">identifier</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> : must be initialized </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> constructor </span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">member initializer list<br />see declaration of </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">identifier</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"><br />error C2166: l</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value specifies </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">object</span></div><br />   可以看见在普通构造函数方式下是不能初始化const类型的，它是个左值。<br />   那么我们怎么解决这个问题呢？这里就是我要讲的，使用冒号初始化列表方式。<br />  再看下面的代码：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> std;<br /><br /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Test<br />{<br /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br />    Test(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i):identifier(i)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">冒号初始化列表</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    {<br />        cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">identifier</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />    } <br />    </span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Test()<br />    {<br />        cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Googbye </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">identifier</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br />    }<br /></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br />    </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> identifier;<br />};<br /><br /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main()<br />{<br />    Test theWorld(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br />}</span></div>     上面这个代码使用了冒号程序化列表，程序可以编译通过，这样我们就可以在对象创建的时候再给const类型的类变量赋值了。<br />    输出结果是：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Hello </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br />Goodbye </span><span style="COLOR: #000000">1</span></div><br />此文完。<img src ="http://www.cppblog.com/cc/aggbug/10252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2006-07-20 16:46 <a href="http://www.cppblog.com/cc/archive/2006/07/20/10252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的多态一例</title><link>http://www.cppblog.com/cc/archive/2006/07/04/9372.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Tue, 04 Jul 2006 06:08:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2006/07/04/9372.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/9372.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2006/07/04/9372.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/9372.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/9372.html</trackback:ping><description><![CDATA[<h1 style="margin: auto 0cm 3.75pt; text-align: center;" align="center">
				<font color="#003399">
						<strong>
								<span style="font-weight: normal; font-size: 18pt; font-family: 'Times New Roman';" lang="EN-US">C++</span>
						</strong>
						<strong>
								<span style="font-weight: normal; font-size: 18pt; font-family: 宋体;">中的多态一例</span>
						</strong>
						<span style="font-size: 18pt;" lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</font>
		</h1>
		<font color="#000000">
				<strong>
						<span style="font-weight: normal; font-size: 12pt; font-family: 'Times New Roman';" lang="EN-US">      C++</span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-size: 12pt; font-family: 宋体;">为我们提供了多态的功能，什么是多态呢，我的理解就是如果把指向派生类对象的指针赋值给基类指针，那么通过这个基类指针调用继承的函数的时候会根据指针指向的对象类型来动态的调用所需要的方法，这种特性就是多态了。(除了这个之外好像函数重载也是一种)<br /><br />   <span style="font-weight: normal; font-size: 12pt; font-family: 宋体;">可以先看下面一段程序：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img id="Code_Closed_Image" onclick="this.style.display='none'; Code_Closed_Text.style.display='none'; Code_Open_Image.style.display='inline'; Code_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11" /><img id="Code_Open_Image" style="display: none;" onclick="this.style.display='none'; Code_Open_Text.style.display='none'; Code_Closed_Image.style.display='inline'; Code_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11" /><span id="Code_Closed_Text" style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255);">程序代码</span><span id="Code_Open_Text" style="display: none;"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">iostream</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> std;<br /></span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Shape<br />{<br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">:<br />    </span><span style="color: rgb(0, 0, 255);">virtual</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> draw()<br />    {<br />        cout</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Draw shape</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">endl;<br />    }<br />};<br /><br /></span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Circle: </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Shape<br />{<br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">:<br />    </span><span style="color: rgb(0, 0, 255);">virtual</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> draw()<br />    {<br />        cout</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Draw Circle</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">endl;<br />    }<br />};<br /><br /></span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Triangle: </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Shape<br />{<br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">:<br />    </span><span style="color: rgb(0, 0, 255);">virtual</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> draw()<br />    {<br />        cout</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Draw Triangle</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">endl;<br />    }<br />};<br /></span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Square: </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Shape<br />{<br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">:<br />    </span><span style="color: rgb(0, 0, 255);">virtual</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> draw()<br />    {<br />        cout</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Draw Square</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">endl;<br />    }<br />};<br /><br /><br /></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> main()<br />{<br />    Shape </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">pShape </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> NULL;<br />    Circle aCircle;<br />    Triangle aTriangle;<br />    Square aSquare;<br /><br />    pShape</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">aCircle;<br />    pShape</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">draw();<br /><br />    pShape</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">aTriangle;<br />    pShape</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">draw();<br /><br />    pShape</span><span style="color: rgb(0, 0, 0);">=&amp;</span><span style="color: rgb(0, 0, 0);">aSquare;<br />    pShape</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">draw();<br />    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />}<br /></span></span></div></span></span>
				</strong>
		</font>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 28.5pt;">
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; font-family: 宋体; text-shadow: none;">程序的运行结果是</span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; text-shadow: none;" lang="EN-US">:<o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 13.5pt; text-indent: 28.5pt;">
				<strong>
						<span style="font-size: 12pt; color: blue; text-shadow: none;" lang="EN-US">Draw Circle<o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 13.45pt; text-indent: 28.55pt;">
				<strong>
						<span style="font-size: 12pt; color: blue; text-shadow: none;" lang="EN-US">Draw Triangle<o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 13.45pt; text-indent: 28.55pt;">
				<strong>
						<span style="font-size: 12pt; color: blue; text-shadow: none;" lang="EN-US">Draw Square<o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 13.45pt; text-indent: 28.45pt;">
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; font-family: 宋体; text-shadow: none;">从结果可以可以看到，输出的结果并不是</span>
				</strong>
				<strong>
						<span style="color: blue; text-shadow: none;" lang="EN-US">Draw shape</span>
				</strong>
				<strong>
						<span style="color: blue; font-family: 宋体; text-shadow: none;">。</span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; font-family: 宋体; text-shadow: none;">这个就是多态的功效所在了。它直接根据指针实际指向的类型来动态调用了执行的函数。</span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; text-shadow: none;" lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 13.45pt; text-indent: 28.45pt;">
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; font-family: 宋体; text-shadow: none;">要使用多态，必须把基类中需要使用多态功能的方法定义为</span>
				</strong>
				<strong>
						<span style="font-size: 12pt; color: blue; text-shadow: none;" lang="EN-US">virtual</span>
				</strong>
				<strong>
						<span style="font-size: 12pt; color: blue; font-family: 宋体; text-shadow: none;">，</span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; font-family: 宋体; text-shadow: none;">这样才能使用多态的强大功能。如果把基类的</span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; text-shadow: none;" lang="EN-US">draw</span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; font-family: 宋体; text-shadow: none;">方法前面的</span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; text-shadow: none;" lang="EN-US">virtual</span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; font-family: 宋体; text-shadow: none;">去掉，那么最后输出的结果将会是</span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; text-shadow: none;" lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 13.5pt; text-indent: 28.5pt;">
				<strong>
						<span style="font-size: 12pt; color: blue; text-shadow: none;" lang="EN-US">Draw Shape<o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 13.45pt; text-indent: 28.55pt;">
				<strong>
						<span style="font-size: 12pt; color: blue; text-shadow: none;" lang="EN-US">Draw Shape<o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 13.45pt; text-indent: 28.55pt;">
				<strong>
						<span style="font-size: 12pt; color: blue; text-shadow: none;" lang="EN-US">Draw Shape<o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 13.45pt; text-indent: 28.45pt;">
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; font-family: 宋体; text-shadow: none;">这说明没有使用多态,只是覆盖了。</span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; text-shadow: none;" lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 13.45pt; text-indent: 28.45pt;">
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; text-shadow: none;" lang="EN-US"> <o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 13.45pt; text-indent: 28.45pt;">
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; text-shadow: none;" lang="EN-US"> <o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 13.45pt; text-indent: 28.45pt;">
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; font-family: 宋体; text-shadow: none;">多态的好处是显然的，开发者可以利用旧代码来调用新的方法，这样软件供应商可以在不透露技术秘密的情况下发现软件包，而开发者也可以根据继承机制从软件供应商提供的类库中派生出新类，且能和旧类库一起工作。</span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; text-shadow: none;" lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 13.45pt; text-indent: 28.45pt;">
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; text-shadow: none;" lang="EN-US"> <o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 28.5pt;">
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; font-family: 宋体; text-shadow: none;">此文完。</span>
				</strong>
				<strong>
						<span style="font-weight: normal; font-size: 12pt; color: windowtext; text-shadow: none;" lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<strong>
				<span style="font-weight: normal; font-size: 12pt; font-family: 宋体;">                         <font color="#000000" size="2">参考自《高质量程序设计指南</font></span>
				<font color="#000000" size="2">
				</font>
		</strong>
		<font size="2">
				<font color="#000000">
						<strong>
								<span style="font-weight: normal; font-size: 12pt; font-family: 'Times New Roman';" lang="EN-US">C/C++</span>
						</strong>
						<strong>
								<span style="font-weight: normal; font-size: 12pt; font-family: 宋体;">语言》</span>
						</strong>
						<br />
				</font>
		</font><img src ="http://www.cppblog.com/cc/aggbug/9372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2006-07-04 14:08 <a href="http://www.cppblog.com/cc/archive/2006/07/04/9372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>少用点endl</title><link>http://www.cppblog.com/cc/archive/2006/06/27/9064.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Tue, 27 Jun 2006 08:12:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2006/06/27/9064.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/9064.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2006/06/27/9064.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/9064.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/9064.html</trackback:ping><description><![CDATA[<h4 align=center>少用点<font color=#0000ff>endl</font></h4>
<p align=center>&nbsp;</p>
<p><font color=#000000>C++给我们提供了一个换行的函数endl函数，不知道该不该叫函数，这个是在STLPort中的实现。</font> </p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #000000">_CRTIMP&nbsp;inline&nbsp;basic_ostream</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">wchar_t,&nbsp;char_traits</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">wchar_t</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">2</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;__cdecl&nbsp;endl(basic_ostream</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">wchar_t,<br></span><span style="COLOR: #008080">3</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char_traits</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">wchar_t</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;_O)<br></span><span style="COLOR: #008080">4</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{_O.put(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">5</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;_O.flush();<br></span><span style="COLOR: #008080">6</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(_O);&nbsp;}</span></div>
<br><font color=#000000>大家看到没有，它的工作其实就是输出一个<font color=#0000ff>&#8220;\n&#8221;，</font>不过后面又带了一句<br>flush()，这一句是强制刷新缓冲区的，如果每次输出都刷新缓冲区那就会影响到程序的性能，无法使用缓冲区的优点，所以使用的时候考虑是不是在很多地方需要endl，如果可以还是换成 <font color=#0000ff>&#8220;\n&#8221;</font>吧，个人观点，欢迎交流。</font> <br>
<script type="text/javascript"><!--
google_ad_client = "pub-4544529865097906";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
//2007-05-29: bluemagic
google_ad_channel = "5693877679";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "000000";
google_color_text = "000000";
google_color_url = "000000";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><img src ="http://www.cppblog.com/cc/aggbug/9064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2006-06-27 16:12 <a href="http://www.cppblog.com/cc/archive/2006/06/27/9064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单文本的复制程序</title><link>http://www.cppblog.com/cc/archive/2006/06/23/8907.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Fri, 23 Jun 2006 12:52:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2006/06/23/8907.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/8907.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2006/06/23/8907.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/8907.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/8907.html</trackback:ping><description><![CDATA[<h1 style="MARGIN: auto 0cm 3.75pt; TEXT-ALIGN: center" align="center">
				<font color="#003399">
						<strong>
								<span style="FONT-WEIGHT: normal; FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">简单文本的复制程序</span>
						</strong>
						<span lang="EN-US" style="FONT-SIZE: 18pt; mso-bidi-font-family: Arial">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</font>
		</h1>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt; text-shadow: none">
						<span style="mso-tab-count: 1">      </span>
				</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; text-shadow: none">下面是一个简单的程序，实现了比较简单的文本文件的复制。</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt; text-shadow: none">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; text-shadow: none">运行的时候只要</span>
				<b>
						<span style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt; text-shadow: none">
						</span>
				</b>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: blue; mso-bidi-font-size: 12.0pt; text-shadow: none">copyFile<span style="mso-spacerun: yes">  </span>srcFile destFile</span>
				</b>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; text-shadow: none">就可以了，这里</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt; text-shadow: none">srcFile</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; text-shadow: none">是拷贝的源文件，</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt; text-shadow: none">
						<o:p>
						</o:p>
				</span>
		</p>
		<span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">destFile</span>
		<span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">是拷贝的目标文件。<br /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"><span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt; text-shadow: none"><font face="Times New Roman">copyFile.cpp<o:p></o:p></font></span></p><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"><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><br /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> argv[])<br />{<br />    FILE </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">srcFile </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> NULL;<br />    FILE </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">destFile </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> NULL;<br />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (argc</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">)<br />    {<br />        printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">参数太少,第二个，第三个分别是 源 和 目标！</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><br />    }</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">{<br />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> ch</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br />        srcFile </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> fopen(argv[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">],</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">r</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (srcFile</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL)<br />        {<br />            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">对不起，无法打开文件%s !\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,argv[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]);<br />        } <br />        </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br />        {<br />            destFile </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">fopen(argv[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">],</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">w</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (destFile</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL)<br />            {<br />                printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">对不起，无法打开文件%s !\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,argv[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">]);<br />            } <br />            </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br />            {<br />                </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> ((ch</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">fgetc(srcFile))</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">EOF)<br />                {<br />                    fputc(ch,destFile);<br />                }<br />                printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">恭喜复制完成了啊!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />            <br />            }<br />        }<br />        <br />    }<br />    fclose(srcFile);<br />    fclose(destFile);<br />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br />}</span></div></span><img src ="http://www.cppblog.com/cc/aggbug/8907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2006-06-23 20:52 <a href="http://www.cppblog.com/cc/archive/2006/06/23/8907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三款编译器性能的简单比较</title><link>http://www.cppblog.com/cc/archive/2006/05/26/7697.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Fri, 26 May 2006 07:50:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2006/05/26/7697.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/7697.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2006/05/26/7697.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/7697.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/7697.html</trackback:ping><description><![CDATA[
		<h1 style="MARGIN: auto 0cm 3.75pt; TEXT-ALIGN: center" align="center">
				<font color="#003399">
						<strong>
								<span style="FONT-WEIGHT: normal; FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">三款编译器性能的简单比较</span>
						</strong>
						<span lang="EN-US" style="FONT-SIZE: 18pt; mso-bidi-font-family: Arial">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</font>
		</h1>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt">
				<span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; text-shadow: none">最近刚给我的<span lang="EN-US">VC6.0装上了Intel的9.0版本的编译器，觉得编译的时候好像速度比原来VC的稍微要慢一点，</span></span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none; mso-bidi-font-size: 12.0pt">于是我突然觉得无聊想用简单的方法比较一下编译器编译过的程序之间的运行速度。</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; text-shadow: none; mso-bidi-font-size: 12.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none; mso-bidi-font-size: 12.0pt">我的机器上刚好有</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; text-shadow: none; mso-bidi-font-size: 12.0pt">DEV C++,VC6.0,</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none; mso-bidi-font-size: 12.0pt">还有就是</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; text-shadow: none; mso-bidi-font-size: 12.0pt">Intel Complier9.0</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none; mso-bidi-font-size: 12.0pt">了。</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; text-shadow: none; mso-bidi-font-size: 12.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none; mso-bidi-font-size: 12.0pt">首先写了一个简单的程序：<br /></span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; text-shadow: none; mso-bidi-font-size: 12.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">
				</span>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span> <span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">time.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdlib.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000">#include </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 /></span><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main()<br /></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> beginTime </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">clock();</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获得程序开始时间</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">12</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">    printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">beginTime= %d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,beginTime);<br /></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">100000</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,i);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">输出100000行数字</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">18</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> endTime</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">clock();</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获得运算结束时间</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">20</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000">    printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">beginTime= %d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,beginTime);<br /></span><span style="COLOR: #008080">22</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">23</span> <span style="COLOR: #000000">    printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">endTime= %d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,endTime);<br /></span><span style="COLOR: #008080">24</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">25</span> <span style="COLOR: #000000">    printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">endTime-beginTime= %d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,endTime</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">beginTime);<br /></span><span style="COLOR: #008080">26</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">27</span> <span style="COLOR: #000000">    getchar();</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这一行是因为Dev C++运行的时候结果会一闪而过，用它来停住结果</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">28</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">29</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">30</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">31</span> <span style="COLOR: #000000">}<br /></span><span style="COLOR: #008080">32</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">33</span> <span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080">34</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">35</span> <span style="COLOR: #000000"></span></div>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt">
				<br />   在没有对程序进行优化的情况下<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">,</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">三种编译器编译的程序运行时间如下（单位</span><span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">:</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">毫秒）：</span><span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none"><o:p></o:p></span></p>
		<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt" cellspacing="0" cellpadding="0" border="1">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 94.95pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" valign="top" width="127">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none"><o:p></o:p></span></p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 67.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt" valign="top" width="90">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
												<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">次数</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 136.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt" valign="top" width="182">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">Dev C++(MinGW3.4.2)<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 104.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">VC6.0<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 113.15pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt" valign="top" width="151">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">Intel Complier9.0<o:p></o:p></span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 94.95pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt" width="127" rowspan="4">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
												<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">无优化运行时间</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 67.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="90">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">1<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 136.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="182">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">11786<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 104.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">10945<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 113.15pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="151">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">11186<o:p></o:p></span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 67.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="90">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">2<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 136.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="182">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">10735<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 104.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">11837<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 113.15pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="151">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">11696<o:p></o:p></span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 67.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="90">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">3<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 136.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="182">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">12768<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 104.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">10605<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 113.15pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="151">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">10635<o:p></o:p></span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 67.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="90">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
												<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">平均时间</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 136.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="182">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">11757<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 104.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">11129<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 113.15pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="151">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">11172<o:p></o:p></span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 94.95pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt" width="127" rowspan="4">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
												<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">优化后运行时间</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 67.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="90">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">1<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 136.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="182">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">11827<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 104.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">10665<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 113.15pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="151">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">10595<o:p></o:p></span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 67.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="90">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">2<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 136.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="182">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">11867<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 104.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">11806<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 113.15pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="151">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">11015<o:p></o:p></span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 67.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="90">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">3<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 136.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="182">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">10605<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 104.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">10705<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 113.15pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="151">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">10725<o:p></o:p></span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 67.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="90">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
												<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">平均时间</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 136.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="182">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">11433<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 104.35pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">11058<o:p></o:p></span>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 113.15pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="151">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">10778<o:p></o:p></span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">测试的环境是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">Windows XP Pro+P3m 1.2G 512M SDR</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">。在进行测试的时候，我尽可能把其他无关的程序都关掉，让它们在相对比较稳定的环境下进行运算，但是这样并不能保证结果没有偏差，因为计算的次数有限，最后的结果很可能由于随机出现的情况而偏差。从上面结果来看，三者的性能差距不是太大。在优化之后，速度是</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">Intel Complier9.0&gt;VC6.0&gt;MinGW3.4.2</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%">
				<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">申明</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">:</span>
				<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">以上测试存在很多不足的地方，仅仅使用了一种运算测试，其实我觉得要进行比较全面的测试才会得到比较可信的结果，本结果仅供参考。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">
						<o:p>
						</o:p>
				</span>
		</p>
<img src ="http://www.cppblog.com/cc/aggbug/7697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2006-05-26 15:50 <a href="http://www.cppblog.com/cc/archive/2006/05/26/7697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>操作指定位置的内存</title><link>http://www.cppblog.com/cc/archive/2006/05/25/7620.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Thu, 25 May 2006 02:31:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2006/05/25/7620.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/7620.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2006/05/25/7620.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/7620.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/7620.html</trackback:ping><description><![CDATA[
		<h1 style="MARGIN: auto 0cm 3.75pt; TEXT-ALIGN: center" align="center">
				<font color="#003399">
						<strong>
								<span style="FONT-WEIGHT: normal; FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt">操作指定位置的内存</span>
						</strong>
						<span lang="EN-US" style="FONT-SIZE: 18pt; mso-bidi-font-family: Arial">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</font>
		</h1>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 新宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">首先让我们看下面一个例子</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; mso-fareast-font-family: 新宋体; text-shadow: none">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">int a</span>
				<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">＝</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">100;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">int *p=&amp;a; <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">*p=200;</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; text-shadow: none">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt; LINE-HEIGHT: 150%">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 新宋体; text-shadow: none">经过上面这三条语句之后，变量<span lang="EN-US">a的值就从100改为200了，这是很显然的，因为 </span></span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 新宋体; text-shadow: none">*p </span>
				</b>
				<span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 新宋体; text-shadow: none">是解引用指针，其中变量<span lang="EN-US">p中存放的是变量a的地址，在这里是</span></span>
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 新宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">0x0012ff78，</span>
				</strong>
				<strong>
						<span style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 新宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">也就是说 </span>
				</strong>
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 新宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">*</span>
				</strong>
				<strong>
						<span style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 新宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">操作符操作的是一个地址值，那么我们可以直接用 </span>
				</strong>
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 新宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">*</span>
				</strong>
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 新宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none"> 来操作地址值么？<o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt">
				<strong>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">*0x0012ff78 =300;<o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt; LINE-HEIGHT: 150%">
				<span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">上面这条语句编译不过，因为指针解引用操作符</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none">* </span>
				<span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">之后跟的不是一个指针类型，而是一个整型的值，这样是不行的，要想实现上面的功能，必须要把该整型值转化成指针类型。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt; LINE-HEIGHT: 150%">
				<span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; text-shadow: none">我们可以这样处理</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: windowtext; text-shadow: none">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; text-shadow: none">*(int *)</span>
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: blue; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">0x0012ff78=300; //</span>
				</strong>
				<strong>
						<span style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">把整型强制转化成</span>
				</strong>
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: blue; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">int</span>
				</strong>
				<strong>
						<span style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">类型的指针</span>
				</strong>
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: blue; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt; LINE-HEIGHT: 150%">
				<strong>
						<span style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">这样</span>
				</strong>
				<strong>
						<span style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">
						</span>
				</strong>
				<strong>
						<span style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">变量</span>
				</strong>
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">a</span>
				</strong>
				<strong>
						<span style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">的值就变成</span>
				</strong>
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">300</span>
				</strong>
				<strong>
						<span style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">了。</span>
				</strong>
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt; LINE-HEIGHT: 150%">
				<strong>
						<span style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">其实上面这种用法在一般的程序设计中是很少用的，因为编译器无法帮助你把某一个特定的变量放在一个内存中指定的位置，所以无法预知它的地址。小心使用这种方式不小心有就会误操作内存中的有用的数据。</span>
				</strong>
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt; LINE-HEIGHT: 150%">
				<strong>
						<span style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">上面这种用法其实一般都是用在操作硬件方面，在一些机器上面，要想与设备控制器的进行通信，就必须通过在某个特定的内存的地址来读取和写入值。这些地址是预先已经知道的，其实这些地址也就是与硬件通信的接口。</span>
				</strong>
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt; LINE-HEIGHT: 150%">
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none"> <o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt; LINE-HEIGHT: 150%">
				<strong>
						<span style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">上面就是操作指定位置的内存的方法。</span>
				</strong>
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt; LINE-HEIGHT: 150%">
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none"> <o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt; LINE-HEIGHT: 150%">
				<strong>
						<span style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">此文完。</span>
				</strong>
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt; LINE-HEIGHT: 150%">
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none"> <o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt">
				<strong>
						<span lang="EN-US" style="FONT-WEIGHT: normal; FONT-SIZE: 12pt; COLOR: windowtext; mso-bidi-font-family: Arial; mso-bidi-font-size: 18.0pt; text-shadow: none"> <o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.65pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: windowtext; mso-bidi-font-size: 12.0pt; text-shadow: none"> <o:p></o:p></span>
		</p>
<img src ="http://www.cppblog.com/cc/aggbug/7620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2006-05-25 10:31 <a href="http://www.cppblog.com/cc/archive/2006/05/25/7620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>左值和右值</title><link>http://www.cppblog.com/cc/archive/2006/05/25/7619.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Thu, 25 May 2006 02:30:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2006/05/25/7619.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/7619.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2006/05/25/7619.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/7619.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/7619.html</trackback:ping><description><![CDATA[<h1 align=center>左值和右值 <o:p></o:p></h1>
<p>我们在看书的时候，经常可以看到关于 左值(L-value) 和 右值(R-value) 的概念，那么到底什么是左值，什么是右值，它们之间的区别又是在哪里呢？<o:p></o:p> </p>
<p>&nbsp;&nbsp;&nbsp; 通俗的讲，左值就是能够出现在赋值符号左面的东西，而右值就是那些可以出现在赋值符号右面的东西了。<o:p></o:p> </p>
<p>举个很简单的例子：<o:p></o:p> </p>
<p>a=b+100;<o:p></o:p> </p>
<p>那么这里a就是左值，b+25就是一个右值。左值和右值之间是不一定都能互换的，上面的这个例子就是不能互换的，如果写成<o:p></o:p> </p>
<p>b＋100＝a;<o:p></o:p> </p>
<p>大家都能看出来这样写会不编译通过的，因为编译器无法判断b+100的内存地址，所以不能操作。<o:p></o:p> </p>
<p>看了这个例子，可以做一个总结，左值必须应该是一个变量或者是表达式等，但是它的物理位置是可以确定的，而右值不一定,这也是它们两者之间的区别。 </p>
<p>关于左值是表达式的例子有数组，还有指针这些都可以。<o:p></o:p> </p>
<p>int array[10];<o:p></o:p> </p>
<p>int a=5;<o:p></o:p> </p>
<p>array[a+3]=10; //这里左值就是一个数组表达式了 <o:p></o:p></p>
<p>&nbsp;<o:p></o:p> </p>
<p>此文完。 <o:p></o:p></p>
<p>&nbsp;<o:p></o:p> </p>
<p style="COLOR: red">&nbsp;另外：<a id=AjaxHolder_Comments_CommentList_ctl03_NameLink target=_blank>liotta</a>朋友给了一些其他方面的提示 （左值右值翻译可能有些问题）</p>
<div style="COLOR: red">错了，没有什么左值和右值！<br>翻译害人不浅，<br>L-value中的L指的是Location，表示可寻址。The "l" in lvalue can be though of as location<br>R-value中的R指的是Read，表示可读。The "r" in rvalue can be thought of as "read" value.&nbsp;&nbsp;&nbsp;<o:p></o:p> </div><img src ="http://www.cppblog.com/cc/aggbug/7619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2006-05-25 10:30 <a href="http://www.cppblog.com/cc/archive/2006/05/25/7619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自定义求字符串长度的方法</title><link>http://www.cppblog.com/cc/archive/2006/05/08/6787.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Mon, 08 May 2006 12:38:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2006/05/08/6787.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/6787.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2006/05/08/6787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/6787.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/6787.html</trackback:ping><description><![CDATA[<h3 align=center><img height=19 src="http://www.cppblog.com/Emoticons/red_smile.gif" width=19 border=0>自定义求字符串长度的方法</h3>
<p align=left>&nbsp;&nbsp;&nbsp;<span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;如果要问你怎么样求一个字符串的长度，你估计会想到在string.h头文件中strlen(char *)函数，这个方法的确是很简单，但在这里，我们要自己写一个方法来实现，具体代码如下 </span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;length(</span> <span style="COLOR: #0000ff">char</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">s){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;len</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">while</span> <span style="COLOR: #000000">&nbsp;(&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">s</span> <span style="COLOR: #000000">++</span> <span style="COLOR: #000000">&nbsp;)&nbsp;</span> <span style="COLOR: #000000">++</span> <span style="COLOR: #000000">len;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;len;<br>}</span> </div>
<br>完。<img height=19 src="http://www.cppblog.com/Emoticons/72_72.gif" width=19 border=0> <br>
<script type="text/javascript"><!--
google_ad_client = "pub-4544529865097906";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
//2007-05-29: bluemagic
google_ad_channel = "5693877679";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "000000";
google_color_text = "000000";
google_color_url = "000000";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><img src ="http://www.cppblog.com/cc/aggbug/6787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2006-05-08 20:38 <a href="http://www.cppblog.com/cc/archive/2006/05/08/6787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struct 与union的区别 </title><link>http://www.cppblog.com/cc/archive/2006/03/20/4382.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Mon, 20 Mar 2006 09:02:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2006/03/20/4382.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/4382.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2006/03/20/4382.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/4382.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/4382.html</trackback:ping><description><![CDATA[<h1 style="MARGIN: auto 0cm 3.75pt; TEXT-ALIGN: center" align=center><font color=#003399><strong><span lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 18pt; FONT-FAMILY: 'Times New Roman'">struct </span></strong><strong><span style="FONT-WEIGHT: normal; FONT-SIZE: 18pt; FONT-FAMILY: 宋体">与</span> </strong><strong><span lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 18pt; FONT-FAMILY: 'Times New Roman'">union</span> </strong><strong><span style="FONT-WEIGHT: normal; FONT-SIZE: 18pt; FONT-FAMILY: 宋体">的区别</span> </strong><span lang=EN-US style="FONT-SIZE: 18pt"><font face=Verdana><o:p></o:p></font></span></font></h1>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><span lang=EN-US style="FONT-SIZE: 14pt; COLOR: #000000; FONT-FAMILY: 宋体">在编程的时候，经常会遇到使用一个变量处理多种数据的情况，在这种情况下，如果我们不考虑使用类，那么就可以是struct（结构）和union（联合）来进行处理。那么，这两种结构之间到底有什么不同呢？<o:p></o:p></span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><span style="COLOR: #000000">可以先看下面的一个小例子。</span><br><o:p></o:p></p>
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><span style="COLOR: rgb(0,128,128)">&nbsp;1</span> <img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: rgb(0,0,0)">#include&nbsp;</span> <span style="COLOR: rgb(0,0,0)">&lt;</span> <span style="COLOR: rgb(0,0,0)">iostream</span> <span style="COLOR: rgb(0,0,0)">&gt;</span> <span style="COLOR: rgb(0,0,0)"><br></span><span style="COLOR: rgb(0,128,128)">&nbsp;2</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: rgb(0,0,255)">using</span> <span style="COLOR: rgb(0,0,0)">&nbsp;</span> <span style="COLOR: rgb(0,0,255)">namespace</span> <span style="COLOR: rgb(0,0,0)">&nbsp;std;<br></span><span style="COLOR: rgb(0,128,128)">&nbsp;3</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top> <br></span><span style="COLOR: rgb(0,128,128)">&nbsp;4</span> <span style="COLOR: rgb(0,0,0)"><img id=Codehighlighter1_50_81_Open_Image onclick="this.style.display='none'; Codehighlighter1_50_81_Open_Text.style.display='none'; Codehighlighter1_50_81_Closed_Image.style.display='inline'; Codehighlighter1_50_81_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_50_81_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_50_81_Closed_Text.style.display='none'; Codehighlighter1_50_81_Open_Image.style.display='inline'; Codehighlighter1_50_81_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>union&nbsp;U1</span> <span id=Codehighlighter1_50_81_Closed_Text style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; DISPLAY: none; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)"><img src="http://www.cppblog.com/Images/dot.gif"> </span><span id=Codehighlighter1_50_81_Open_Text><span style="COLOR: rgb(0,0,0)">{<br></span><span style="COLOR: rgb(0,128,128)">&nbsp;5</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,0,255)">char</span> <span style="COLOR: rgb(0,0,0)">&nbsp;c;<br></span><span style="COLOR: rgb(0,128,128)">&nbsp;6</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,0,255)">int</span> <span style="COLOR: rgb(0,0,0)">&nbsp;i;<br></span><span style="COLOR: rgb(0,128,128)">&nbsp;7</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,0,255)">double</span> <span style="COLOR: rgb(0,0,0)">&nbsp;d;<br></span><span style="COLOR: rgb(0,128,128)">&nbsp;8</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">&nbsp;9</span> <span style="COLOR: rgb(0,0,0)"><img id=Codehighlighter1_92_127_Open_Image onclick="this.style.display='none'; Codehighlighter1_92_127_Open_Text.style.display='none'; Codehighlighter1_92_127_Closed_Image.style.display='inline'; Codehighlighter1_92_127_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_92_127_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_92_127_Closed_Text.style.display='none'; Codehighlighter1_92_127_Open_Image.style.display='inline'; Codehighlighter1_92_127_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>union&nbsp;U2</span> <span id=Codehighlighter1_92_127_Closed_Text style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; DISPLAY: none; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)"><img src="http://www.cppblog.com/Images/dot.gif"> </span><span id=Codehighlighter1_92_127_Open_Text><span style="COLOR: rgb(0,0,0)">{<br></span><span style="COLOR: rgb(0,128,128)">10</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,0,255)">char</span> <span style="COLOR: rgb(0,0,0)">&nbsp;c;<br></span><span style="COLOR: rgb(0,128,128)">11</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,128,0)">//</span> <span style="COLOR: rgb(0,128,0)">int&nbsp;i;<br></span><span style="COLOR: rgb(0,128,128)">12</span> <span style="COLOR: rgb(0,128,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,128,0)">//</span> <span style="COLOR: rgb(0,128,0)">double&nbsp;d;</span> <span style="COLOR: rgb(0,128,0)"><br></span><span style="COLOR: rgb(0,128,128)">13</span> <span style="COLOR: rgb(0,128,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top> </span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">14</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top> <br></span><span style="COLOR: rgb(0,128,128)">15</span> <span style="COLOR: rgb(0,0,0)"><img id=Codehighlighter1_139_172_Open_Image onclick="this.style.display='none'; Codehighlighter1_139_172_Open_Text.style.display='none'; Codehighlighter1_139_172_Closed_Image.style.display='inline'; Codehighlighter1_139_172_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_139_172_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_139_172_Closed_Text.style.display='none'; Codehighlighter1_139_172_Open_Image.style.display='inline'; Codehighlighter1_139_172_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>union&nbsp;U3</span> <span id=Codehighlighter1_139_172_Closed_Text style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; DISPLAY: none; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)"><img src="http://www.cppblog.com/Images/dot.gif"> </span><span id=Codehighlighter1_139_172_Open_Text><span style="COLOR: rgb(0,0,0)">{<br></span><span style="COLOR: rgb(0,128,128)">16</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,0,255)">char</span> <span style="COLOR: rgb(0,0,0)">&nbsp;c;<br></span><span style="COLOR: rgb(0,128,128)">17</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,0,255)">int</span> <span style="COLOR: rgb(0,0,0)">&nbsp;i;<br></span><span style="COLOR: rgb(0,128,128)">18</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,128,0)">//</span> <span style="COLOR: rgb(0,128,0)">double&nbsp;d;</span> <span style="COLOR: rgb(0,128,0)"><br></span><span style="COLOR: rgb(0,128,128)">19</span> <span style="COLOR: rgb(0,128,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top> </span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">20</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top> <br></span><span style="COLOR: rgb(0,128,128)">21</span> <span style="COLOR: rgb(0,0,0)"><img id=Codehighlighter1_185_216_Open_Image onclick="this.style.display='none'; Codehighlighter1_185_216_Open_Text.style.display='none'; Codehighlighter1_185_216_Closed_Image.style.display='inline'; Codehighlighter1_185_216_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_185_216_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_185_216_Closed_Text.style.display='none'; Codehighlighter1_185_216_Open_Image.style.display='inline'; Codehighlighter1_185_216_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top> </span><span style="COLOR: rgb(0,0,255)">struct</span> <span style="COLOR: rgb(0,0,0)">&nbsp;S1</span> <span id=Codehighlighter1_185_216_Closed_Text style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; DISPLAY: none; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)"><img src="http://www.cppblog.com/Images/dot.gif"> </span><span id=Codehighlighter1_185_216_Open_Text><span style="COLOR: rgb(0,0,0)">{<br></span><span style="COLOR: rgb(0,128,128)">22</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,0,255)">char</span> <span style="COLOR: rgb(0,0,0)">&nbsp;c;<br></span><span style="COLOR: rgb(0,128,128)">23</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,0,255)">int</span> <span style="COLOR: rgb(0,0,0)">&nbsp;i;<br></span><span style="COLOR: rgb(0,128,128)">24</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,0,255)">double</span> <span style="COLOR: rgb(0,0,0)">&nbsp;d;<br></span><span style="COLOR: rgb(0,128,128)">25</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">26</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top> <br></span><span style="COLOR: rgb(0,128,128)">27</span> <span style="COLOR: rgb(0,0,0)"><img id=Codehighlighter1_229_262_Open_Image onclick="this.style.display='none'; Codehighlighter1_229_262_Open_Text.style.display='none'; Codehighlighter1_229_262_Closed_Image.style.display='inline'; Codehighlighter1_229_262_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_229_262_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_229_262_Closed_Text.style.display='none'; Codehighlighter1_229_262_Open_Image.style.display='inline'; Codehighlighter1_229_262_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top> </span><span style="COLOR: rgb(0,0,255)">struct</span> <span style="COLOR: rgb(0,0,0)">&nbsp;S2</span> <span id=Codehighlighter1_229_262_Closed_Text style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; DISPLAY: none; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)"><img src="http://www.cppblog.com/Images/dot.gif"> </span><span id=Codehighlighter1_229_262_Open_Text><span style="COLOR: rgb(0,0,0)">{<br></span><span style="COLOR: rgb(0,128,128)">28</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,0,255)">char</span> <span style="COLOR: rgb(0,0,0)">&nbsp;c;<br></span><span style="COLOR: rgb(0,128,128)">29</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,0,255)">int</span> <span style="COLOR: rgb(0,0,0)">&nbsp;i;<br></span><span style="COLOR: rgb(0,128,128)">30</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,128,0)">//</span> <span style="COLOR: rgb(0,128,0)">double&nbsp;d;</span> <span style="COLOR: rgb(0,128,0)"><br></span><span style="COLOR: rgb(0,128,128)">31</span> <span style="COLOR: rgb(0,128,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top> </span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">32</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top> <br></span><span style="COLOR: rgb(0,128,128)">33</span> <span style="COLOR: rgb(0,0,0)"><img id=Codehighlighter1_276_1229_Open_Image onclick="this.style.display='none'; Codehighlighter1_276_1229_Open_Text.style.display='none'; Codehighlighter1_276_1229_Closed_Image.style.display='inline'; Codehighlighter1_276_1229_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_276_1229_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_276_1229_Closed_Text.style.display='none'; Codehighlighter1_276_1229_Open_Image.style.display='inline'; Codehighlighter1_276_1229_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top> </span><span style="COLOR: rgb(0,0,255)">int</span> <span style="COLOR: rgb(0,0,0)">&nbsp;main()</span> <span id=Codehighlighter1_276_1229_Closed_Text style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; DISPLAY: none; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)"><img src="http://www.cppblog.com/Images/dot.gif"> </span><span id=Codehighlighter1_276_1229_Open_Text><span style="COLOR: rgb(0,0,0)">{<br></span><span style="COLOR: rgb(0,128,128)">34</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">U1's&nbsp;size&nbsp;=</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,255)">sizeof</span> <span style="COLOR: rgb(0,0,0)">(U1)</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">35</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">U2's&nbsp;size&nbsp;=</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,255)">sizeof</span> <span style="COLOR: rgb(0,0,0)">(U2)</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">36</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">U3's&nbsp;size&nbsp;=</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,255)">sizeof</span> <span style="COLOR: rgb(0,0,0)">(U3)</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">37</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">38</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">--------------------------------</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">39</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">S1's&nbsp;size&nbsp;=</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,255)">sizeof</span> <span style="COLOR: rgb(0,0,0)">(S1)</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">40</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">其中</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,255)">sizeof</span> <span style="COLOR: rgb(0,0,0)">(</span> <span style="COLOR: rgb(0,0,255)">char</span> <span style="COLOR: rgb(0,0,0)">)</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">+</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,255)">sizeof</span> <span style="COLOR: rgb(0,0,0)">(</span> <span style="COLOR: rgb(0,0,255)">int</span> <span style="COLOR: rgb(0,0,0)">)</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">+</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,255)">sizeof</span> <span style="COLOR: rgb(0,0,0)">(</span> <span style="COLOR: rgb(0,0,255)">double</span> <span style="COLOR: rgb(0,0,0)">)</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">=</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,255)">sizeof</span> <span style="COLOR: rgb(0,0,0)">(</span> <span style="COLOR: rgb(0,0,255)">char</span> <span style="COLOR: rgb(0,0,0)">)</span> <span style="COLOR: rgb(0,0,0)">+</span> <span style="COLOR: rgb(0,0,255)">sizeof</span> <span style="COLOR: rgb(0,0,0)">(</span> <span style="COLOR: rgb(0,0,255)">int</span> <span style="COLOR: rgb(0,0,0)">)</span> <span style="COLOR: rgb(0,0,0)">+</span> <span style="COLOR: rgb(0,0,255)">sizeof</span> <span style="COLOR: rgb(0,0,0)">(</span> <span style="COLOR: rgb(0,0,255)">double</span> <span style="COLOR: rgb(0,0,0)">)</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">41</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">----------</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">42</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">S2's&nbsp;size&nbsp;=</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,255)">sizeof</span> <span style="COLOR: rgb(0,0,0)">(S2)</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">43</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">其中</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,255)">sizeof</span> <span style="COLOR: rgb(0,0,0)">(</span> <span style="COLOR: rgb(0,0,255)">char</span> <span style="COLOR: rgb(0,0,0)">)</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">+</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,255)">sizeof</span> <span style="COLOR: rgb(0,0,0)">(</span> <span style="COLOR: rgb(0,0,255)">int</span> <span style="COLOR: rgb(0,0,0)">)</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">=</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,255)">sizeof</span> <span style="COLOR: rgb(0,0,0)">(</span> <span style="COLOR: rgb(0,0,255)">char</span> <span style="COLOR: rgb(0,0,0)">)</span> <span style="COLOR: rgb(0,0,0)">+</span> <span style="COLOR: rgb(0,0,255)">sizeof</span> <span style="COLOR: rgb(0,0,0)">(</span> <span style="COLOR: rgb(0,0,255)">int</span> <span style="COLOR: rgb(0,0,0)">)</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">44</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">--------------------------------</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">45</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;S1&nbsp;s;<br></span><span style="COLOR: rgb(0,128,128)">46</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;s.c</span> <span style="COLOR: rgb(0,0,0)">=</span> <span style="COLOR: rgb(0,0,0)">'</span> <span style="COLOR: rgb(0,0,0)">A</span> <span style="COLOR: rgb(0,0,0)">'</span> <span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">47</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">1&nbsp;s.c&nbsp;=&nbsp;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">s.c</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">48</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;s.d</span> <span style="COLOR: rgb(0,0,0)">=</span> <span style="COLOR: rgb(0,0,0)">23.2132</span> <span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">49</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">1&nbsp;s.d&nbsp;=&nbsp;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">s.d</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">50</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top> <br></span><span style="COLOR: rgb(0,128,128)">51</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">2&nbsp;s.c&nbsp;=&nbsp;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">s.c</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">52</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">2&nbsp;s.d&nbsp;=&nbsp;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">s.d</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">53</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">-----------------------&nbsp;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">54</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;U1&nbsp;u;<br></span><span style="COLOR: rgb(0,128,128)">55</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.c</span> <span style="COLOR: rgb(0,0,0)">=</span> <span style="COLOR: rgb(0,0,0)">'</span> <span style="COLOR: rgb(0,0,0)">A</span> <span style="COLOR: rgb(0,0,0)">'</span> <span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">56</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">1&nbsp;u.c&nbsp;=&nbsp;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">u.c</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">57</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: rgb(0,128,128)">58</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.i</span> <span style="COLOR: rgb(0,0,0)">=</span> <span style="COLOR: rgb(0,0,0)">23322</span> <span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">59</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">1&nbsp;u.i&nbsp;=&nbsp;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">u.i</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">60</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top> <br></span><span style="COLOR: rgb(0,128,128)">61</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.d</span> <span style="COLOR: rgb(0,0,0)">=</span> <span style="COLOR: rgb(0,0,0)">23.2132</span> <span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">62</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">1&nbsp;u.d&nbsp;=&nbsp;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">u.d</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">63</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">2&nbsp;u.c&nbsp;=&nbsp;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">u.c</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">64</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">2&nbsp;u.i&nbsp;=&nbsp;</span> <span style="COLOR: rgb(0,0,0)">"</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">u.i</span> <span style="COLOR: rgb(0,0,0)">&lt;&lt;</span> <span style="COLOR: rgb(0,0,0)">endl;<br></span><span style="COLOR: rgb(0,128,128)">65</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: rgb(0,0,255)">return</span> <span style="COLOR: rgb(0,0,0)">&nbsp;</span> <span style="COLOR: rgb(0,0,0)">0</span> <span style="COLOR: rgb(0,0,0)">;<br></span><span style="COLOR: rgb(0,128,128)">66</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span> </span><span style="COLOR: rgb(0,0,0)"><br></span><span style="COLOR: rgb(0,128,128)">67</span> <span style="COLOR: rgb(0,0,0)"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top> </span></div>
<br>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; text-shadow: none">输出结果为：<span lang=EN-US><o:p></o:p></span></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">U1's size =8<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">U2's size =1<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">U3's size =4<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">&nbsp;<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">--------------------------------<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">S1's size =16<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span style="FONT-FAMILY: 新宋体; text-shadow: none">其中<span lang=EN-US> 1+4+8=13<o:p></o:p></span></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">----------<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">S2's size =8<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span style="FONT-FAMILY: 新宋体; text-shadow: none">其中<span lang=EN-US> 1+4=5<o:p></o:p></span></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">--------------------------------<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">1 s.c = A<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">1 s.d = 23.2132<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">2 s.c = A<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">2 s.d = 23.2132<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">-----------------------<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">1 u.c = A<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">1 u.i = 23322<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">1 u.d = 23.2132<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none">2 u.c =<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><span lang=EN-US style="FONT-FAMILY: 新宋体; text-shadow: none"><font color=#000000>2 u.i = 1181975000<br><br></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; text-shadow: none">解释：</span> <span lang=EN-US style="FONT-SIZE: 14pt; text-shadow: none"><o:p></o:p></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><font color=#000000><span lang=EN-US style="FONT-SIZE: 14pt; text-shadow: none"><font face="Times New Roman">struct</font> </span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; text-shadow: none">类型的内存分配是结合内部的所有变量大小和相关的，但不是简单的相加，从上面的例子就可以看出来，</span> <span lang=EN-US style="FONT-SIZE: 14pt; text-shadow: none"><font face="Times New Roman">struct</font> </span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; text-shadow: none">类型的分配的内存大小是应该内部最大数据类型的整数倍，不足一倍的部分会自动补全成一倍大小,应该是编译器为了数据整齐，处理速度会快些把。</span> <span lang=EN-US style="FONT-SIZE: 14pt; text-shadow: none"><font face="Times New Roman">union</font> </span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; text-shadow: none">类型的内存分配，只是和联合体内的最大的一个数据类型的大小相关，而且</span> <span lang=EN-US style="FONT-SIZE: 14pt; text-shadow: none"><font face="Times New Roman">union</font> </span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; text-shadow: none">内的所有数据都在一个单独的内存空间里面。这些就是上面程序出现这样的结果的原因。</span> <br><span lang=EN-US style="FONT-SIZE: 14pt; text-shadow: none"><o:p></o:p></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt">
<font color=#000000><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; text-shadow: none"><br>&nbsp;&nbsp;&nbsp;所以，</span> <span lang=EN-US style="FONT-SIZE: 14pt; text-shadow: none"><font face="Times New Roman">u.c</font> </span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; text-shadow: none">的值是</span> <span lang=EN-US style="FONT-SIZE: 14pt; text-shadow: none"><font face="Times New Roman">A</font> </span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; text-shadow: none">，当给联合体内的其他变量赋值之后，</span> <span lang=EN-US style="FONT-SIZE: 14pt; text-shadow: none"><font face="Times New Roman">u.c</font> </span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; text-shadow: none">的值就是一个无用的信息。同样，</span> <span lang=EN-US style="FONT-SIZE: 14pt; text-shadow: none"><font face="Times New Roman">u.i</font> </span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; text-shadow: none">的值最初是</span> <span lang=EN-US style="FONT-SIZE: 14pt; text-shadow: none"><font face="Times New Roman">23322</font> </span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; text-shadow: none">，当给</span> <span lang=EN-US style="FONT-SIZE: 14pt; text-shadow: none"><font face="Times New Roman">u.d</font> </span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; text-shadow: none">赋值</span> <strong><span lang=EN-US style="FONT-SIZE: 14pt; COLOR: windowtext; FONT-FAMILY: 新宋体; text-shadow: none">23.2132</span> </strong><span style="FONT-SIZE: 12pt; COLOR: windowtext; FONT-FAMILY: 新宋体; text-shadow: none">之后，</span> <span lang=EN-US style="FONT-SIZE: 14pt; text-shadow: none"><font face="Times New Roman">u.i</font> </span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; text-shadow: none">的值就变得无用了。</span> <span lang=EN-US style="FONT-SIZE: 14pt; text-shadow: none"><o:p></o:p></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.5pt"><br><span lang=EN-US style="FONT-FAMILY: 宋体"><o:p></o:p></span></p><img src ="http://www.cppblog.com/cc/aggbug/4382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2006-03-20 17:02 <a href="http://www.cppblog.com/cc/archive/2006/03/20/4382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常量指针 和 指针常量</title><link>http://www.cppblog.com/cc/archive/2006/03/12/4045.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Sun, 12 Mar 2006 05:41:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2006/03/12/4045.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/4045.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2006/03/12/4045.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/4045.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/4045.html</trackback:ping><description><![CDATA[<P align=center></P>
<P align=center></P>
<P align=center>常量指针 和 指针常量<BR></P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT style="BACKGROUND-COLOR: #0000ff"><FONT style="BACKGROUND-COLOR: #ffffff">2006年3月12日&nbsp;&nbsp; 植树节</FONT><BR></FONT>
<P>&nbsp;&nbsp;&nbsp;<FONT color=#000000>&nbsp;&nbsp;&nbsp;在C＋＋的学习中，有人经常搞不清楚“常量指针”和“指针常量”这两个概念。其实简单一点讲，“常量指针”所指向的地址上的数据是常量，而“指针常量”所指向的地址是常量，地址上面的数据是可以变化的。<BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; 下面看及格简单的例子，可以说明他们的区别:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第一个</FONT></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">&nbsp;1</SPAN>&nbsp;<SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(){<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN>&nbsp;<SPAN style="COLOR: #000000">&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">str1</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Hello</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">};<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN>&nbsp;<SPAN style="COLOR: #000000">&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">str2</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Hello&nbsp;World</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">};<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN>&nbsp;<SPAN style="COLOR: #000000">&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">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">const</SPAN><SPAN style="COLOR: #000000">&nbsp;ptr1&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">str1&nbsp;;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">指针常量－－指针本身是常量，指向的地址不可以变化,但是指向的地址所对应的内容可以变化</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ptr1&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">str2;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">错误&nbsp;因为这是一个常量指针，改变指向的地址了</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">%s&nbsp;\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">ptr1);<BR></SPAN><SPAN style="COLOR: #008080">10</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN>&nbsp;<SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">12</SPAN>&nbsp;<SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">13</SPAN>&nbsp;<SPAN style="COLOR: #000000"></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;编译错误&nbsp;&nbsp;&nbsp;&nbsp;error&nbsp;C3892:&nbsp;'ptr1'&nbsp;:&nbsp;you&nbsp;cannot&nbsp;assign&nbsp;to&nbsp;a&nbsp;variable&nbsp;that&nbsp;is&nbsp;const&nbsp;&nbsp;&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">14</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN></DIV>
<P><BR></>第二个<BR></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">&nbsp;1</SPAN>&nbsp;<SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(){<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN>&nbsp;<SPAN style="COLOR: #000000">&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">str1</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Hello</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">};<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN>&nbsp;<SPAN style="COLOR: #000000">&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">str2</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Hello&nbsp;World</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">};<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN>&nbsp;<SPAN style="COLOR: #000000">&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">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">const</SPAN><SPAN style="COLOR: #000000">&nbsp;ptr1&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">str1&nbsp;;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">指针常量－－指针本身是常量，指向的地址不可以变化,但是指向的地址所对应的内容可以变化</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">ptr1&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">A</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;正确&nbsp;因为指向的地址的内容是可以变化的</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">%c&nbsp;\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">ptr1);<BR></SPAN><SPAN style="COLOR: #008080">10</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN>&nbsp;<SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">12</SPAN>&nbsp;<SPAN style="COLOR: #000000"></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">输出&nbsp;&nbsp;A<BR></SPAN><SPAN style="COLOR: #008080">13</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN></DIV>
<P>第三个<BR></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">&nbsp;1</SPAN>&nbsp;<SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(){<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN>&nbsp;<SPAN style="COLOR: #000000">&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">str1</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Hello</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">};<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN>&nbsp;<SPAN style="COLOR: #000000">&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">str2</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Hello&nbsp;World</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">};<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN>&nbsp;<SPAN style="COLOR: #000000">&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">ptr1&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;str1;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">常量指针－－指向字符串常量，所指向的字符串内容不能变，但是指向的地址可以变化</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ptr1</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">str2;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;正确&nbsp;因为指向的地址是可以变化的</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">%s&nbsp;\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,ptr1);<BR></SPAN><SPAN style="COLOR: #008080">10</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN>&nbsp;<SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">12</SPAN>&nbsp;<SPAN style="COLOR: #000000"></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">输出&nbsp;Hello&nbsp;World</SPAN></DIV>
<P>第四个<BR></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">&nbsp;1</SPAN>&nbsp;<SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(){<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN>&nbsp;<SPAN style="COLOR: #000000">&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">str1</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Hello</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">};<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN>&nbsp;<SPAN style="COLOR: #000000">&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">str2</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">{</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Hello&nbsp;World</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">};<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN>&nbsp;<SPAN style="COLOR: #000000">&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">ptr1&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;str2;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">常量指针－－指向字符串常量，所指向的字符串内容不能变，但是指向的地址可以变化</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ptr1</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">A</SPAN><SPAN style="COLOR: #000000">'</SPAN><SPAN style="COLOR: #000000">;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;错误&nbsp;因为指向的地址是内容是不可以变化的</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">%c&nbsp;\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,ptr1);<BR></SPAN><SPAN style="COLOR: #008080">10</SPAN>&nbsp;<SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN>&nbsp;<SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">12</SPAN>&nbsp;<SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">13</SPAN>&nbsp;<SPAN style="COLOR: #000000"></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">编译错误&nbsp;&nbsp;&nbsp;&nbsp;error&nbsp;C2440:&nbsp;'='&nbsp;:&nbsp;cannot&nbsp;convert&nbsp;from&nbsp;'char'&nbsp;to&nbsp;'const&nbsp;char&nbsp;*'<BR></SPAN><SPAN style="COLOR: #008080">14</SPAN>&nbsp;<SPAN style="COLOR: #008000"></SPAN></DIV>
<P><FONT color=#000000>相信从上面四个简单的例子可以看出他们不一样的地方把，在这里要请大家注意一下的地方是：<BR><BR>指针常量的申明：const 放在* 和指针名之间&nbsp;Type * const&nbsp;pointer ;<BR><BR>常量指针的申明：const放在类型说明符之前 const Type&nbsp;*pointer ;</FONT></P><img src ="http://www.cppblog.com/cc/aggbug/4045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2006-03-12 13:41 <a href="http://www.cppblog.com/cc/archive/2006/03/12/4045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用C输出余弦曲线</title><link>http://www.cppblog.com/cc/archive/2006/01/14/2730.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Sat, 14 Jan 2006 11:50:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2006/01/14/2730.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/2730.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2006/01/14/2730.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/2730.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/2730.html</trackback:ping><description><![CDATA[<H2 align=center>&nbsp;用C输出余弦曲线<BR></H2>
<P><FONT size=5>整个代码如下:<BR></FONT></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">&nbsp;1</SPAN><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">#include&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">stdio.h</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>#include&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">math.h</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">using&nbsp;namespace&nbsp;std;</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN><SPAN style="COLOR: #008000"><IMG id=Codehighlighter1_75_245_Open_Image onclick="this.style.display='none'; Codehighlighter1_75_245_Open_Text.style.display='none'; Codehighlighter1_75_245_Closed_Image.style.display='inline'; Codehighlighter1_75_245_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_75_245_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_75_245_Closed_Text.style.display='none'; Codehighlighter1_75_245_Open_Image.style.display='inline'; Codehighlighter1_75_245_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;printZB()</SPAN><SPAN id=Codehighlighter1_75_245_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.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_75_245_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">-1.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.0\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">------------------------------------|----------------------------------&gt;\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">10</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_274_400_Open_Image onclick="this.style.display='none'; Codehighlighter1_274_400_Open_Text.style.display='none'; Codehighlighter1_274_400_Closed_Image.style.display='inline'; Codehighlighter1_274_400_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_274_400_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_274_400_Closed_Text.style.display='none'; Codehighlighter1_274_400_Open_Image.style.display='inline'; Codehighlighter1_274_400_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;printCos(</SPAN><SPAN style="COLOR: #0000ff">float</SPAN><SPAN style="COLOR: #000000">&nbsp;angle)</SPAN><SPAN id=Codehighlighter1_274_400_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.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_274_400_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;blanks,postion;<BR></SPAN><SPAN style="COLOR: #008080">12</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;postion&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;cos(angle)</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">35</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">35</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">13</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(blanks</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;blanks</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">postion;blanks</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)<BR></SPAN><SPAN style="COLOR: #008080">14</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">15</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">*\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">16</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">17</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">18</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">19</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;main()<BR></SPAN><SPAN style="COLOR: #008080">20</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_414_587_Open_Image onclick="this.style.display='none'; Codehighlighter1_414_587_Open_Text.style.display='none'; Codehighlighter1_414_587_Closed_Image.style.display='inline'; Codehighlighter1_414_587_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_414_587_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_414_587_Closed_Text.style.display='none'; Codehighlighter1_414_587_Open_Image.style.display='inline'; Codehighlighter1_414_587_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_414_587_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.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_414_587_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">21</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printZB();<BR></SPAN><SPAN style="COLOR: #008080">22</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">float</SPAN><SPAN style="COLOR: #000000">&nbsp;angle;<BR></SPAN><SPAN style="COLOR: #008080">23</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">const</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">float</SPAN><SPAN style="COLOR: #000000">&nbsp;anglestep</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0.22</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">24</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">const</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">float</SPAN><SPAN style="COLOR: #000000">&nbsp;limit&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">9.42478</SPAN><SPAN style="COLOR: #000000">;<BR></SPAN><SPAN style="COLOR: #008080">25</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(angle</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">0.0</SPAN><SPAN style="COLOR: #000000">;angle</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">limit;angle</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">anglestep)<BR></SPAN><SPAN style="COLOR: #008080">26</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printCos(angle);<BR></SPAN><SPAN style="COLOR: #008080">27</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;getchar();<BR></SPAN><SPAN style="COLOR: #008080">28</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&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></SPAN><SPAN style="COLOR: #008080">29</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">30</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN></DIV><img src ="http://www.cppblog.com/cc/aggbug/2730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2006-01-14 19:50 <a href="http://www.cppblog.com/cc/archive/2006/01/14/2730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dev-c++和VC2005中编译同一个程序出现的问题</title><link>http://www.cppblog.com/cc/archive/2005/12/30/2292.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Fri, 30 Dec 2005 10:22:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2005/12/30/2292.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/2292.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2005/12/30/2292.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/2292.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/2292.html</trackback:ping><description><![CDATA[<H3 align=center><FONT color=#000000>Dev-c++和VC2005中编译同一个程序出现的问题<BR></FONT></H3>
<P><FONT color=#000000></FONT>
<P><FONT color=#000000><FONT size=4>&nbsp;&nbsp;&nbsp;有两段程序，其实应该是一段程序，只是稍微有点不同。程序<BR><BR>的主要目的很简单，就是要输出1－25的平方根和平方。</FONT><BR><BR>&nbsp;&nbsp;&nbsp;第一段在Dev-C++中编译通过的，就叫程序一：</FONT></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">&nbsp;1</SPAN><IMG src="http://www.cppblog.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></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>#include&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">math.h</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.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></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_69_200_Open_Image onclick="this.style.display='none'; Codehighlighter1_69_200_Open_Text.style.display='none'; Codehighlighter1_69_200_Closed_Image.style.display='inline'; Codehighlighter1_69_200_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_69_200_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_69_200_Closed_Text.style.display='none'; Codehighlighter1_69_200_Open_Image.style.display='inline'; Codehighlighter1_69_200_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;main()</SPAN><SPAN id=Codehighlighter1_69_200_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.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_69_200_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">N&nbsp;&nbsp;&nbsp;&nbsp;平方根&nbsp;&nbsp;&nbsp;&nbsp;平方</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">endl;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_119_173_Open_Image onclick="this.style.display='none'; Codehighlighter1_119_173_Open_Text.style.display='none'; Codehighlighter1_119_173_Closed_Image.style.display='inline'; Codehighlighter1_119_173_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_119_173_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_119_173_Closed_Text.style.display='none'; Codehighlighter1_119_173_Open_Image.style.display='inline'; Codehighlighter1_119_173_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;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">25</SPAN><SPAN style="COLOR: #000000">;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)</SPAN><SPAN id=Codehighlighter1_119_173_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.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_119_173_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\t</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">sqrt(i)</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\t</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">pow(i,</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">)</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">endl;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getchar();<BR></SPAN><SPAN style="COLOR: #008080">10</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&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></SPAN><SPAN style="COLOR: #008080">11</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">12</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN></DIV><BR>&nbsp;&nbsp;<FONT color=#000000>&nbsp;第二段在VC2005中编译通过的，就叫程序二：</FONT><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"><SPAN style="COLOR: #008080">&nbsp;1</SPAN><IMG src="http://www.cppblog.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></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>#include&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">math.h</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.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></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_69_220_Open_Image onclick="this.style.display='none'; Codehighlighter1_69_220_Open_Text.style.display='none'; Codehighlighter1_69_220_Closed_Image.style.display='inline'; Codehighlighter1_69_220_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_69_220_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_69_220_Closed_Text.style.display='none'; Codehighlighter1_69_220_Open_Image.style.display='inline'; Codehighlighter1_69_220_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;main()</SPAN><SPAN id=Codehighlighter1_69_220_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.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_69_220_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">N&nbsp;&nbsp;&nbsp;&nbsp;平方根&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;平方</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">endl;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_120_193_Open_Image onclick="this.style.display='none'; Codehighlighter1_120_193_Open_Text.style.display='none'; Codehighlighter1_120_193_Closed_Image.style.display='inline'; Codehighlighter1_120_193_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_120_193_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_120_193_Closed_Text.style.display='none'; Codehighlighter1_120_193_Open_Image.style.display='inline'; Codehighlighter1_120_193_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;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">25</SPAN><SPAN style="COLOR: #000000">;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)</SPAN><SPAN id=Codehighlighter1_120_193_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.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_120_193_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\t</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">sqrt((</SPAN><SPAN style="COLOR: #0000ff">double</SPAN><SPAN style="COLOR: #000000">)i)</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">\t\t</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">pow((</SPAN><SPAN style="COLOR: #0000ff">double</SPAN><SPAN style="COLOR: #000000">)i,</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">)</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">endl;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getchar();<BR></SPAN><SPAN style="COLOR: #008080">10</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&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></SPAN><SPAN style="COLOR: #008080">11</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">12</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN></DIV>&nbsp;<FONT color=#000000>&nbsp;&nbsp;两段程序的主要区别就是sqrt和pow函数中的参数类型。<BR><BR>&nbsp;</FONT><FONT color=#000000><STRONG>&nbsp;&nbsp;现象：<BR></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程序一在Dev-C++中可以轻易编译通过，程序二在Dev-C++中也可以轻易编译通过。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程序一在VC2005中无法编译通过，程序二是可以的，程序一在VC2005中编译的时候会提示以下错误。<BR>&nbsp;&nbsp; <STRONG>错误如下：</STRONG><BR></FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#0000ff>Error&nbsp;1&nbsp;error C2668: 'sqrt' : ambiguous call to overloaded function&nbsp;e:\C\vc2005\2\p7\p7\3.cpp&nbsp;7<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Error&nbsp;2&nbsp;error C2668: 'pow' : ambiguous call to overloaded function&nbsp;e:\C\vc2005\2\p7\p7\3.cpp&nbsp;7<BR><BR>&nbsp;&nbsp;&nbsp;</FONT><FONT color=#000000> </FONT><FONT color=#000000><STRONG>在Dev-C++中的math.h中，这两个数学函数的原型是<BR></STRONG>_CRTIMP&nbsp;double __cdecl pow (double, double);<BR>_CRTIMP double __cdecl sqrt (double);<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; <STRONG>在VC2005中的math.h中，这两个数学函数的原型是</STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp; __cdecl pow<FONT color=#0000ff>(__in</FONT> double _X, <FONT color=#0000ff>__in</FONT> double _Y);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double&nbsp; __cdecl sqrt (<FONT color=#0000ff>(__in </FONT>double _X);<BR><BR>&nbsp;其中多出来的<FONT color=#0000ff>__in</FONT>的介绍如下：<BR>&nbsp;If you examine the library header files, you will notice some unusual annotations such as <B><FONT style="BACKGROUND-COLOR: #f5f5dc">__in_</FONT>z</B> and <B>__out_ecount_part</B>. These are examples of Microsoft's standard source code annotation language (SAL), which provides a set of annotations to describe how a function uses its parameters—the assumptions it makes about them, and the guarantees it makes upon finishing. The header file &lt;sal.h&gt; defines the annotations.<BR>具体的可以看</FONT><A href="http://msdn2.microsoft.com/en-us/library/ms235402.aspx"><FONT color=#000000>http://msdn2.microsoft.com/en-us/library/ms235402.aspx</FONT></A><BR><BR><BR><FONT color=#000000>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;函数的原型都是差不多的，参数类型也是一样。int类型赋值给double应该是没有问题的，会进行隐式转换，不知道VC2005怎么不行？一直都听说Dev-C++对C++的标准支持的很不错，微软的最新的C++开发工具在支持C++标准方面也取得了突飞猛进的进步，现在一个程序，在不同地方却不能同时编译通过，我不知道是不是哪个对标准的支持有什么问题，还是编译器提供的安全性不同的原因呢？疑惑ing。<BR></FONT>&nbsp;&nbsp;&nbsp;&nbsp; <img src ="http://www.cppblog.com/cc/aggbug/2292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2005-12-30 18:22 <a href="http://www.cppblog.com/cc/archive/2005/12/30/2292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>