<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[C++——头文件的作用,C语言中的.h头文件到底有什么用？]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Sat, 23 Oct 2010 15:46:27 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	我也不是很懂，参考：http://blog.csdn.net/janders/archive/2006/02/27/611081.aspx<br/><br/>每个C++/C程序通常分为两个文件。一个文件用于保存程序的声明（declaration），称为头文件。另一个文件用于保存程序的实现（implementation），称为定义（definition）文件。<br/>C++/C程序的头文件以“.h”为后缀，C程序的定义文件以“.c”为后缀，C++程序的定义文件通常以“.cpp”为后缀（也有一些系统以“.cc”或“.cxx”为后缀）。<br/><br/>1.1 版权和版本的声明<br/>版权和版本的声明位于头文件和定义文件的开头（参见示例1-1），主要内容有：<br/>（1）版权信息。<br/>（2）文件名称，标识符，摘要。<br/>（3）当前版本号，作者/修改者，完成日期。<br/>（4）版本历史信息。<br/><br/><br/>/*<br/>* Copyright (c) 2001,老妖工作室<br/>* All rights reserved.<br/>*<br/>* 文件名称：filename.h<br/>* 文件标识：见配置管理计划书<br/>* 摘&nbsp;&nbsp;&nbsp;&nbsp;要：简要描述本文件的内容<br/>*<br/>* 当前版本：1.1<br/>* 作&nbsp;&nbsp;&nbsp;&nbsp;者：输入作者（或修改者）名字<br/>* 完成日期：2001年7月20日<br/>*<br/>* 取代版本：1.0<br/>* 原作者&nbsp;&nbsp;：输入原作者（或修改者）名字<br/>* 完成日期：2001年5月10日<br/>*/<br/><br/>示例1-1 版权和版本的声明<br/><br/>1.2 头文件的结构<br/>头文件由三部分内容组成：<br/>（1）头文件开头处的版权和版本声明（参见示例1-1）。<br/>（2）预处理块。<br/>（3）函数和类结构声明等。<br/>假设头文件名称为 graphics.h，头文件的结构参见示例1-2。<br/>【规则1-2-1】为了防止头文件被重复引用，应当用ifndef/define/endif结构产生预处理块。<br/>【规则1-2-2】用 #include &lt;filename.h&gt; 格式来引用标准库的头文件（编译器将从标准库目录开始搜索）。<br/>【规则1-2-3】用 #include “filename.h” 格式来引用非标准库的头文件（编译器将从用户的工作目录开始搜索）。<br/>【建议1-2-1】头文件中只存放“声明”而不存放“定义”<br/>在C++ 语法中，类的成员函数可以在声明的同时被定义，并且自动成为内联函数。这虽然会带来书写上的方便，但却造成了风格不一致，弊大于利。建议将成员函数的定义与声明分开，不论该函数体有多么小。<br/>【建议1-2-2】不提倡使用全局变量，尽量不要在头文件中出现象extern int value 这类声明。<br/><br/><br/>// 版权和版本声明见示例1-1，此处省略。<br/>#ifndef&nbsp;&nbsp; GRAPHICS_H&nbsp;&nbsp;// 防止graphics.h被重复引用<br/>#define&nbsp;&nbsp; GRAPHICS_H<br/>#include &lt;math.h&gt;&nbsp;&nbsp;&nbsp;&nbsp; // 引用标准库的头文件<br/>…<br/>#include “myheader.h”&nbsp;&nbsp; // 引用非标准库的头文件<br/>…<br/>void Function1(…);&nbsp;&nbsp; // 全局函数声明<br/>…<br/>class Box&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 类结构声明<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;…<br/>&nbsp;&nbsp;&#125;;<br/>#endif<br/><br/>示例1-2 C++/C头文件的结构<br/><br/>1.3 定义文件的结构<br/>定义文件有三部分内容：<br/>（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义文件开头处的版权和版本声明（参见示例1-1）。<br/>（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对一些头文件的引用。<br/>（3）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序的实现体（包括数据和代码）。<br/>假设定义文件的名称为 graphics.cpp，定义文件的结构参见示例1-3。<br/><br/><br/>// 版权和版本声明见示例1-1，此处省略。<br/>#include “graphics.h”&nbsp;&nbsp;&nbsp;&nbsp; // 引用头文件<br/>…<br/>// 全局函数的实现体<br/>void Function1(…)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;…<br/>&nbsp;&nbsp;&#125;<br/>// 类成员函数的实现体<br/>void Box::Draw(…)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;…<br/>&nbsp;&nbsp;&#125;<br/><br/>示例1-3 C++/C定义文件的结构<br/><br/>1.4 头文件的作用<br/>早期的编程语言如Basic、Fortran没有头文件的概念，C++/C语言的初学者虽然会用使用头文件，但常常不明其理。这里对头文件的作用略作解释：<br/>（1）通过头文件来调用库功能。在很多场合，源代码不便（或不准）向用户公布，只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能，而不必关心接口怎么实现的。编译器会从库中提取相应的代码。<br/>（2）头文件能加强类型安全检查。如果某个接口被实现或被使用时，其方式与头文件中的声明不一致，编译器就会指出错误，这一简单的规则能大大减轻程序员调试、改错的负担。<br/><br/><br/>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/shineHoo/archive/2010/01/21/5220422.aspx<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>不知道大家注意到没有， 我感觉在一个模块中应用另一个模块的函数时，只要在链接时指定好要应用函数的库就ok了。<br/>用不着在引用模块中加一个定义被引用函数的头文件，以前也碰到过这样的问题，有人告诉我说，头文件起到了<br/>类型检查的作用，也就是在编译时，如果调用的函数参数不对，就会报错。<br/>但是我实验了一下，好像没这个问题，比如我在main.c中调用了func.c中的void func(void)函数，但是我在main中<br/>这样调用func(1,2)，结果编译正常，运行也正常，加不加func.h文件，都是一样的效果。。。。<br/>当然在C++中，就不能这样了，要是没头文件，就会报错的，因为编译出来的符号中有参数<br/>所以我感觉这个.h头文件在C语言中好想根本就没用，，大家说说，这个头文件会有什么作用？<br/>我的环境是linux+gcc<br/><br/>例子：<br/>main.c: int main()<br/><br/>&#123;<br/><br/>#if 0<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;func();<br/><br/>#else<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;func(1, 2);<br/><br/>#endif<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br/><br/>&#125;<br/>复制代码func.c: #include &lt;stdio.h&gt;<br/><br/><br/><br/>void func(void)<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;in func&#92;n&quot;);<br/><br/>&#125;<br/>Makefile:<br/> SRC=func.c &#92;<br/><br/>main.c<br/><br/><br/><br/>OBJ=$(SRC:.c=.o)<br/><br/><br/><br/>prog: $(OBJ)<br/><br/>gcc -Wall -o $@ $^<br/><br/><br/><br/>$(OBJ): $(SRC)<br/><br/>gcc -c $^<br/>.PHONY:clean<br/><br/>clean:<br/><br/>-rm *.o prog<br/>复制代码这个例子里面调用的就是很极端的情况，也就是没有头文件，而且函数调用的也是错误的。但是我的运行ok<br/><br/>C 语言不是强类型的，所以如果参数类型不对，是不会出错的，但gcc -Wall是会给warning的<br/><br/>所以以前的C语言的函数的前向声明，是不带参数的。<br/><br/><br/>头文件的函数前向声明还是有用的，主要是返回值。如果没有头文件，那么返回值会被当做 int 处理，在函数实际返回其他类型（例如double）的时候，可能会引起意想不到的问题。<br/><br/><br/>从良好的编程习惯来说，还是写全类型，加上 -Wall ，让编译器帮忙多做一些检查。<br/>
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] C++——头文件的作用,C语言中的.h头文件到底有什么用？]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>