C++ export
C++ export
- 一 简介
- 二 模板定义的位置在哪里?是.cpp文件吗?
- 三 模板一般用法
- 四 参考
一 简介
C++11前: 用于标注一个模板定义被导出,这允许在其他翻译单元中声明,但不定义同一模板
C++11起: 不使用,并保留该关键字
二 模板定义的位置在哪里?是.cpp文件吗?
本节摘自: 任何时候都适用的20个C++技巧
通常情况下,你会在.h文件中声明函数和类,而将它们的定义放置在一个单独的.cpp文件中。但是在使用模板时,这种习惯性做法将变得不再有用,因为当实例化一个模板时,编译器必须看到模板确切的定义,而不仅仅是它的声明。 因此,最好的办法就是将模板的声明和定义都放置在同一个.h文件中。这就是为什么所有的STL头文件都包含模板定义的原因。
另外一个方法就是使用关键字“export”!你可以在.h文件中,声明模板类和模板函数;在.cpp文件中,使用关键字export来定义具体的模板类对象和模板函数;然后在其他用户代码文件中,包含声明头文件后,就可以使用该这些对象和函数了。例如:
// output.h - 声明头文件
template<class T> void output (const T& t);// out.cpp - 定义代码文件
#include <****>
export template<class T>
void output (const T& t) {std::cerr << t;}//main.cpp:用户代码文件
#include "output.h" void main() // 使用output()
{ output(4); output("Hello");
}
某种程度上,这有点类似于为了访问其他编译单元(如另一代码文件)中普通类型的变量或对象而采用的关键字extern。 但是,这里还有一个不得不说的问题:并非所有的编译器都支持export关键字(我们最熟悉、最常用的两款编译器VS 和 GCC就是不支持export的典型代表)。
对于这种不确定,最好的方法就是采用解决方案一:声明定义放在一起,虽然这在某种程度上破坏了C++编程的优雅性。 分离编译模式(Separate Compilation Model)允许在一处翻译单元(Translation Unit)中定义(define)函数、类型、类对象等,在另一处翻译单元引用它们。编译器(Compiler)处理完所有翻译单元后,链接器(Linker)接下来处理所有指向 extern符号的引用,从而生成单一可执行文件。 该模式使得 C++ 代码编写得称心而优雅。
然而该模式却驯不服模板(Template)。标准要求编译器在实例化模板时必须在上下文中可以查看到其定义实体;而反过来,在看到实例化模板之前,编译器对模板的定义体是不处理的——原因很简单,编译器怎么会预先知道 typename 实参是什么呢? 因此模板的实例化与定义体必须放到同一翻译单元中。
以优雅著称的 C++ 是不能容忍有此“败家玩意儿”好好活着的。标准 C++为此制定了“模板分离编译模式(Separation Model)”及 export 关键字。 然而由于 template 语义本身的特殊性使得 export 在表现的时候性能很次。 编译器不得不像 .net 和 java 所做的那样,为模板实体生成一个“中间伪代码(IPC,intermediate pseudo - code)”,使得其它翻译单元在实例化时可找到定义体; 而在遇到实例化时,根据指定的 typename 实参再将此 IPC 重新编译一遍,从而达到“分离编译”的目的。因此,该标准受到了几乎所有知名编译器供应商的强烈抵制。 谁支持 export 呢?Comeau C/C++ 和 Intel 7.x 编译器支持。
三 模板一般用法
举例:
// export.hpp
#include <iostream>
template<typename T1, typename T2>
void add(T1 t1, T2 t2) {std::cout << t1 + t2 << std::endl;
}
#include <iostream>
#include "export.hpp"
int main() {add(1, 1.2);system("pause");return 0;
}
四 参考
export
C++ export相关推荐
- 浅显易懂 Makefile 入门 (10)— 嵌套执行 make、export 的使用
1. 嵌套执行 make 在一个大的工程文件中,不同的文件按照功能被划分到不同的模块中,每个模块可能都会有自己的编译顺序和规则,如果在一个 Makefile 文件中描述所有模块的编译规则,就会很乱,执 ...
- module.exports 和 export default
CommonJS模块规范和ES6模块规范完全是两种不同的概念 CommonJS模块规范 Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一 ...
- oracle数据库 export,转:Oracle数据库的备份方法——使用export作为备份
5.使用export作为备份策略 5.1 export的命令选项说明 Oracle数据库的exp工具提供tables.users.full database.tablespace四种级别的导出方式,把 ...
- linux 脚本的作用,shell export 作用
shell与export命令用户登录到Linux系统后,系统将启动一个用户shell.在这个shell中,可以使用shell命令或声明变量,也可以创建并运行 shell脚本程序.运行shell脚本程序 ...
- ES6中export及export default的区别
在ES6中,export和export default均可用于导出常量.函数.文件.模块等,你可以在其他文件或模块中通过import + (常量 | 函数 | 文件 | 模块)名的方式将其导入,以便能 ...
- 1.3 Quick Start中 Step 7: Use Kafka Connect to import/export data官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Step 7: Use Kafka Connect to import/export ...
- R语言gganimate包创建可视化gif动图、并使用anim_save函数保存可视化gif动图(gganimate export to gif)
R语言gganimate包创建可视化gif动图.并使用anim_save函数保存可视化gif动图(gganimate export to gif) 目录
- ubuntu18.04.4 环境变量设置 export path
ubuntu18.04.4 环境变量设置 export path 1.动态库路径的设置 Linux下调用动态库和windows不一样.linux 可执行程序是靠配置文件去读取路径的,因此有些时候需要设 ...
- 报错解决:-bash: export: `g++11=g++': not a valid identifier
晚上在设置环境变量的时候报错如下: zhang@ubuntu:~$ export g++11=g++ -bash: export: `g++11=g++': not a valid identifie ...
- php 导出excel 特殊字符,export 导出的excel sheet名字包含特殊字符
SAS 官网上有相似的问题可以参考 http://support.sas.com/kb/33/255.html Problem Note 33255: Dashes mistranslated to ...
最新文章
- 浮点类型和布尔类型(Java)
- 论文笔记:Spherical CNN
- swf缓存文件在哪里_面试官:mybatis一级缓存二级缓存的区别都不知道,知道门在哪吧...
- Java——多线程(铁路售票系统案例)
- 为什么c语言运行了是cmd,为什么C语言的程式码执行都在命令提示符进行?而且学习的基本都是数学问题,跟开发软体有什么关系?...
- 英雄联盟服务器维修中启动游戏失败,电脑登录英雄联盟失败的八种解决方法
- 恋爱策略:“没女”也能胜美女
- 设置安卓app页面强制横屏或者竖屏,不随手机姿势变化
- 软件测试工程师的工资有多高?
- Vue表格实现隔行变色
- Livox激光MID-360使用与fast-lio2激光SLAM建图
- Pycharm中 No module ‘自定义模块‘ 的问题(mmrotate)
- 【运维面试】面试官:你们公司的docker主要用来做啥?
- 使用php写输出hello的代码,如何使用php输出hello world?-PHP问题
- 机器人杆长标定_一种SCARA机器人标定方法与流程
- php 用pdf转html,在PHP中将PDF转换为HTML,类似于DocuSign
- 白盒测试技术含量不一定比黑盒测试高
- python操作excel----读写
- 方波分解与合成的电路验证
- CCNA考试的注意事项
热门文章
- sicily 1419
- 两个字符串的最长公共子序列长度_求2个字符串的最长公共子序列和最长公共子字符串...
- 自定义SharpDevelop5.1/5.2的代码智能提示(代码完成)快捷键
- 上海信托面试20190820
- 《C++项目开发实战入门》攻坚战
- 最大化控制资源成本 华为OD真题 200
- oracle limit
- 关于南京市软件行业协会程序员分会(筹)吸收第一期正式会员(兼工作人员)的通知]
- scanf返回值被忽略问题
- 1160-1169: 例题5-1-1 连续自然数求和(1160-1169)