﻿<?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++博客-信心比金钱更重要！-随笔分类-C语言</title><link>http://www.cppblog.com/luofeng225/category/9985.html</link><description>目标明确==&gt;&gt;&gt;计划跟踪==&gt;&gt;&gt;行动执行！</description><language>zh-cn</language><lastBuildDate>Sun, 29 Apr 2012 19:11:22 GMT</lastBuildDate><pubDate>Sun, 29 Apr 2012 19:11:22 GMT</pubDate><ttl>60</ttl><item><title>strlen</title><link>http://www.cppblog.com/luofeng225/archive/2012/04/28/173040.html</link><dc:creator>luofeng</dc:creator><author>luofeng</author><pubDate>Sat, 28 Apr 2012 06:36:00 GMT</pubDate><guid>http://www.cppblog.com/luofeng225/archive/2012/04/28/173040.html</guid><wfw:comment>http://www.cppblog.com/luofeng225/comments/173040.html</wfw:comment><comments>http://www.cppblog.com/luofeng225/archive/2012/04/28/173040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luofeng225/comments/commentRss/173040.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luofeng225/services/trackbacks/173040.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 25px; font-family: arial, 宋体, sans-serif; text-align: left"><br />strlen所作的仅仅是一个计数器的工作，它从内存的某个位置（可以是字符串开头，中间某个位置，甚至是某个不确定的内存区域）开始扫描，<strong>直到碰到第一个字符串结束符'\0'为止</strong>，然后返回计数器值。<br /><br />通常用于字符串长度获得。<br /><br />其他byte数据，用这个测量len，可能中间有\0 ??<br /></span></span><img src ="http://www.cppblog.com/luofeng225/aggbug/173040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luofeng225/" target="_blank">luofeng</a> 2012-04-28 14:36 <a href="http://www.cppblog.com/luofeng225/archive/2012/04/28/173040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C编程常遇问题</title><link>http://www.cppblog.com/luofeng225/archive/2012/04/26/172829.html</link><dc:creator>luofeng</dc:creator><author>luofeng</author><pubDate>Thu, 26 Apr 2012 08:12:00 GMT</pubDate><guid>http://www.cppblog.com/luofeng225/archive/2012/04/26/172829.html</guid><wfw:comment>http://www.cppblog.com/luofeng225/comments/172829.html</wfw:comment><comments>http://www.cppblog.com/luofeng225/archive/2012/04/26/172829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luofeng225/comments/commentRss/172829.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luofeng225/services/trackbacks/172829.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; color: rgb(98,91,73); font-family: Arial; webkit-border-horizontal-spacing: 2px; webkit-border-vertical-spacing: 2px"><br /><strong><br />expected specifier-qualifier-list before sth之类得编译错误，<br /></strong>造成这种错误得主要原因就是使用了未被定义的变量。关于specifier-qualifier-list的定义：<span style="line-height: normal">It's a list of specifiers and qualifiers :-) Specifiers are things like&nbsp;<code style="line-height: normal">void</code>,&nbsp;<code style="line-height: normal">char</code>,&nbsp;<code style="line-height: normal">struct Foo</code>, etc., and qualifiers are keywords like&nbsp;<code style="line-height: normal">const</code>&nbsp;and&nbsp;<code style="line-height: normal">volatile</code>. See&nbsp;<a style="font-size: 12px; color: rgb(98,91,73); line-height: normal; text-decoration: underline" href="http://www.lysator.liu.se/c/ANSI-C-grammar-y.html#specifier-qualifier-list" rel="nofollow">this C grammar</a>&nbsp;for the definition</span></span></span> <br /><br /><strong><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 25px; font-family: arial, 宋体, sans-serif"><strong>Malloc</strong> 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定，void* 类型可以<a style="color: rgb(19,110,194); text-decoration: underline" href="http://baike.baidu.com/view/965170.htm" target="_blank">强制转换</a>为任何其它类型的指针。<br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 24px; font-family: arial, 宋体, sans-serif">原型：extern void *malloc(unsigned int num_bytes);</span></span><br />&nbsp;num_bytes需保证为正数，不然总会返回NULL。<br /><br /><br /><strong>定义指针，必须初始化，否则其值不定是什么值！！<br /></strong>BYTE * pData = NULL;//文本</span></span></strong> <br /><br /><br />函数声明缺少符号&#8220;；&#8221;<br /> <img src ="http://www.cppblog.com/luofeng225/aggbug/172829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luofeng225/" target="_blank">luofeng</a> 2012-04-26 16:12 <a href="http://www.cppblog.com/luofeng225/archive/2012/04/26/172829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>#include "" 和 #include &lt;&gt; 区别</title><link>http://www.cppblog.com/luofeng225/archive/2012/04/26/172828.html</link><dc:creator>luofeng</dc:creator><author>luofeng</author><pubDate>Thu, 26 Apr 2012 08:08:00 GMT</pubDate><guid>http://www.cppblog.com/luofeng225/archive/2012/04/26/172828.html</guid><wfw:comment>http://www.cppblog.com/luofeng225/comments/172828.html</wfw:comment><comments>http://www.cppblog.com/luofeng225/archive/2012/04/26/172828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luofeng225/comments/commentRss/172828.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luofeng225/services/trackbacks/172828.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 23px; font-family: simsun; text-align: left"><br /><br />include &nbsp; " "是先从本地目录开始寻找，然后去寻找系统路径<span class="Apple-converted-space">&nbsp;</span><br />而Include &nbsp; &lt;&gt; &nbsp; 相反先从系统目录，后从本地目录<span class="Apple-converted-space">&nbsp;</span><br />你的问题应该还是路径的问题，检查下工程设置里面的引入路径</span></span> <br /><br /><br /><a href="http://blog.chinaunix.net/uid-26183957-id-3162472.html">http://blog.chinaunix.net/uid-26183957-id-3162472.html</a><img src ="http://www.cppblog.com/luofeng225/aggbug/172828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luofeng225/" target="_blank">luofeng</a> 2012-04-26 16:08 <a href="http://www.cppblog.com/luofeng225/archive/2012/04/26/172828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于使用ifndef避免宏重复定义</title><link>http://www.cppblog.com/luofeng225/archive/2012/04/26/172826.html</link><dc:creator>luofeng</dc:creator><author>luofeng</author><pubDate>Thu, 26 Apr 2012 07:49:00 GMT</pubDate><guid>http://www.cppblog.com/luofeng225/archive/2012/04/26/172826.html</guid><description><![CDATA[<a href="http://blog.chinaunix.net/uid-22275351-id-10905.html"><br />http://blog.chinaunix.net/uid-22275351-id-10905.html</a><br /><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 16px; line-height: 24px; font-family: 宋体, Arial">1. 多次包含的情况<br /><br />include xxx 就是将xxx的内容原地展开<br /><br />假设有：<br />a.h， 内容是A<br /><br />b.h， 内容是：<br />#include "a.h"<br />B<br /><br />c.h， 内容是：<br />#include "a.h"<br />C<br /><br />如果有一个文件x.c， 内容是：<br />#include "b.h"<br />#include "c.h"<br />X<br /><br />b.h和c.h的内容就会被插入到X之前， 也就是这个样子：<br />A<br />B<br />A<br />C<br />X<br /><br />A的内容就出现了2次。<br /><br />在更复杂的环境中， A的内容还可能出现多次。<br /><br /><br />2. 多次出现是有问题的<br /><br />一般来说， 重复声明没什么问题。<br />所以， 如果A.h中止包含一些声明， 那重复了也没什么关系。<br /><br />比如： 
<div class="blockcode" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<div id="code0" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<ol style="padding-right: 0px; list-style: decimal none outside; padding-left: 2em; padding-bottom: 0px; margin: 0px; line-height: 5px; padding-top: 0px"><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">int f(int);<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">int f(int);<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">int f(int);<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">extern int i;<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">extern int i;<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">extern int i;<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">struct x;<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">struct x;<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">struct x;</li></ol></div><em click="copycode($('code0'));"  .>复制代码</em></div>重复写N次也没关系。<br /><br />但头文件中会出现一类"定义"， 在<font style="line-height: 1.5" color="red">同一翻译单元</font>中是不能重复的。<br />比如： 
<div class="blockcode" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<div id="code1" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<ol style="padding-right: 0px; list-style: decimal none outside; padding-left: 2em; padding-bottom: 0px; margin: 0px; line-height: 5px; padding-top: 0px"><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">struct x { ... };<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">struct x { ... }; // 重复定义<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px"><br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#define M ...<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#define M ...&nbsp;&nbsp;// 重复定义</li></ol></div><em click="copycode($('code1'));"  .>复制代码</em></div>3. 头文件保护符<br /><br />有时候必须将这些定义放在头文件中， 所以就要用头文件保护符。<br />另外还有一类"定义"， 会产生外部符号。<br />这类"定义"在一个链接过程中只能有唯一一份。<br />是不可以加入到头文件中的。<br />这种定义依然有例外&#8230;&#8230;&nbsp;&nbsp;就是inline、模板和匿名名字空间， 就不扯远了&#8230;&#8230;<br /><br /><br />假设A的内容是： 
<div class="blockcode" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<div id="code2" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<ol style="padding-right: 0px; list-style: decimal none outside; padding-left: 2em; padding-bottom: 0px; margin: 0px; line-height: 5px; padding-top: 0px"><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#ifndef A_H<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#define A_H<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">AA<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#endif</li></ol></div><em click="copycode($('code2'));"  .>复制代码</em></div>如果A被展开多次，例如上面的X， 就会变成这个样子 
<div class="blockcode" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<div id="code3" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<ol style="padding-right: 0px; list-style: decimal none outside; padding-left: 2em; padding-bottom: 0px; margin: 0px; line-height: 5px; padding-top: 0px"><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">// A_H是a.h的保护符， 必须是一个不冲突的名字。 那么，这里就不会有A_H的定义<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">// 然后紧接这下一行中的条件编译就会选中#ifndef 和#endif之间的部分， 也就是#define A_H 和AA<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#ifndef A_H<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#define A_H<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">AA<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#endif<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px"><br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px"><br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">B<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px"><br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">// 在a.h被第一次包含后， A_H就获得定义<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">// 所以下一行的条件编译部分就被取消， AA就不会重复出现多次<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#ifndef A_H<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#define A_H<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">AA<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#endif<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px"><br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">C<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px"><br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">X</li></ol></div><em click="copycode($('code3'));"  .>复制代码</em></div>最终交给编译器看到的代码就是： 
<div class="blockcode" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<div id="code4" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<ol style="padding-right: 0px; list-style: decimal none outside; padding-left: 2em; padding-bottom: 0px; margin: 0px; line-height: 5px; padding-top: 0px"><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">AA<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">B<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">C<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">X</li></ol></div><em click="copycode($('code4'));"  .>复制代码</em></div>只要A_H是唯一的， AA就不会重复出现。<br /><br />就解决了这个问题， 一般情况就是这么用的， 是为<strong>惯例</strong>。<br /><br />4. 外部头文件保护符<br /><br />上面的用法是"内部头文件保护符"。 a.h的保护符是使用在a.h里。<br />另外一种用法是"外部头文件保护符"， 如：<br /><br />------ a.h ------<br />AA<br /><br />------ b.h ------<br />#ifndef A_H<br />#define A_H<br />#include "a.h"<br />#endif<br />B<br /><br />------ c.h ------<br />#ifndef A_H<br />#define A_H<br />#include "a.h"<br />#endif<br />C<br /><br />当X同时包含b.h和c.h时， 最终效果和内部头文件保护符差不多。<br /><br />两者对比， 外部的优势是可以减少打开a.h的次数。<br />而内部保护符可以降低a.h和b.h,c.h之间的耦合。<br /><br /><br />5. 定义保护符<br /><br /><font style="line-height: 1.5" color="red">马上就要到主题了&#8230;&#8230;</font><br /><br />将头文件保护符的用法扩展一下， 就变成了定义保护符（这个名字是我捏造的）。<br />保护的不是某个"头文件" 而是某个"定义"， 如：<br /><br />------ a.h ------<br /><br />#ifndef A_X<br />#define A_X<br />struct x { ... };<br />#endif<br /><br />#ifndef A_M<br />#define A_M<br />#define M ...<br />#endif<br /><br />...<br /><br /><br />b.h和c.h直接包含a.h， 最终效果也是一样。<br /><br /><br />6. 重复的定义保护符<br /><br /><font style="line-height: 1.5" color="red">到主题了&#8230;&#8230;</font><br />同样是一个捏造的词。<br /><br />假设：<br />b.h包含a.h是为了获得struct x的定义。<br />而c.h包含a.h是为了获得宏M的定义。<br /><br />除了上面作法， 还有另一种做法：<br /><br />a.h和上面差不多 
<div class="blockcode" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<div id="code5" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<ol style="padding-right: 0px; list-style: decimal none outside; padding-left: 2em; padding-bottom: 0px; margin: 0px; line-height: 5px; padding-top: 0px"><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#ifndef X<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#define X<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">struct x { ... };<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#endif<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px"><br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#ifndef M<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#define M ...<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#endif</li></ol></div><em click="copycode($('code5'));"  .>复制代码</em></div>而b.h和c.h<font style="line-height: 1.5" color="red">并不包含a.h， 而是直接将需要的定义写在b.h和c.h中</font><br />------ b.h ------ 
<div class="blockcode" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<div id="code6" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<ol style="padding-right: 0px; list-style: decimal none outside; padding-left: 2em; padding-bottom: 0px; margin: 0px; line-height: 5px; padding-top: 0px"><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#ifndef X<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#define X<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">struct x { ... };<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#endif<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px"><br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">B</li></ol></div><em click="copycode($('code6'));"  .>复制代码</em></div>------ c.h ------ 
<div class="blockcode" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<div id="code7" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<ol style="padding-right: 0px; list-style: decimal none outside; padding-left: 2em; padding-bottom: 0px; margin: 0px; line-height: 5px; padding-top: 0px"><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#ifndef M<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#define M ...<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#endif<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px"><br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">C</li></ol></div><em click="copycode($('code7'));"  .>复制代码</em></div>这样做其实耦合比外部头文件保护符还要高， 所以一般是不会采用的。<br /><br />但<font style="line-height: 1.5" color="red">C的标准头文件必须这样做</font>。<br />因为C89有一个要求， 具体我不记得了。<br />要么是要求标准头文件不能包含其他标准头文件。<br />要么是要求标准头文件不能包含任何其他文件。<br />（C++和C99取消了这个要求）<br /><br /><br />stdio.h是C89的标准头文件。<br />例如， 它需要定义一个size_t， 作为一些函数的参数类型。<br />而另外有一些标准头文件也会有size_t。<br />所以这些头文件中的size_t都是这样提供的： 
<div class="blockcode" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<div id="code8" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; line-height: 1.5; padding-top: 0px">
<ol style="padding-right: 0px; list-style: decimal none outside; padding-left: 2em; padding-bottom: 0px; margin: 0px; line-height: 5px; padding-top: 0px"><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#ifndef _SIZE_T_DEFINED<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#define _SIZE_T_DEFINED<span class="Apple-converted-space">&nbsp;</span><br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">typedef unsigned xxx size_t;<br /></li><li style="padding-right: 1px; list-style: decimal none outside; padding-left: 1px; padding-bottom: 1px; margin: 1px; line-height: 1.5; padding-top: 1px">#endif</li></ol></div><em click="copycode($('code8'));"  .>复制代码</em></div>或者也可能将若干定义分组， 共用一个保护符。<br /><br /><br /><br />不知道lz遇到的是不是这个情况？</span></span><img src ="http://www.cppblog.com/luofeng225/aggbug/172826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luofeng225/" target="_blank">luofeng</a> 2012-04-26 15:49 <a href="http://www.cppblog.com/luofeng225/archive/2012/04/26/172826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>