c++1z模块会取代windows上的dllimport吗?

Will c++1z modules replace the need for dllimport dllexport on windows

本文关键字:dllimport 上的 windows 模块 取代 c++1z      更新时间:2023-10-16

我正在学习c++ 1z的模块提案。我最大的希望是它将取代dllimportdllexport在windows上的使用。使用c++1z模块,我是否能够在windows上构建.dll,在linux上构建.so,避免使用dllimport/dllexport ?模块export是所有平台和编译器所需要的吗?

遗憾的是,没有。

c++中模块的建议试图解决头文件中的缺陷,这些缺陷在涉及头文件的代码中变得尤其成问题。

模板通常完全在头文件中实现——但这意味着模板的内容受制于在包含头文件之前发生的任何预处理器定义。

例如,如果您的模板使用i作为标识符,并且碰巧在模板的头文件之前包含了类似#define i 2的头文件,那么您的代码可以这样开始:
for (int i=0; i<10 ; i++)

…但是在预处理器完成之后,它看起来像这样:

for (int 2=0; 2<20; 2++)

…这显然不能编译。

模块修复这个问题。模块是独立编译的,而不是在头文件中。因为它是独立编译的,所以一个模块不受其他头文件的影响,除非它的源代码包含这些头文件。

同样,头文件中的任何预处理器定义都不能影响导入该模块的任何代码。模块中唯一在导入该模块的文件中可见的名称是从该模块显式导出的名称。

仍然需要dlimport,但dlimport可能是自动的。至少在VS 2015 Update 1中的c++模块中,他们在一条注释中说:

Andrew Pardoe [MSFT]

@Matthias:程序员现在只需要对要在DLL边界导出的符号说__declspec(dllexport)。__declspec(dllimport)由编译器在使用模块时处理。

遗憾的是,我没有找到任何更可靠的信息。

可能。

我阅读了提交给标准委员会的c++20提案——它们现在在GitHub上——有一个可以涵盖这一点。它提出了一个新的[[shared]] c++属性来做这件事,并使它成为像GCC &MSVC实现它。不幸的是,它可能错过了进入c++20规范的机会,尽管他们仍有时间在最后一刻批准它。

我个人希望他们说"当然",并及时补充。这种属性语法的全部意义——以及其他一半的语言变化——是为了让我们不再需要宏。供应商特定的标准代码样板。比如,构建一个DLL。因此,如果他们不采纳这个建议,他们最终将不得不采纳类似的东西。