windows 上的 c++1z 模块是否会取代对 dllimport dllexport 的需求
Will c++1z modules replace the need for dllimport dllexport on windows
我正在了解 C++1z 的模块提案。我最大的希望是它将取代 dllimport
、dllexport
在 windows 上的用法。使用 c++1z 模块,我是否能够在 windows 上构建 .dll
并在 linux 上构建 .so
而避免使用 dllimport/dllexport
?模块 export
是否是所有平台和编译器所需的全部?
很遗憾,没有。
C++ 中的模块提案试图解决 headers 中的缺点,这些缺点对于涉及 headers 的代码尤其成问题。
模板通常完全在 header 中实现——但这意味着模板的内容将受制于在包含 header 之前发生的任何预处理器定义。
例如,如果您的模板使用 i
作为标识符,并且带有类似 #define i 2
的 header 恰好包含在模板的 header 之前,您的代码可以这样开始:
for (int i=0; i<10 ; i++)
...但是预处理器完成后,它看起来像这样:
for (int 2=0; 2<20; 2++)
...显然根本无法编译。
模块解决了这个问题。模块是独立编译的,而不是在 header 中。由于它是独立编译的,因此模块不受其他 header 的影响,除非其源代码包含那些 header。
同样,在 header 中进行的任何预处理器定义都不会影响任何导入模块的代码。模块中唯一在导入该模块的文件中可见的名称是从模块中显式导出的名称。
仍然需要 dllexport,但 dllimport 可能是自动的。至少在 C++ Modules in VS 2015 Update 1 他们在一条评论中说:
Andrew Pardoe [MSFT]
@Matthias: The programmer now only needs to say __declspec(dllexport) for symbols that are to be exported at DLL boundaries. the __declspec(dllimport) is taken care of by the compiler when consuming a module.
很遗憾,我没有找到关于它的更可靠的信息。
可能。
我阅读了提交给标准委员会的 c++20 提案——它们现在在 GitHub——并且有一个可以涵盖这一点。它提出了一个新的 [[shared]] c++ 属性来执行此操作,并强制要求 GCC 和 MSVC 等编译器实现它。不幸的是,它可能错过了进入 c++20 规范的 window,尽管他们还有时间在最后一刻批准它。
个人希望大家说"sure"及时补充。这个属性语法的全部要点 - 以及这些其他语言变化的一半 - 据推测是使我们能够停止在正常代码中需要宏和特定于供应商的样板。比方说,就像构建一个 DLL 一样。所以如果他们不采纳这个提议,他们最终将不得不采纳类似的东西。
我正在了解 C++1z 的模块提案。我最大的希望是它将取代 dllimport
、dllexport
在 windows 上的用法。使用 c++1z 模块,我是否能够在 windows 上构建 .dll
并在 linux 上构建 .so
而避免使用 dllimport/dllexport
?模块 export
是否是所有平台和编译器所需的全部?
很遗憾,没有。
C++ 中的模块提案试图解决 headers 中的缺点,这些缺点对于涉及 headers 的代码尤其成问题。
模板通常完全在 header 中实现——但这意味着模板的内容将受制于在包含 header 之前发生的任何预处理器定义。
例如,如果您的模板使用 i
作为标识符,并且带有类似 #define i 2
的 header 恰好包含在模板的 header 之前,您的代码可以这样开始:
for (int i=0; i<10 ; i++)
...但是预处理器完成后,它看起来像这样:
for (int 2=0; 2<20; 2++)
...显然根本无法编译。
模块解决了这个问题。模块是独立编译的,而不是在 header 中。由于它是独立编译的,因此模块不受其他 header 的影响,除非其源代码包含那些 header。
同样,在 header 中进行的任何预处理器定义都不会影响任何导入模块的代码。模块中唯一在导入该模块的文件中可见的名称是从模块中显式导出的名称。
仍然需要 dllexport,但 dllimport 可能是自动的。至少在 C++ Modules in VS 2015 Update 1 他们在一条评论中说:
Andrew Pardoe [MSFT]
@Matthias: The programmer now only needs to say __declspec(dllexport) for symbols that are to be exported at DLL boundaries. the __declspec(dllimport) is taken care of by the compiler when consuming a module.
很遗憾,我没有找到关于它的更可靠的信息。
可能。
我阅读了提交给标准委员会的 c++20 提案——它们现在在 GitHub——并且有一个可以涵盖这一点。它提出了一个新的 [[shared]] c++ 属性来执行此操作,并强制要求 GCC 和 MSVC 等编译器实现它。不幸的是,它可能错过了进入 c++20 规范的 window,尽管他们还有时间在最后一刻批准它。
个人希望大家说"sure"及时补充。这个属性语法的全部要点 - 以及这些其他语言变化的一半 - 据推测是使我们能够停止在正常代码中需要宏和特定于供应商的样板。比方说,就像构建一个 DLL 一样。所以如果他们不采纳这个提议,他们最终将不得不采纳类似的东西。