您的位置:首页 > 其它

头文件与命名冲突问题

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,那么这个头文件应当使用下面的模板:

#ifndef A_H
#define A_H

/* 写真正的头文件 */

#endif
代码使用了预处理操作,确保了头文件中的定义只会被包含它的源文件执行一次。(这种简单的预处理就不解释了)

一句话:头文件的实现请使用上面这个模板(保护符)

做到上面两个“一句话”,这个问题就不是问题了。

(再罗嗦一句,头文件中必须使用完全限定的标准库名字,不要用using关键字)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: