<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[jingle~baby~]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[words from the bottom of my heart~~~]]></description>
<link>http://hi.baidu.com/jinglebaby</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[相信《狮子座》，更相信曾轶可]]></title>
        <link><![CDATA[http://hi.baidu.com/jinglebaby/blog/item/9b4dd4fef70cf73b5c600888.html]]></link>
        <description><![CDATA[
		
		相信《狮子座》，更相信曾轶可 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jinglebaby/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/jinglebaby/blog/item/9b4dd4fef70cf73b5c600888.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-10  11:59</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[jinglebaby0807]]></author>
		<guid>http://hi.baidu.com/jinglebaby/blog/item/9b4dd4fef70cf73b5c600888.html</guid>
</item>

<item>
        <title><![CDATA[wxPython的安装]]></title>
        <link><![CDATA[http://hi.baidu.com/jinglebaby/blog/item/67b88ea1442b2e8e4710649c.html]]></link>
        <description><![CDATA[
		
		要在这个上面弄点东东了，于是今天装了一下。还是有一些问题的，所以记录一下吧。<br>
具体的安装，可以参见http://www.wxpython.org/builddoc.php，记录的是最详细的<br>
但是也许刚看的时候，可能没有耐心认真仔细的阅读，导致安装出错，中文解释一下：<br>
<p>1。安装wxWiget包：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   解压后在其目录下建立bld文件夹，然后运行configure：</p>
<p><span style="color: rgb(0, 0, 255);">&nbsp;&nbsp;   mkdir</span><span style="color: rgb(0, 0, 0);"> bld<br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif"></span><span style="color: rgb(0, 0, 255);">cd</span><span style="color: rgb(0, 0, 0);"> bld<br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif"></span><span style="color: rgb(0, 0, 0);">../</span><span style="color: rgb(0, 0, 0);">configure --prefix</span><span style="color: rgb(0, 0, 0);">=/</span><span style="color: rgb(0, 0, 0);">opt</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">wx</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">2.8</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  --with-gtk </span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  --with-gnomeprint </span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  --with-opengl </span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  --enable-</span><span style="color: rgb(0, 0, 255);">debug</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  --enable-geometry </span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  --enable-graphics_ctx </span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  --enable-sound --with-sdl </span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  --enable-mediactrl </span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  --enable-display </span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  --disable-debugreport </span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  --enable-unicode </span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  --with-libjpeg</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">builtin </span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  --with-libpng</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">builtin </span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  --with-libtiff</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">builtin </span><span style="color: rgb(0, 0, 0);"><br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  --with-zlib</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">builtin </span><span style="color: rgb(0, 0, 0);"><br>
</span></p>
<p>2。编译安装：</p>
<p>制作一个脚本，命名为.make，放到bld目录下，内容如下：</p>
<p><span style="color: rgb(0, 0, 0);">make $</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> <br>
</span><span style="color: rgb(0, 0, 0);"> make </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">C contrib</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">src</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">gizmos $</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> <br>
</span><span style="color: rgb(0, 0, 0);">make </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">C contrib</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">src</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">stc $</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"><br>
</span></p>
<p>然后运行：</p>
<p>chmod u+x .make</p>
<p>.make</p>
<p>.make install</p>
<p>3。安装wxPython：</p>
<p>解压，然后在它的wxPython目录里运行：</p>
<p>python2.5 setup.py build_ext --inplace --debug WX_CONFIG=/opt/wx/2.8/bin/wx-config BUILD_GLCANVAS=0</p>
<p>BUILD_GLCANVAS=0，这个很关键哦，开始出现一大堆编译错误都是因为它。后来看见文档中，</p>
<p>If you get errors about being unable to find libGLU, wxGLCanvas being  undeclared, or something similar then you can add BUILD_GLCANVAS=0 to the  setup.py command line to disable the building of the glcanvas module.豁然开朗</p>
<p>WX_CONFIG<span style="color: rgb(0, 0, 0);">=/</span><span style="color: rgb(0, 0, 0);">opt</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">wx</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">2.8</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">bin</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">wx-config 中的路径为configure时设置的路径</span></p>
<p><span style="color: rgb(0, 0, 0);">4。设置环境变量：</span></p>
<p><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif"><span style="color: rgb(0, 0, 0);">export LD_LIBRARY_PATH</span><span style="color: rgb(0, 0, 0);">=/</span><span style="color: rgb(0, 0, 0);">opt</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">wx</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">2.8</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">lib<br>
<img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">export PYTHONPATH</span><span style="color: rgb(0, 0, 0);">=/</span><span style="color: rgb(0, 0, 0);">home/jingle</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">wxPython</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">2.8</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">3.0</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">wxPython</span></p>
<p><span style="color: rgb(0, 0, 0);">当然，用export的方法，只能在当前终端有效啦，所以，我们还是最好修改.bash_profile文件，这样，无论在哪个终端，都好使啦。<br>
</span></p>
<p><span style="color: rgb(0, 0, 0);">测试一下，运行wxPython目录下的demo：</span></p>
<span style="color: rgb(0, 0, 0);">python demo.py<br>
<br>
OK,搞定啦！！！<br>
</span> <a href="http://hi.baidu.com/jinglebaby/blog/item/67b88ea1442b2e8e4710649c.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jinglebaby/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/jinglebaby/blog/item/67b88ea1442b2e8e4710649c.html#comment">查看评论</a>]]></description>
        <pubDate>2008-05-14  22:24</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[jinglebaby0807]]></author>
		<guid>http://hi.baidu.com/jinglebaby/blog/item/67b88ea1442b2e8e4710649c.html</guid>
</item>

<item>
        <title><![CDATA[妙啊！]]></title>
        <link><![CDATA[http://hi.baidu.com/jinglebaby/blog/item/db9a7b4a6543532608f7efc1.html]]></link>
        <description><![CDATA[
		
		<p>在sed中，匹配以&ldquo;AA&rdquo;开头，不以&ldquo;BB&rdquo;或者&ldquo;CC&rdquo;结尾的行，如何写呢？</p>
<p>sed -n '/^AA.*[^(BB)(CC)]$/p' filename</p>
<p> </p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jinglebaby/blog/category/linux%20%26%2338%3B%20unix">linux &#38; unix</a>&nbsp;<a href="http://hi.baidu.com/jinglebaby/blog/item/db9a7b4a6543532608f7efc1.html#comment">查看评论</a>]]></description>
        <pubDate>2008-04-16  22:27</pubDate>
        <category><![CDATA[linux &#38; unix]]></category>
        <author><![CDATA[jinglebaby0807]]></author>
		<guid>http://hi.baidu.com/jinglebaby/blog/item/db9a7b4a6543532608f7efc1.html</guid>
</item>

<item>
        <title><![CDATA[small tips]]></title>
        <link><![CDATA[http://hi.baidu.com/jinglebaby/blog/item/cba6e61be49311d0ac6e7541.html]]></link>
        <description><![CDATA[
		
		<p>&nbsp;&nbsp;&nbsp;&nbsp;  In shell, when we assign a value to a variables, note that: a string must be delimited by inverted commas if it contains spaces. Also note that there must be no spaces on either side of the equals sign. </p>
<p>&nbsp;&nbsp;&nbsp;  We can assign user input to a variable by using the read command.&nbsp;&nbsp; This takes one parameter, the name of the variable to be read into, then waits for the user to enter some text. The read normally continues when the user presses the Return key.</p> <a href="http://hi.baidu.com/jinglebaby/blog/item/cba6e61be49311d0ac6e7541.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jinglebaby/blog/category/linux%20%26%2338%3B%20unix">linux &#38; unix</a>&nbsp;<a href="http://hi.baidu.com/jinglebaby/blog/item/cba6e61be49311d0ac6e7541.html#comment">查看评论</a>]]></description>
        <pubDate>2008-04-12  10:03</pubDate>
        <category><![CDATA[linux &#38; unix]]></category>
        <author><![CDATA[jinglebaby0807]]></author>
		<guid>http://hi.baidu.com/jinglebaby/blog/item/cba6e61be49311d0ac6e7541.html</guid>
</item>

<item>
        <title><![CDATA[autotools]]></title>
        <link><![CDATA[http://hi.baidu.com/jinglebaby/blog/item/8c3fdd504deac1591138c21a.html]]></link>
        <description><![CDATA[
		
		有关autotools 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jinglebaby/blog/category/linux%20%26%2338%3B%20unix">linux &#38; unix</a>&nbsp;<a href="http://hi.baidu.com/jinglebaby/blog/item/8c3fdd504deac1591138c21a.html#comment">查看评论</a>]]></description>
        <pubDate>2008-04-11  09:37</pubDate>
        <category><![CDATA[linux &#38; unix]]></category>
        <author><![CDATA[jinglebaby0807]]></author>
		<guid>http://hi.baidu.com/jinglebaby/blog/item/8c3fdd504deac1591138c21a.html</guid>
</item>

<item>
        <title><![CDATA[关于Make]]></title>
        <link><![CDATA[http://hi.baidu.com/jinglebaby/blog/item/cd31aa51f089082142a75b9c.html]]></link>
        <description><![CDATA[
		
		1.Makefile<br>
1) 基本结构<br>
&nbsp;&nbsp;&nbsp;&nbsp;    一个makefile文件一般要包含三个部分：目标体，依赖的文件以及要运行的命令。它的一般格式为：<br>
target：dependency_files<br>
&nbsp;&nbsp;&nbsp;    command&nbsp;&nbsp;    &mdash;&mdash;这里需要注意的是，command之前必须有一个tab键<br>
&nbsp;&nbsp;&nbsp;    make的原理就是如果target不存在或是dependency_files的时间戳比target的时间戳新，那么就会执行命令command。但是在执行该command之前，需要先向下查看以dependency_files为target时，文件依赖的时间戳情况。<br>
&nbsp;&nbsp;    使用make时，默认会主动读入当前目录下的Makefile文件或是makefile文件。当然，也可以通过-f选项来指定用其他名称命名的文件。<br>
2) Makefile变量<br>
&nbsp;&nbsp;&nbsp;    分为如下几种：用户自定义变量，预定义变量，自动变量以及环境变量。变量的展开方式有两种：<br>
&nbsp;&nbsp;&nbsp;    递归展开：VAR=var<br>
&nbsp;&nbsp;&nbsp;    简单扩展：VAR:=var<br>
&nbsp;&nbsp;&nbsp;    变量使用均是$(VAR)的格式。<br>
&nbsp;&nbsp;&nbsp;   a) 自定义变量如OBJS=jingle.o buffalo.o 中的OBJS，由用户自行设定；<br>
&nbsp;&nbsp;&nbsp;   b ) 预定义变量和自动变量为通常在Makefile中都会出现的变量，常见的预定义变量如下：<br>
&nbsp;&nbsp;&nbsp;&nbsp;   CC(C编译器名称)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  CXX(C++编译器名称)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  CFLAGS(C编译器选项)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  AR(库文件维护程序名称, 默认值为ar) 等。<br>
&nbsp;&nbsp;&nbsp;&nbsp;  常见的自动变量如下：&nbsp;&nbsp;&nbsp;&nbsp; 
<table cellspacing="0" cellpadding="0" border="1" align="left" class="MsoTableGrid" style="border: medium none ; border-collapse: collapse; margin-left: 6.75pt; margin-right: 6.75pt;">
    <tbody>
        <tr>
            <td width="284" valign="top" style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 213.05pt;">
            <p align="center" class="MsoNormal" style="text-align: center;"><strong><span>命令格式</span></strong></p>
            </td>
            <td width="284" valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 213.05pt;">
            <p align="center" class="MsoNormal" style="text-align: center;"><strong><span>含义</span></strong></p>
            </td>
        </tr>
        <tr>
            <td width="284" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 213.05pt;">
            <p class="MsoNormal"><span>$*</span></p>
            </td>
            <td width="284" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 213.05pt;">
            <p class="MsoNormal"><span>不带扩展名的目标文件名称</span></p>
            </td>
        </tr>
        <tr>
            <td width="284" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 213.05pt;">
            <p class="MsoNormal"><span>$+</span></p>
            </td>
            <td width="284" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 213.05pt;">
            <p class="MsoNormal"><span>所有的依赖文件，以空格分开，可能包含重复的依赖文件</span></p>
            </td>
        </tr>
        <tr>
            <td width="284" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 213.05pt;">
            <p class="MsoNormal"><span>$&lt;</span></p>
            </td>
            <td width="284" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 213.05pt;">
            <p class="MsoNormal"><span>第一个依赖文件的名称</span></p>
            </td>
        </tr>
        <tr>
            <td width="284" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 213.05pt;">
            <p class="MsoNormal"><span>$@</span></p>
            </td>
            <td width="284" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 213.05pt;">
            <p class="MsoNormal"><span>目标文件的完整名称</span></p>
            </td>
        </tr>
        <tr>
            <td width="284" valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 213.05pt;">
            <p class="MsoNormal"><span>$^</span></p>
            </td>
            <td width="284" valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 213.05pt;">
            <p class="MsoNormal"><span>所有不重复的依赖文件，以空格分开</span></p>
            </td>
        </tr>
    </tbody>
</table>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
3) Makefile规则<br>
&nbsp;&nbsp;&nbsp;  1.隐式规则：所有的.o文件都有.c文件由命令$(CC) $(CPPFLAGS) $(CFLAGS) -c file.c -o file.o生成;<br>
&nbsp;&nbsp;&nbsp;  2.模式规则：相当于所有匹配模式都必须遵守的普通规则，在这个规则中，相关文件前必须用%标明，如<br>
&nbsp;&nbsp;&nbsp;  %.o: %.c<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  $(CC) $(CFLAGS) -c $&lt; -o $@ <a href="http://hi.baidu.com/jinglebaby/blog/item/cd31aa51f089082142a75b9c.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jinglebaby/blog/category/linux%20%26%2338%3B%20unix">linux &#38; unix</a>&nbsp;<a href="http://hi.baidu.com/jinglebaby/blog/item/cd31aa51f089082142a75b9c.html#comment">查看评论</a>]]></description>
        <pubDate>2008-04-10  22:51</pubDate>
        <category><![CDATA[linux &#38; unix]]></category>
        <author><![CDATA[jinglebaby0807]]></author>
		<guid>http://hi.baidu.com/jinglebaby/blog/item/cd31aa51f089082142a75b9c.html</guid>
</item>

<item>
        <title><![CDATA[库依赖]]></title>
        <link><![CDATA[http://hi.baidu.com/jinglebaby/blog/item/05a1dfc4a8efbdad8326ac0c.html]]></link>
        <description><![CDATA[
		
		<title></title>
 <span><font size="2">
<p style="text-indent: 21.6pt;" class="MsoNormal"><font size="2"><span>从程序员的角度看，函数库实际上就是一些头文件</span><span>(.h)</span><span>和库文件</span><span>(.so</span><span>或者</span><span>.a)</span><span>的集合。虽然</span><span>Linux</span><span>下大多数函数都默认将头文件放到</span><span>/usr/include/</span><span>目录下，而库文件则放到</span><span>/usr/lib/</span><span>目录下，但并不是所有的情况都是这样。正因如此，</span><span>gcc</span><span>在编译时必须让编译器知道如何来查找所需要的头文件和库文件。</span><span> </span></font></p>
<p style="text-indent: 21.6pt;" class="MsoNormal"><font size="2"><span><strong>gcc</strong></span><span><strong>采用搜索目录的办法来查找所需要的文件</strong>，</span><span><strong>-I</strong></span><span>选项可以向</span><span>gcc</span><span>的<strong>头文件搜索路径中</strong>添加新的目录。例如，如果在</span><span>/home/jingle/include/</span><span>目录下有编译时所需要的头文件，为了让</span><span>gcc</span><span>能够顺利地找到它们，就可以使用</span><span>-I</span><span>选项：</span><span> </span></font></p>
<p style="margin: 7.8pt 0pt;" class="2"><font size="2"><span>[root@jingle]$ gcc jingle.c  -I /home/jingle/include -o jingle</span></font></p>
<font size="2"><span>
<p style="text-indent: 21.6pt;" class="MsoNormal"><font size="2"><span>同样，如果使用了不在标准位置的库文件，那么可以通过</span><span><strong>-L</strong></span><span>选项向</span><span>gcc</span><span>的<strong>库文件搜索路径中</strong>添加新的目录。例如，如果在</span><span>/home/jignle/lib/</span><span>目录下有链接时所需要的库文件</span><span>libjingle.so</span><span>，为了让</span><span>gcc</span><span>能够顺利地找到它，可以使用下面的命令：</span><span> </span></font></p>
<p style="margin: 7.8pt 0pt;" class="2"><font size="2"><span>[root@jingle]$ gcc jingle.c  -L /home/jingle/lib &ndash;ljingle -o jingle</span></font></p>
<p style="margin: 7.8pt 0pt;" class="2"><font size="2"><span><span>&nbsp;&nbsp;&nbsp;  Linux</span><span>下的库文件在命名时有一个约定，那就是应该以</span><span>lib</span><span>三个字母开头。由于所有的库文件都遵循了同样的规范，因此在用</span><span>-l</span><span>选项指定链接的库文件名时可以省去</span><span>lib</span><span>三个字母。也就是说</span><span>gcc</span><span>在对</span><span>-ldavid</span><span>进行处理时，会自动去链接名为</span><span>libjingle.so</span><span>的文件。</span></span></font></p>
<p style="margin: 7.8pt 0pt;" class="2"><font size="2"><span><span>&nbsp;&nbsp;&nbsp;<font size="2"><span>Linux</span><span>下的库文件分为两大类，分别是动态链接库</span><span>(</span><span>通常以</span><span>.so</span><span>结尾</span><span>)</span><span>和静态链接库</span><span>(</span><span>通常以</span><span>.a</span><span>结尾</span><span>)</span><span>，两者的差别仅在于程序执行时所需的代码是在运行时动态加载的，还是在编译时静态加载的。</span></font></span></span></font></p>
<p style="text-indent: 21.6pt;" class="MsoNormal"><font size="2"><font size="2"><font size="2"><span>默认情况下，</span><span>gcc</span><span>在链接时优先使用动态链接库，只有当动态链接库不存在时才考虑使用静态链接库。如果需要的话可以在编译时加上</span><span><strong>-static</strong></span><span>选项，<strong>强制使用静态链接库</strong>。例如，如果在</span><span>/home/jingle/lib/</span><span>目录下有链接时所需要的库文件</span><span>libfoo.so</span><span>和</span><span>libfoo.a</span><span>，为了让</span><span>gcc</span><span>在链接时只用到静态链接库，可以使用下面的命令：</span><span> </span></font></font></font></p>
<p style="margin-top: 7.8pt;" class="2"><font size="2"><font size="2"><font size="2"><span>[root@jingle]$ gcc foo.c -L  /home/david/lib<strong> -static</strong> &ndash;ljingle -o  foo</span></font></font></font></p>
</span>
<p> </p>
</font></font></span> <a href="http://hi.baidu.com/jinglebaby/blog/item/05a1dfc4a8efbdad8326ac0c.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jinglebaby/blog/category/linux%20%26%2338%3B%20unix">linux &#38; unix</a>&nbsp;<a href="http://hi.baidu.com/jinglebaby/blog/item/05a1dfc4a8efbdad8326ac0c.html#comment">查看评论</a>]]></description>
        <pubDate>2008-04-07  10:59</pubDate>
        <category><![CDATA[linux &#38; unix]]></category>
        <author><![CDATA[jinglebaby0807]]></author>
		<guid>http://hi.baidu.com/jinglebaby/blog/item/05a1dfc4a8efbdad8326ac0c.html</guid>
</item>

<item>
        <title><![CDATA[&#34;vim_user_manual&#34; 补充一些学习体会]]></title>
        <link><![CDATA[http://hi.baidu.com/jinglebaby/blog/item/34ba6eaf825fa0fffaed5069.html]]></link>
        <description><![CDATA[
		
		1.查找：如果你用&quot;/the&quot;来查找Vim也会匹配到&quot;there&quot;。要查找作为独立单词的&quot;the&quot;使用如下命令:  /\&lt;the\&gt;&nbsp;&nbsp;&nbsp;     解释：'\&gt;'表示the的后面没有内容，'\&lt;'表示the的前面没有内容。<br>
<br>
2.啊哈，原来查找除了使用&lsquo;/&rsquo;之外，还可以直接把光标定位到要查找的词上面，然后shift+*<br>
<br>
3.标记：标记对于编辑那些有两块内容相互关联的文件十分有用. 想象一下你在文件开头有一段文字需要时时参考, 但实际上要修改编辑的地方却在文件结尾处的情形.你可以移动到文件开始处并在此放置一个名为s(start)的标记:ms ，然后你可以转移到你需要编辑的地方并在此命名一个叫e(end)的标记:me。现在你就可以在两地之间自由移动了, 若要参考文件开头的部分:'s，或者用'e跳转到定义标记e的文件结尾处.<br>
<br>
4.在打开一大堆窗口的情况下要退出Vim, 你可以一个一个地关闭这些窗口. 还有另外一个专用的命令::qall 。如果这些窗口中有被修改又没保存的, Vim 就不会退出.。光标也会自动被定位到该窗口中。这样你可以用&quot;:write&quot;来保存修改, 或用&quot;:quit!&quot;放弃这些改动。<br>
&nbsp;&nbsp;    如果你已经知道有窗口被修改了而且还没有保存, 可以用命令 :wall来保存所有被修改的窗口。还有一个对&quot;:qall&quot;和&quot;:wall&quot;的组合&mdash;&mdash;保存并退出所有窗口:wqall。最后, 还有一个放弃所有修改强制退出Vim的命令:!qall。<br>
<br>
5.原来，vimdiff 两个文件时，原来是使两个文件显示相同的行数啊。如果其中一个文件的行数少，那么这个文件会用---------------------------------去补齐哦。而如果直接用diff file_a file_b的话呢，则不会显示两个文件的内容，只会显示哪里不同。<br>
<br>
6.改变大小写：gU命令&mdash;&mdash;小写变大写，gu命令&mdash;&mdash;大写变小写。把光标放在你要使之变为大/小写的单词的第一个字母上，然后使用此命令，还可以用&quot;g~&quot;来使所有字母的大小写反个过。<br>
&nbsp;&nbsp;&nbsp;   要使一个操作子命令作用于以行为单位的对象你可以键入该操作子两次. 比如, 删除操<br>
作子是&quot;d&quot;, 所能删除一行的命令是&quot;dd&quot;. 同样, &quot;gugu&quot;使一整行变为小写. 此外, 它还可简写为&quot;guu&quot;. &quot;gUgU&quot;简写为&quot;gUU&quot;。<br>
<br>
7.使用外部程序，hiahia，很不错的说。<br>
命令&quot;!{motion} {program}&quot;以一块文本为对象将它们通过管道送至一个外部程序. 换句话说, 由{program}指定的外部程序, 接受由{motion}命令指定的文本块作为输入, 以它的输出来替换{motion}指定的文本块. 比如对下列的文本块，我们想执行sort操作，怎么办呢？<br>
line 55 <br>
line 33 <br>
line 11 <br>
line 22 <br>
line 44 <br>
假设你要将第1-5行的内容排序, 首先将光标置于第1行上. 然后键入如下命令&quot;!5G&quot;，&quot;!&quot;告诉Vim你要执行一个过滤操作了. Vim希望接下来收到你继续键入的移动命令, 以决定要将哪个区域的文本块送至过滤程序. &quot;5G&quot;命令告诉Vim要过滤的内容是第1行(也是当前行)到第5行.由于这是一个过滤操作, 所以此时Vim会自动地把光标放到命令行模式. 接下来你可以键入过滤器的名字, 这里是&quot;sort&quot;. 所以, 整个命令如下:<br>
!5Gsort&lt;Enter&gt;，结果呢，如下：<br>
ine 11 <br>
line 22 <br>
line 33 <br>
line 44 <br>
line 55 <br>
&quot;!!&quot;命令过滤当前行的内容.  &quot;!!date&lt;Enter&gt;&quot;会以&quot;date&quot;命令的输出来替换当前行的内容. 要向文件里加入一个时间戳时这一命令很有用.<br>
<br>
8. 如果按下了ctrl-A/ctrl+a, 编辑器会插入你上一次在insert模式下录入的内<br>
容.如一个文件中，有内容&quot;file.h&quot;，然后键入#include ，然后移到下一行，按下ctrl+A/ctrl+a，就会显示#include。ctrl-y命令会插入当前光标之上的一行中相同位置字符.好玩～ctrl-E与ctrl-Y十分相似, 不过它插入的是当前行之下的那一行中同列的字符. <a href="http://hi.baidu.com/jinglebaby/blog/item/34ba6eaf825fa0fffaed5069.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jinglebaby/blog/category/linux%20%26%2338%3B%20unix">linux &#38; unix</a>&nbsp;<a href="http://hi.baidu.com/jinglebaby/blog/item/34ba6eaf825fa0fffaed5069.html#comment">查看评论</a>]]></description>
        <pubDate>2008-03-30  15:30</pubDate>
        <category><![CDATA[linux &#38; unix]]></category>
        <author><![CDATA[jinglebaby0807]]></author>
		<guid>http://hi.baidu.com/jinglebaby/blog/item/34ba6eaf825fa0fffaed5069.html</guid>
</item>

<item>
        <title><![CDATA[c/c++深层探索的几个学习心得]]></title>
        <link><![CDATA[http://hi.baidu.com/jinglebaby/blog/item/f78ca30add87cc1b94ca6be3.html]]></link>
        <description><![CDATA[
		
		<font size="2">一、变长数组 &nbsp;&nbsp;   <br>
</font>C90中的数组<font size="2">的大小必须是</font>编译期间可求出的常数值，而C99做了很大改进，允许数组的[ ]中的值是整形变量或是整形表达式。这就解释了下面的情况：<br>
&nbsp;&nbsp;&nbsp;&nbsp;   int n;<br>
&nbsp;&nbsp;&nbsp;&nbsp;   scanf (&quot;%d&quot;, &amp;n);<br>
&nbsp;&nbsp;&nbsp;&nbsp;   int array[n];<br>
&nbsp;&nbsp;&nbsp;&nbsp;   虽然n确实是需要运行时动态确定的变量，但是在C99中，以这种变量作为数组大小的形式已经是允许的了。这样的数组就被称之为&ldquo;变长数组&rdquo;。注意：变长数组是指用整形变量或表达式声明或定义的数组，而不是说数组的长度会随时变化，变长数组在其生存期内的长度同样是固定的。如下面的例子：<br>
........<br>
fun (10);<br>
.........<br>
void fun(int n)<br>
{<br>
&nbsp;&nbsp;   &nbsp;&nbsp;   int vla[n];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   n += 10;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   printf (&quot;vla takes %d bytes\n&quot;, sizeof vla);<br>
&nbsp;&nbsp;   }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   执行的结果是40,虽然n的值在声明了数组vla之后发生了变化，但是vla不会因此而改变大小，因为变长数组一旦被声明，其大小就会保持不变直到生命期结束。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   另外，变长数组不允许是静态数组或是具有外部链接性质的数组。因为外部数组存放在数据段，它们占用的空间必须在编译时确定。变长数组也不能是struct或是union的成员，因为它们的大小也必须在编译期确定。<br>
<br>
二、可伸缩数据成员<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   这个特征是针对struct结构来说的。正如上文说到，结构体的成员中不能够包含变长数组，那么如果结构体的某个数组需要在运行时动态确定大小怎么办呢？C99提供了一种方法，如下例<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   struct polygon<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   int edgeCount;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   double coordinate[];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   };<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   它告诉编译器，polygon有一个可伸缩数据成员coordinate，它不占用任何空间(因为sizeof polygon == sizeof edgeCount)，只有在动态存储分配后，coordinate才有意义。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   struct polygon *p;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   int temp;<br>
&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;   // 为temp赋值<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   p = malloc (sizeof (struct polygon) + 16 * temp);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   对于可伸缩数据成员的struct，至少要有另外一个可在编译时确定大小的对象，并且可伸缩数组成员必须是struct结构中的最后一个成员。<br>
<br>
三、Designated Initializer<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   C99对于复合类型(struct、union、array)的初始化有了新的，更加灵活的方法。体现在，对于数组来说，可以对任意指定的元素进行初始化，而不是像从前那样，如果想初始化第n个元素，那么一定要将之前的元素都初始化。现在我们可以这样来做：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   int array[10] = {[4] = 2};<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   int array[10] = {[0] = 0, [2] = 2, [5] = 5, [9] = 9};<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   int array[100] = {[0] = 0, 1, 2, 3, 4, [95] = 95, 96, 97, 98, 99};<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   这就是Designated Initializer的威力！我们可以随便选择某个/某些元素初始化。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   对于struct或是union来说，同样也有灵活的方法。如有一个结构体<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   struct demo<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   int n;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   double d;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   char array[5];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   };<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   先要求初始化demo变量，把d赋值为3.5，array[4]赋值为&lsquo;M&rsquo;。C90要这样写&nbsp;&nbsp;&nbsp;&nbsp;   ：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   struct demo s = {0, 3.5, {'\0', '\0', '\0', '\0', 'M'}}; 而C99允许这样写：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   sturct demo s = {.d = 3.5, .array[4] = 'M'}; 或是 sturct demo s = {.d = 3.5, .array[4] = {[4] = 'M'}}; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   如果定义一个demo数组，含有10个元素，首尾元素分别初始化为{4, 7.8, &quot;ABC&quot;}和{8, 3.2, &quot;XYZ&quot;}, 则可这样写：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   struct demo demoArray[10] = {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   [0] = {.n = 4, .d = 7.8, .array = &quot;ABC&quot;},<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   [9] = {.N = 8, .d = 3.2, .array = &quot;XYZ&quot;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   };或是简单点，直接就是<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   struct demo demoArray[10] = {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   [0] = {4, 7.8, &quot;ABC&quot;},<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   [9] = {8, 3.2, &quot;XYZ&quot;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   }; <a href="http://hi.baidu.com/jinglebaby/blog/item/f78ca30add87cc1b94ca6be3.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jinglebaby/blog/category/c%D3%EF%D1%D4%B0%E6%BF%E9">c语言版块</a>&nbsp;<a href="http://hi.baidu.com/jinglebaby/blog/item/f78ca30add87cc1b94ca6be3.html#comment">查看评论</a>]]></description>
        <pubDate>2008-03-29  22:37</pubDate>
        <category><![CDATA[c语言版块]]></category>
        <author><![CDATA[jinglebaby0807]]></author>
		<guid>http://hi.baidu.com/jinglebaby/blog/item/f78ca30add87cc1b94ca6be3.html</guid>
</item>

<item>
        <title><![CDATA[关于结构体的对齐问题]]></title>
        <link><![CDATA[http://hi.baidu.com/jinglebaby/blog/item/bcfec61f3b188b67f624e4ab.html]]></link>
        <description><![CDATA[
		
		<font size="2">以前研究过结构体的对齐问题，今天一看，发现自己之前还是没有很深入的了解，现在又加深了一下认识。<br>
看这个小程序：<br>
#include &lt;stdio.h&gt;<br>
 <br>
struct s_a<br>
{<br>
  char x;<br>
  int y;<br>
  char z;<br>
  int u;<br>
};<br>
 <br>
struct s_b<br>
{<br>
  int y;<br>
  int u;<br>
  char x;<br>
  char z;<br>
};<br>
 <br>
int main(int argc, char** argv)<br>
{<br>
  struct s_a sa;<br>
  struct s_b sb;<br>
  printf (&quot;%d %d\n&quot;, sizeof sa, sizeof sb);<br>
  return 0;<br>
}<br>
结果是什么呢？上面的是16，下面的是12。<br>
Why？<br>
从前的错误认识，以为只要是对其，对于结构体中小于4字节的变量，都一律按照4字节对齐。那么两个输出结果应该都是16；正确的认识是，我们知道，CPU对于内存的访问并不是完全任意的，对于32位机来说，如果CPU想读/写4个字节，那么给出的内存起始地址最好是4的倍数。例如：0x12345670，</font><font size="2">0x12345674，</font><font size="2">0x12345678，</font><font size="2">0x1234567C，即最低位是0，4，8，C的其中之一，这样的话，CPU只需一次访问就可以完成对数据的存取，如果数据不是这样存放的话，那么CPU对数据的访问就会很缺少效率。为了提高效率，编译器一般都会把数据安放到适合它们的地址。譬如int为4个字节，则凡是int型的变量的地址都是4的倍数，称为4字节对齐。<br>
 现在再去看看那个例子，是不是就明白了呢？<br>
<br>
看来，应该小心处理struct的成员布局，否则编译器的某些安排可能会导致空间浪费哦～<br>
</font> <a href="http://hi.baidu.com/jinglebaby/blog/item/bcfec61f3b188b67f624e4ab.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jinglebaby/blog/category/c%D3%EF%D1%D4%B0%E6%BF%E9">c语言版块</a>&nbsp;<a href="http://hi.baidu.com/jinglebaby/blog/item/bcfec61f3b188b67f624e4ab.html#comment">查看评论</a>]]></description>
        <pubDate>2008-03-25  21:18</pubDate>
        <category><![CDATA[c语言版块]]></category>
        <author><![CDATA[jinglebaby0807]]></author>
		<guid>http://hi.baidu.com/jinglebaby/blog/item/bcfec61f3b188b67f624e4ab.html</guid>
</item>


</channel>
</rss>