1..h和.chtml
关于.h和.c的关系,定义和声明打注意事项,我认为早就已经掌握地很清楚了.函数
https://blog.csdn.net/u013082827/article/details/74196167spa
规则有5条:.net
(1) 对应的.c文件中写变量、函数的定义
(2) 对应的.h文件中写共用的变量、函数的声明
(3) 若是有数据类型的定义 和 宏定义 ,请写的头文件(.h)中(仅做为参考)
(4) 模块的.c文件中别忘包含本身的.h文件
(5) 头文件里面尽可能只写共用的东西,毕竟.h做为同名.c的对外接口,不必为了所谓的 简洁,把全部的变量都往里面放。
--------------------- htm
2. 重复声明会出错?blog
有一次听别人说,重复声明会出错,还拿ifndef/define/endif 举例说明:接口
假如不会出错,还要ifndef/define/endif干吗?ip
当时感受颇有道理.get
不过渐渐地就怀疑了,这和我以前理解的不同啊.编译器
试了一下,重复声明不报错!
这就引出一个问题:ifndef/define/endif究竟是干吗用的?
3. ifndef/define/endif 的用途
针对同一个.h文件,假如里面有定义全局变量, 又被同一个.c文件直接或者间接包含屡次,就会有重复定义的风险.
经过添加ifndef/define/endif, 即便谁不懂事地在.h文件中定义变量,被同一个文件包含屡次也不会报错.
可是,这个.h文件被多个.c文件include还会报出redefine错误!
由于ifndef/define/endif 只管一个文件.
你写了.h文件,就有被多个.c文件include的危险.
参考: http://www.javashuo.com/article/p-svudohor-gg.html
4. 结合类的定义小结
对于普通变量,在同一个c文件下屡次定义会出现"重定义错误"; 在不一样c文件下定义,也会出现"重定义错误";
(固然不一样c文件在同一个project下面,且有连接关系)
经过ifndef/define/endif, 能够避免同一个文件屡次定义出现的"重定义错误",可是没法避免多个.c文件下的重定义错误;
然后者才是常见的错误, 特别是在头文件中定义了变量,头文件被多个.c包含的时候.
对于类的定义,就不一样了! 先说结论:
对于类, 在同一个c文件下屡次定义,会出现重定义错误; 在多个c文件中定义相同类,却不会出现重定义错误!
由于类的定义不产生目标代码,只是告诉编译器类的数据格式.
经过ifndef/define/endif, 能够避免同一个文件屡次定义类出现的"重定义错误",
因此,假如把类写到头文件中, 经过ifndef/define/endif 能够彻底避免类的重复定义问题.
参考连接:https://www.cnblogs.com/rocketfan/archive/2009/10/02/1577361.html
5. 因此,假若有人问我#ifndef/define/endif有什么做用?我应该这么回答:
该宏定义修饰头文件,防止头文件中存在类定义的时候,单个文件屡次包含该头文件,出现了类的重定义错误!
(重定义错误出现条件:头文件存在类定义 & 某个文件屡次包含该头文件)
再问:难道不能防止其余普通类型的重复定义吗?
回答:
假如你在头文件中定义普通类型,条件定义能够防止在同一文件包含多个头文件的重复定义,
但仍是不能防止多个文件包含头文件的重复定义。
既然在头文件定义了,就存在被多个文件包含的可能,因此这时的条件定义几乎没有意义,甚至会产生误导!
这是我最后一次总结定义和声明相关的知识点了,我保证!