关于HEAD文件里面直接定义函数的潜在弊端

来源:互联网 发布:域名注册的网站 编辑:程序博客网 时间:2024/04/29 12:14

弊端就是在函数之间的嵌套出现时出现的状况。额,还是从头说起:


HEAD文件的作用其实是对函数和变量的声明,但是我之前却在HEAD文件里面定义函数,这样有没有弊端。。。

HEAD和C文件的区别在哪里?

习惯上来讲,C文件不能被#include,但是如果你将其加入工程中,几个C文件都可以被编译,但是注意几个C文件中必须只能有一个MAIN()函数,也就是说除了放MAIN()函数的那个C其他C文件都是用来放子函数和局部变量的。


HEAD文件相对C文件就自由得多,HEAD文件可以使用

#ifndef...

#define...

 函数或变量的定义或声明

#endif

这种格式对函数或变量进行处理,但是网上也有人说了这个措施只能防止一个C文件对H文件的重复引用(本人未证实),所以感觉上还是不保险。所以多个C文件引用有定义函数程序的头文件的话会导致子函数的多次被定义。此处写的是C文件includeH文件时的情况,但如果H文件都已经定义函数了,那么要多个C文件还有什么意义。而且仅仅以单片机来说(IICAVR中已证实)如:

#include<a.h>

#include<b.h>

这一种顺序,先包括a的头文件,再包括b的头文件,编译时也是按照顺序来的,那么b.h中定义的函数就能直接引用a.h的函数,而不需要加比如extern void a(void);声明(实际上使用 void a(void)的声明也完全可以,因为编译完全是按照顺序来运行的)。而当然a.h引用b.h的函数肯定是要先声明的。


所以在单片机编程中(本人只证实ICCAVR),完全可以建立一个HEAD文件,文件里声明所有的子函数,然后首先inlude它。不要在一个H文件中include 另一个,使用这一种方法就是按编译的顺序来,在其中一个H文件中include另一个H文件,那么就是让后面的H文件先运行了,当然在习惯上也不能这样,这可能造成两个H文件相互include,理论上导致无限地编译,但是现在的大多数的编译器都可以识别出这个问题吧。

这种方式还有个问题,你无法立刻就查找出你所定义了函数的HEAD文件到底都定义了什么函数,因为有好几个H文件。


所以这就是一个定义子函数的C文件和一个声明C文件中的子函数的H文件一一对应的意义所在。

说到底C和H没有严格的区别,只是习惯上的问题,硬要说区别的话,经证实,C文件中不能用

#ifndef...

#define...

 函数或变量的定义或声明

#endif

这种格式来定义或声明 函数或者变量,而H却可以。


既然我们不能保证多个C都可以多次include一个H文件,那么H文件就做些人畜无害的事情吧,声明而已。(而实际上ICCAVR证实如果H文件定义函数,如果多次被include会报错(不管是被C或者H文件include),这是因为定义同一个名称的函数的事情不能重复做,所以这一当的关被编译器解决了,此段括号之前的话可以被忽略,当然不能重复定义,当然可以重复声明)。


而保险的措施则是HEAD文件仅仅是对函数或者外部变量的声明,声明而已,定义这种事情则是由不会被INCLUDE的C文件来做,这样H文件和C文件也做到一对一有条理一点。

归根结底,一C和一H对应是有条理一点,但是相比一C多H,一C一H在各个C文件的子函数相互嵌套比较多时,声明函数的无用功做的比较多,因为只是include a.h,可能只用到a.h中的其中一个函数而已却把其他函数也声明了。


至于多个声明会不会占单片的资源,我认为不会,因为声明仅仅是编译器规范化的自检而已,而子函数已经固化在FLASH中,任你怎么声明,我也想不出来会多出什么语句。



原创粉丝点击