相信很多人在写c51程序是对.c文件和.h的用法不一定很清楚,糊涂的原因是概念不清。看了乾坤一笑先生的文章很有启发,尤其是举的小例子很值得思考,原文章出处http://www./document/viewdoc/?id=1606
现把乾坤一笑先生的文章复制下来修改一下,希望更容易别初学者,或者说菜鸟接收。。。。。 #define和#include命令在谭浩强的c语言教程中方在第九章预处理命令中讲述,原因有二: 1、预处理,就是在编译阶段干的事情,不是在执行阶段。 2、#define和#include有相似之处。都是其代替作用。 #include用谭浩强老师的说法叫“文件包含”。他的作用是在编译预处理时,对#include“aaa.*”处用aaa.*的中的内容全部代替,也就是下文中红色的内容。。
可能你还是有点疑惑,你有两个方法可以做,1、仔细看c语言教材(推荐)。2、接着往下看。 看下边下面这个例子,看看你有没有很清晰透彻的认识。 //a.h void foo(); //a.c #include "a.h" //我的问题出来了:这句话是要,还是不要? void foo(){ return;} //main.c #include "a.h" int main(int argc, char *argv[]) { foo(); return 0;} 针对上面的代码,请回答三个问题:
(请针对上面3道题仔细考虑10分钟,莫要着急看下面的解释。:) 考虑的越多,下面理解的就越深。) 好了,时间到!请忘掉上面的3道题,以及对这三道题引发出的你的想法,然后再听我慢慢道来。正确的概念是:从C编译器角度看,.h和.c皆是浮云,就是改名为.txt、.doc也没有大的分别。换句话说,就是.h和.c没啥必然联系。.h中一般放的是同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。这个声明有啥用?只是让需要用这些声明的地方方便引用。因为 #include "xx.h" 这个宏其实际意思就是把当前这一行删掉,把 xx.h 中的内容原封不动的插入在当前行的位置。由于想写这些函数声明的地方非常多(每一个调用 xx.c 中函数的地方,都要在使用前声明一下子),所以用 #include "xx.h" 这个宏就简化了许多行代码——让预处理器自己替换好了。也就是说,xx.h 其实只是让需要写 xx.c 中函数声明的地方调用(可以少写几行字),至于 include 这个 .h 文件是谁,是 .h 还是 .c,还是与这个 .h 同名的 .c,都没有任何必然关系。 这样你可能会说:啊?那我平时只想调用 xx.c 中的某个函数,却 include了 xx.h 文件,岂不是宏替换后出现了很多无用的声明?没错,确实引入了很多垃圾 ,但是它却省了你不少笔墨,并且整个版面也看起来清爽的多。鱼与熊掌不可得兼,就是这个道理。反正多些声明(.h一般只用来放声明,而放不定义,参见拙著“过马路,左右看”)也无害处,又不会影响编译,何乐而不为呢? 翻回头再看上面的3个问题,很好解答了吧?
参考文献和扩展阅读: 1)h文件里变量(函数)申明用不用extern http://www./linux/clf/program/archive/00/00/33/65/336569.html 2).c文件和.h文件的概念与联系 http://www./document/viewdoc/?id=1607 3)过马路,左右看 http://www./document/viewdoc/?id=1606 4).c和 .h文件的不同 http://hi.baidu.com/mfantastic/blog/item/d6fddd39793494f73a87ce0c.html 5)C51包含头文件方法 |
|