export

1.函数模版的编译模式分两种完包含编译模式和局部编译模式 (需要用export关键字)
2.不同的编译器对这两种编译模式的支持各不相同,但一般都支持完全包含编译模式 (vc6.0就不支持export),具体支持情况需要参照具体使用的编译器文档

模版函数和普通函数在使用的时候有一定的区别:
(1)普通函数在使用的源文件中直接include该函数的声明即可
(2)模版函数在使用的源文件中既要include模版函数的声明,也要include模版函数的定义(因为只有在编译的时候,根据模版函数的定义进行实 例化后生成的函数才是真正的函数定义)

/举例说明完全包含编译模式:
(1)test.h中在声明的后面include "test.cpp",这样做的目的是把sum的声明和定义放在两个文件中
(2)first.cpp和second.cpp中都用到了sum函数模版,所以都要include "test.h",所以在两个cpp文件中都有一份sum的定义,所以在实例化以后,存在两个相同的函数定义:int sum(int a,int b){return a+b;}
(3)对于这种重复定义的问题,完全包含编译模式下,编译器自己会去除冗余的函数定义,而只保留一个int sum(int a,int b)函数的定义
(4)所以这种编译模式下,编译效率会降低(因为如果100的cpp文件中都调用了sum(2,3),那么会存在100个int sum(int a,int b)函数的定义,去除其余99个冗余定义的操作会占用大量的编译时间)

test.h头文件的内容:
template<typename Type>
Type sum(Type a,Type b);//函数模版的声明

#include "test.cpp"

test.cpp文件的内容:
template<typename Type>
Type sum(Type a,Type b)
{
return a+b;
}//函数模版的定义

first.cpp文件的内容:
#include "test.h"
int main()
{
sum(2,3);
return 0;
}

second.cpp文件的内容:
#include "test.h"
int second()
{
sum(2,3);
return 0;
}


所以为了避免完全编译模式的这种低效率,出现了局部编译模式
///举例说明局部编译模式
(1)test.h头文件中不需要再include "test.cpp"
(2)需要使用sum的cpp文件中只需要include "test.h"即可
(3)在实例化sum函数时,编译器会自动跟踪到sum函数模版的定义(通过export关键字)
(4)这样就提高了编译速度

test.h头文件的内容:
template<typename Type>
Type sum(Type a,Type b);//函数模版的声明

//#include "test.cpp"//不需要包含sum函数的定义

test.cpp文件的内容:
export template<typename Type>//前面加上export关键字
Type sum(Type a,Type b)
{
return a+b;
}//函数模版的定义

first.cpp文件的内容:
#include "test.h"
int main()
{
sum(2,3);
return 0;
}

second.cpp文件的内容:
#include "test.h"
int second()
{
sum(2,3);
return 0;
}

综上所述:export关键字只有在使用局部编译模式时才会用到,同时需要编译器支持局部编译模式,如果编译器不支持这种编译模式,那么不能使用 export

 

对类模板使用export更复杂一些 。通常,类声明必须放在头文件中,头文件中的类定义体不应该使用类关键字export,如果在头文件中使用了export,则该头文件只能被程序中的一个源文件使用。相反应该在类的实现文件中使用export:

// class template header goes in shared header file

template <class T> class Queue {……};

 

//Queue.cpp implemention file declares Queue as exported

exported template <class T> class Queue;

#include "Queue.h"

//Queue member definitions

导出类的成员将自动声明为导出的。也可以将类模板的个别成员的声明为导出的,在这种情况下,关键字export不在类模板本身指定,而是只在被导出的特定成员定义上指定。导出成员函数的定义不必在使用成员时可见。任意非导出成员的定义必须像在包含模型中一样对待:定义应放在类模板的头文件中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值