读书人

这个包含定义的头文件是如何保证不出现

发布时间: 2013-09-05 16:02:06 作者: rapoo

这个包含定义的头文件是怎么保证不出现重定义的?
我之前只知道头文件中只能包含声明,定义要放到。cpp文件中,否则可能会出现重定义的问题。这个头文件是怎么解决的呢?
http://www.stroustrup.com/Programming/Matrix/Matrix.h
[解决办法]


#ifndef MATRIX_LIB
#define MATRIX_LIB
...
#endif

这种结构会防止重复包含的,因为只有第一次包含的时候 MATRIX_LIB 是没有定义的,以后都会因为前次包含的时候 MATRIX_LIB 已经定义过了而跳过 ... 部分的。
[解决办法]
对于模板,一般模板类的定义和成员函数的实现一般是在同一个头文件中,不然在用的时候会出现重定义。不够是有几个模型可以解决这方面的问题,具体可以去看看模板方面的
[解决办法]
首先这里包含了一段防护代码,防止头文件的重声明问题。

#ifndef MATRIX_LIB
#define MATRIX_LIB
...
#endif


其次,对于模板来说,定义和声明其实没有什么差别。在收到真正的类型之前,编译器都不会对模板实例化,所以不存在写在.h中就会重定义的问题。
但是如果你分开定义的话就会造成重定义的问题了,即便你名称和声明一致也是不行的。举个例子:

// a.h
template<class T>void swap(T&,T&);
// a.cpp
#include"a.h"
template<class T>void swap(T&,T&){

}

就这个例子来说,swap的T可能是下面的任一个类型int、double或是其他的。因为T是一个未定义类型,所以即使写的一样,对编译器来说也无法确定是否真的一样。所以编译器不允许模板类出现2次。

在stroustrup的书里,明确的说了模板可以分开编译,但必须使用export关键字,表明不是一个新的定义。
模板在收到真正的类型前,编译器都不会进行实例化。即使定义和声明写的一样,编译器也无法确定是否是一个东西。

读书人网 >C++

热点推荐