代码之家  ›  专栏  ›  技术社区  ›  Tomaka17

C++模块——为什么从C++ 0x中删除它们?他们以后还会回来吗?

  •  110
  • Tomaka17  · 技术社区  · 15 年前

    old C++0x draft 关于C++中的模块。

    这看起来是一个非常棒的功能。

    但我的问题是:为什么他们把它从C++ 0x中删除?是因为太多的技术困难吗?时间不够?您认为他们会考虑为C++的另一个版本工作吗?

    4 回复  |  直到 11 年前
        1
  •  71
  •   James McNellis    15 年前

    State of C++ Evolution (Post San Francisco 2008)

    这些主题被认为太重要了,不能等待C++发布后的另一个标准,但太过实验,无法及时下一个标准。因此,技术报告将尽早提供这些特性。

    模块建议还没有准备好,等待它会延迟完成C++ 0x标准。它并没有被真正删除,只是从未被纳入工作文件。

        2
  •  90
  •   lanoxx    9 年前

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

    一份关于C/C++模块规范的草案和几次更新的修订已经发表。 WG21 打开-标准组织. 我将仅在此处链接到最新文档:

    • N4610 (2016年10月)。
    • 第四次修订发布为 P0142R0
    • 发布为的模块的措辞 P0143R2 (2016年3月)。
    • clang团队发布了第二次修订版: P0273R1 (2016年10月)。

    正如我在上面链接的Kona-trip报告中所解释的,目前有两个相互竞争的方案,一个来自微软,一个来自Clang。微软提出的解决方案不允许导出宏,而Clang团队的解决方案则支持导出宏。到目前为止,只有微软正式提交了模块规范草案。

    微软提出的模块规范

    以下是本提案所包含的最重要概念的简要概述。作为一个草案,这可能仍然会改变。新的模块标准将包括以下内容:

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

    module M;
    

    import 关键字来导入模块,而不是 进口 也可以决定使用 using module 相反,可以避免使用新的import关键字。

    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一直致力于一个模块实现,可以在 the clang modules page

    目前,对于导入声明没有C或C++语法。Clang将跟踪模块提案 在C++委员会中。请参阅includesas imports部分,以了解模块今天是如何被导入的。

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

    从模块导出宏

    模块TS . 在 建议使用以下语法导出宏:

    #export define MAX(A,B) ((A) > (B)) ? (A) : (B);
    
        3
  •  32
  •   zah    10 年前

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

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


    Douglas Gregor发布了一个关于其实现的演示:
    http://llvm.org/devmtg/2012-11/Gregor-Modules.pdf?=submit

    编辑2:

    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

        4
  •  -41
  •   Artyom    15 年前
    1. 因为将源分离到h/cpp就可以完成这项工作,所以没有真正的需要
    2. 因为C++没有定义如何构建实际的“模块”库。它离开了 它可以连接到编译器开发人员和链接器。
    3. “模块”有时非常依赖于平台,例如DLL非常不同 来自共享对象。因此,在这些概念之间进行合并并不是那么简单。