C++中 export关键字的使用

https://www.cnblogs.com/onlycxue/archive/2012/12/22/2828863.html

export

导出模版,用于分离编译。当初标准委员会未经充分实践支持匆忙通过了这一决定,被EDG证明具备不现实的可用性(即便EDG唯一地实现了这一个特性,他们也表示反对) [7]   。MSVC、GCC、Clang等其它主流编译器前端都没有实现这一特性,甚至这是唯一明显约定不符合C++98/03的特性。C++11废除了这个 export关键字的含义,但保留这个关键字,供以后使用 [3]   

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

extern int n;

extern struct Point p;

extern class A a;

export template<class T> class Stack<int> s;

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

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

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

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

template<class T> void out (const T& t);

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

#include <iostream>

#include “out.h”

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

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

#include “out.h”


C++20之前,C++语言并没有`export`关键字。而在C++20,`export`关键字被引入用于模板的分离编译。 在C++,模板的定义和实现通常都放在头文件,当使用模板时,编译器需要实例化并编译模板的定义和实现。如果有多个源文件都使用了同一个模板,那么模板的定义和实现就会被重复编译,这会导致编译时间的增加和二进制文件的增大。 通过使用`export`关键字,可以将模板的定义和实现分离开来,将实现部分放在一个单独的源文件,然后在使用模板的源文件通过`import`关键字引入该实现文件,这样就可以避免模板的重复编译,提高编译效率并减小二进制文件的大小。 下面是一个简单的示例: ```C++ // math.hpp export template<typename T> T add(T a, T b) { return a + b; } ``` ```C++ // math.cpp export module math; import <iostream>; export template<typename T> T add(T a, T b) { std::cout << "add() is called" << std::endl; return a + b; } ``` ```C++ // main.cpp import <iostream>; import math; int main() { std::cout << add(1, 2) << std::endl; return 0; } ``` 在上面的示例,`math.hpp`定义了一个`add`函数模板,`math.cpp`实现了`add`函数模板,并使用`export`关键字将其导出为`math`模块。`main.cpp`使用了`import`关键字引入了`math`模块,并调用了`add`函数模板。 需要注意的是,目前并不是所有的编译器都支持`export`关键字,而且`export`关键字使用也需要遵循一定的规范,具体可以参考C++20的相关文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值