头文件与命名冲突问题
2013-05-26 20:48
155 查看
前言
老是说,定义不能放在头文件中,因为会引起重定义。但在具体操作中,发现有些定义又不得不放在头文件中。咋办?实在是一头雾水。今晚就来解决这个问题。
分析原因并解决
重定义情况一:多个文件包含同一个头文件时,若有局部变量或者非内联函数定义在头文件中,则它们由于默认是全局的,因此就会产生重定义。
不信你可以试试,让某个头文件定义一个整型变量,然后几个文件都包含它,再一起编译,一定会报出重定义的错误的。因此,我们绝对不能将局部变量和非内联函数定义在头文件中。但请注意,类以及内联函数还有const变量可以。因为系统必须要这几种类型的具体定义才能够产生相应代码(光声明不行)。为此,系统默认每个包含在头文件中的类以及内联函数还有const变量为包含它们的头文件的那个源文件所私有。比如a.h里面声明了一个const int a,那么b.cpp包含了a.h的话b就会私有一个const a,c.cpp包含了a.h的话也会私有一个const
a,由于是私有,因此不冲突。
一句话:头文件中不能有定义,但是类,内联函数,const变量除外。
重定义情况二:同一个文件包含某个头文件多次时,一定会产生重定义(源文件比较多时,这种情况几乎可以认为肯定会出现)。不论是什么类型。
我们应该采用头文件保护符的方法杜绝这种现象。下面以具体实例子解决这个问题(很简单且实用哦)
有个类,类名为A,包含类定义的头文件是A.h,那么这个头文件应当使用下面的模板:
一句话:头文件的实现请使用上面这个模板(保护符)
做到上面两个“一句话”,这个问题就不是问题了。
(再罗嗦一句,头文件中必须使用完全限定的标准库名字,不要用using关键字)
老是说,定义不能放在头文件中,因为会引起重定义。但在具体操作中,发现有些定义又不得不放在头文件中。咋办?实在是一头雾水。今晚就来解决这个问题。
分析原因并解决
重定义情况一:多个文件包含同一个头文件时,若有局部变量或者非内联函数定义在头文件中,则它们由于默认是全局的,因此就会产生重定义。
不信你可以试试,让某个头文件定义一个整型变量,然后几个文件都包含它,再一起编译,一定会报出重定义的错误的。因此,我们绝对不能将局部变量和非内联函数定义在头文件中。但请注意,类以及内联函数还有const变量可以。因为系统必须要这几种类型的具体定义才能够产生相应代码(光声明不行)。为此,系统默认每个包含在头文件中的类以及内联函数还有const变量为包含它们的头文件的那个源文件所私有。比如a.h里面声明了一个const int a,那么b.cpp包含了a.h的话b就会私有一个const a,c.cpp包含了a.h的话也会私有一个const
a,由于是私有,因此不冲突。
一句话:头文件中不能有定义,但是类,内联函数,const变量除外。
重定义情况二:同一个文件包含某个头文件多次时,一定会产生重定义(源文件比较多时,这种情况几乎可以认为肯定会出现)。不论是什么类型。
我们应该采用头文件保护符的方法杜绝这种现象。下面以具体实例子解决这个问题(很简单且实用哦)
有个类,类名为A,包含类定义的头文件是A.h,那么这个头文件应当使用下面的模板:
#ifndef A_H #define A_H /* 写真正的头文件 */ #endif代码使用了预处理操作,确保了头文件中的定义只会被包含它的源文件执行一次。(这种简单的预处理就不解释了)
一句话:头文件的实现请使用上面这个模板(保护符)
做到上面两个“一句话”,这个问题就不是问题了。
(再罗嗦一句,头文件中必须使用完全限定的标准库名字,不要用using关键字)
相关文章推荐
- android R文件命名冲突问题
- 关于引入两个jquery.js文件引起$符号命名冲突的问题
- 关于设置红杏公益代理和下载.aar或.pom文件冲突的问题
- tomcat webdav文件上传读写冲突问题
- WCF服务策略文件的冲突问题
- jQuery解决引用多个JavaScript库引起的$命名冲突的问题
- Android文件命名问题
- jquery中,多js文件解决命名冲突
- jQuery命名库冲突的问题
- SEP 11.0 MR3与Office 2003 SP3冲突导致文件丢失问题
- iOS 制作静态库 .a 文件 和 .framework 文件 以及解决第三方库冲突问题 最后附上图片及Xib资源打包成 bundle (转载 mark 一下)
- spring注解与xml同时使用:bean命名问题及冲突
- Java笔记(学习一下Eclipse中的包、文件、命名空间的问题) 边走边聊
- 问题2:重新命名或者移动数据文件、日志文件到新的位置
- git pull 和本地文件冲突问题解决
- TP3.2批量上传文件(图片),解决同名冲突问题
- InfoPath Error “此文档库已经被重命名或删除,或者网络问题导致文件无法保存…” 的解决方案
- 解决jquery中美元符号命名冲突问题
- 实现KTV效果:播放歌曲,录音(存储录音文件),并同步播放录音 & 解释4.3以上audio与media资源冲突问题
- linux使用flock文件锁解决crontab冲突问题