据我所了解,“export”关键字可用于通过头文件公开模板类或函数签名,并将实际实现抽象到库文件中。
请问有人能提供一个实际的示例程序来展示如何做到这一点吗?
在使用此功能时,是否存在任何缺点或需要注意的重要事项?
编辑:根据答案的回答,提出一个后续问题。如答案所述,“export”已在C++0x中被弃用,并且即使是针对C++03x,编译器也很少支持。在这种情况下,有什么方法可以隐藏实际的实现以及只通过头文件公开声明,以便最终用户可以知道公开API的签名,但不能访问实现相同的源代码?
据我所了解,“export”关键字可用于通过头文件公开模板类或函数签名,并将实际实现抽象到库文件中。
请问有人能提供一个实际的示例程序来展示如何做到这一点吗?
在使用此功能时,是否存在任何缺点或需要注意的重要事项?
编辑:根据答案的回答,提出一个后续问题。如答案所述,“export”已在C++0x中被弃用,并且即使是针对C++03x,编译器也很少支持。在这种情况下,有什么方法可以隐藏实际的实现以及只通过头文件公开声明,以便最终用户可以知道公开API的签名,但不能访问实现相同的源代码?
注意:本答案关于C++20之前export
的历史用途;C++20将该关键字重新用于模块。
首先:大多数编译器(包括gcc、Clang和Visual Studio)不支持export
关键字。
它只在EDG前端实现,并且只有使用它的编译器(如Comeau和icc)支持此功能。EDG的实现者反馈非常简单:这花费了我们时间,非常复杂,我们建议不要实现它(1),因此它已在C++0x中被删除。
现在,标准允许(至少gcc实现了以下内容):
并使其行为与常规函数相同。
注意:正如Johannes在评论中指出的那样,如果在头文件中定义了函数的全特化,则必须将其标记为inline,否则链接器将会报错。
编辑:
(1) 最终找到我的参考文献为什么我们负担不起使用export(PDF),由Tom Plum编写,由Edison Design Group的Steve Adamczyk、John Spicer和Daveed Vandevoorde进行审查,他们最初在EDG前端中实现了它。
export
,但没有进入正式投票)。 - MSalters“Export” 在C++标准中已经被移除,请勿使用。
http://msmvps.com/blogs/vandooren/archive/2008/09/24/c-keyword-of-the-day-export.aspx
最好实例化你的模板。我读了一篇文章,标题大概是“不支持导出”,而且它也无法实现你想要的功能。
唯一能做到你想要的就是全面专业化,正如先前所说。但更重要的是,如果你看不到库的源代码,那么你就无法编译它。这意味着你无法接受来自库的动态内存,因为没有保证你将使用与其相匹配的 delete。例如,如果我的代码是 debug 模式而库是 release 模式,删除器将不匹配 new。你可以使用 shared_ptr 并提供删除器,但那是 TR1,并没有导出。
C++11现在有“extern templates”,这已经得到了现代编译器的良好支持。
export
关键字在 C++20 中得到支持,与模块语言特性(https://en.cppreference.com/w/cpp/language/modules)一起使用。