c++1z模块会取代windows上的dllimport吗?
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++中模块的建议试图解决头文件中的缺陷,这些缺陷在涉及头文件的代码中变得尤其成问题。
模板通常完全在头文件中实现——但这意味着模板的内容受制于在包含头文件之前发生的任何预处理器定义。
例如,如果您的模板使用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。因此,如果他们不采纳这个建议,他们最终将不得不采纳类似的东西。
- Linux的Cpp上的计时器
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 物理键盘上的触发器按键
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 集合上的输出迭代器:assign和increment迭代器
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 对于set上的循环-获取next元素迭代器
- 如何从棋盘上的箱号中找到行和列
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- if数组上的随机数
- 向量上的线性搜索
- 位阵列上的快速AND运算
- 无法将 GLFW 库与 Ubuntu 18.04 上的头文件链接
- 为什么一个向量上的多线程操作很慢
- __declspec(dllimport)导致MSVC 2010上的编译器崩溃
- c++1z模块会取代windows上的dllimport吗?