关于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中,任你怎么声明,我也想不出来会多出什么语句。
- 关于HEAD文件里面直接定义函数的潜在弊端
- 略论工程文件的弊端
- 关于Action里面定义的变量问题
- 关于ttx文件里面的字段定义改变以后对水晶报表的更新
- 学习类,笔记!关于一个函数里面定义多个类以及相互访问的问题
- 在定义文件里面设置Action里面的变量
- 关于在头文件中定义函数的缺点
- html head 里面的标签
- 关于SparkStreaming的checkpoint的弊端
- C++如何在.h头文件中直接定义函数
- C++头文件中直接定义函数报错与否
- node.js关于一个js文件引用另一个js文件里面的函数或者数组变量
- 直接添加json文件里面的所有配置信息
- 关于main函数的定义
- Document 对象属性和方法:例如document.scripts...直接获取html中包括head和body里面的内容
- 关于keil c51里面的 printf 函数
- 关于AppDelegate里面的那些函数方法
- 关于AppDelegate里面的函数方法
- 十八年开发经验分享(二)问题解决篇(上)
- 反汇编系列(九) 算法反汇编
- 1375. Balanced lineup(求最长包含同数量不同品种坐标长度)
- OS复习-内存管理
- 如何解决在Centos上面用yum不能安装redis
- 关于HEAD文件里面直接定义函数的潜在弊端
- iOS UILabel 自适应
- [Java] java连接sql server 2005 数据库心得
- 《coredump问题原理探究》Linux x86版第一章前言
- 使用 SSH 远程连接运行图形界面程序(ubuntu)
- IOS一些细节问题
- CRC计算校验码过程
- 转:有关于数字证书及ssl加密的介绍
- 做你的蓝颜知己