C++ Modules - why were they removed from C++0x? Will they be back later on?

我刚刚在 C + + 0x 中发现了这个关于模块的 旧的 C + + 0x 草案

我们的想法是摆脱水流。(小标题)。只写入 cpp 系统。Cpp 文件,然后在编译期间生成模块文件,然后由其他。Cpp 文件。

这看起来是个很棒的功能。

But my question is: why did they remove it from C++0x? Was it because of too many technical difficulties? Lack of time? And do you think they will consider working on it for an ulterior version of C++?

32474 次浏览

From the C + + 进化状态(旧金山邮报2008), the Modules proposal was categorized as "Heading for a separate TR:"

这些主题被认为非常重要,不能等到 C + + 0x 之后的另一个标准发布之后再进行讨论,但实验性太强,无法及时为下一个标准定稿。因此,这些特性将通过技术报告尽早交付。

The modules proposal just wasn't ready and waiting for it would have delayed finishing the C++0x standard. It wasn't really removed, it was just never incorporated into the working paper.

  1. 因为这是非常大的概念变化。
  2. There is no real need of it as separation of the sources to h/cpp does the job
  3. Because C++ does not define how actual "modules" libraries are build. It leaves 它到编译器开发人员和链接器。
  4. “模块”有时非常依赖于平台,例如,DLL 非常不同 所以在这些概念之间进行合并并非易事。

Clang 是第一个在标准化完成之前就开始处理模块的编译器。目前还没有太多的文档,但是可以在这里找到示例代码:
Http://llvm.org/viewvc/llvm-project/cfe/trunk/test/modules/

Douglas Gregor (实现它们的开发人员)的一些评论:
Http://clang-developers.42468.n3.nabble.com/c-modules-td3619936.html

理论上,您可以定义一组助手宏,比如 start _ module、 end _ module、 import _ module,以保护自己不受将来语法可能发生的任何变化的影响。

编辑1:
Douglas Gregor 发布了一份关于其实现的报告:
Http://llvm.org/devmtg/2012-11/gregor-modules.pdf?=submit

编辑2:
这里已经记录了对 clang 模块的支持:
http://clang.llvm.org/docs/Modules.html

编辑3:
现在微软的 C + + 编译器也支持模块: Http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1.aspx

C + + 模块草案(C + + 17之后的技术规范)

工作小组21在 open-std.org 上发布了 C/C + + 模块规范的草案和几个修订版本。我将在这里只链接到最新的文件:

  • Working Draft, Extensions to C++ for Modules 译自: 美国《科学》杂志网站(http://www.open-std.org/jtc1/sc22/wg21/docs/paper/2016/N4610.pdf)原著: http://www.open-std.org/jtc1/sc22/wg21/docs/paper/2016/N4610.pdf (October 2016).
  • 第四次修订为 译自: 美国《科学》杂志网站(http://www.open-std.org/jtc1/sc22/wg21/docs/paper/2016/P0142R0.pdf)原著: http://www.open-std.org/jtc1/sc22/wg21/docs/paper/2016/P0142R0.pdf(2016年3月)。
  • P0143R2出版的模块用语(2016年3月)。
  • Clang 团队已经发布了他们修改的第二版: 译自: 美国《科学》杂志网站(http://www.open-std.org/jtc1/sc22/wg21/docs/paper/2016/P0273R1.pdf)原著: http://www.open-std.org/jtc1/sc22/wg21/docs/paper/2016/P0273R1.pdf(2016年10月)。

The following blog posts contain a summary of the standards meetings and in particular a summary of the current status of the modules draft:

更新: 正如我在上面链接到的科纳之旅报告中所解释的,目前有两个竞争提案,一个来自微软,一个来自 Clang。Microsoft 提出的解决方案不允许导出宏,而 Clang 团队提出的解决方案将支持导出宏。到目前为止,只有微软正式提交了模块规范的草案。

Module specification as proposed by Microsoft

下面是本提案包含的最重要概念的快速概述。作为草案,这种情况仍有可能改变。新的模块标准除其他外将包括以下内容:

声明一个模块的 module关键字,多个文件可以声明这个关键字来构建一个模块(但是对于每个模块,只有一个 编译单元可以包含一个 export {}节) :

module M;

一个 import关键字导入模块,而不是 import它也可能被决定使用 using module代替,所以一个新的导入关键字可以避免。

import std.io;
import module.submodule;

export语法定义了作为该模块一部分的公共 声明,不应作为该模块一部分导出的非接口 声明将在导出块之外定义。声明可以是 C/C + + 中的任何类型的声明,也就是说,不仅是函数,还包括变量、结构、模板、名称空间和类:

export {
int f(int);
double g(double, int);


int foo;


namespace Calc {
int add(int a, int b);
}
}


void not_exported_function(char* foo);

模块的一个重要变化是,宏和预处理器定义将局部于模块,不会导出。因此,宏对导入的模块没有任何影响:

#define FILE "my/file"
import std.io;   //will not be impacted by the above definition

值得注意的是,目前的预处理器系统和模块将能够共存,头仍然可以使用,例如包括宏。

为了获得更详细的信息,我建议阅读草稿。

Clang 模块

Clang 一直在开发一个模块实现,可以在 叮当模块页面中找到。然而,Clang 目前还没有为模块实现具体的语法,也就是说,上面提到的任何语法都没有被 Clang 实现。为了解释这一点,该网页载有以下声明:

At present, there is no C or C++ syntax for import declarations. Clang will track the modules proposal 在 C + + 委员会中。请参阅作为导入的包含一节,了解今天如何导入模块。

Clang 目前实现的主要部分是“模块映射语言”,它允许为仍然使用头文件的现有代码编写模块映射。

模块宏导出

如上所述,目前尚不清楚宏观出口是否会成为最终 模块 TS的一部分。在 P0273R1中,为宏的导出提出了以下语法:

#export define MAX(A,B) ((A) > (B)) ? (A) : (B);