export关键字的用法

转自:http://blog.csdn.net/yockie/article/details/8935921

            http://blog.chinaunix.net/uid-26611973-id-3391456.html

一、

export

为了访问其他编译单元(如另一代码文件)中的变量或对象,对普通类型(包括基本数据类、结构和类),可以利用关键字extern,来使用这些变量或对象时;但是对模板类型,则必须在定义这些模板类对象和模板函数时,使用标准C++新增加的关键字export(导出/出口/输出)。例如:

extern int n;

extern struct Point p;

extern class A a;

export template class Stack s;

export template void f (T& t) {……}

一般是在头文件中给出类的定义或全局函数的声明信息,而在代码文件中给出具体的(类成员函数或全局函数的)函数定义。然后在多个用户代码文件中包含该头文件后,就可以使用其中定义或声明的类和函数。头文件中一般不包含变量、结构和类对象的定义,因为这样可能会导致重复定义的编译错误。解决办法是,在某个代码文件中进行定义,在其他用户代码文件中用extern来引用它们。

但是对模板类型,则可以在头文件中,声明模板类和模板函数;在代码文件中,使用关键字export来定义具体的模板类对象和模板函数;然后在其他用户代码文件中,包含声明头文件后,就可以使用该这些对象和函数了。例如:

// out.h:(声明头文件——只包含out函数的声明信息)

template void out (const T& t);

// out.cpp:(定义代码文件——包含out函数的声明[通过include]和定义等全部信息)

#include

#include “out.h”

export template void out (const T& t) {std::cerr << t;}

//user.cpp:(用户代码文件——包含函数的声明头文件后就可以使用该函数)

#include “out.h”

// 使用out()

说明:VS目前还不支持export关键字(的编译)。




二、

1.函数模版的编译模式分两种:完包含编译模式和局部编译模式(需要用export关键字) 

2.不同的编译器对这两种编译模式的支持各不相同,但一般都支持完全包含编译模式,具体支持情况需要参照具体使用的编译器文档 

模版函数和普通函数在使用的时候有一定的区别: 
(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 
Type sum(Type a,Type b);//函数模版的声明 

#include "test.cpp" 

test.cpp文件的内容: 
template 
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 
Type sum(Type a,Type b);//函数模版的声明 

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

test.cpp文件的内容: 
export template//前面加上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

你可能感兴趣的:(C/C++)