已解决 类模板中分离时export产生的原因、作用和用法

查了N久的资料,很累,对于一个初学C++的忽然引入这个概念,纯粹就是一种灾难,


直接打击我学习的信心和动力。幸好浪费了两天,查出以下”半解“的知识。


初解:

背景:export目前支持的编译很少,据介绍只有一家编译器支持(虽然它是C++标准),VC6,7是不支持的。


原因:一般类模板的声明及定义都会放在一个头文件中,如果一个项目不大的情况下,是不关痛痒的。

           但是如果是一个大的项目,就出现麻烦了:因为模板的声明与定义都会在头文件中,很多这样的头文件都会包含进去,

            这样就会造成大量的资源紧张与浪费,增加系统开销,为了节约,当然C和C++的很多语句都是冲着”节约“而变化的,

           于是就产生了一个export,它的作用是做啥呢,就是把类模板的声明与定义分离开(就象普通类定义一样),声明在头文件中,

            定义在CPP文件中,这样,头文件包括就减轻了负担,同时根据需要才调用CPP中的类模板函数,这样就起到

           分流节约的目的,就相当于,一个大卡车不能通过山洞,但是如果把货物分成几份,分别通过山洞。


用法:在声明中保持不变,仅在定义的CPP文件中对模板函数成员前面加入export即可。

          这样这个CPP就可以单独编译,生成的对象文件可以用作使用该类模板的程序的一部分。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值