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

Tom*_*a17 110 c++ standards module language-extension c++11

我刚刚发现关于C++ 0x中模块的旧C++ 0x草案.

我们的想法是通过只编写.cpp文件退出当前的.h/.cpp系统,然后在编译过程中生成模块文件,然后由其他.cpp文件使用.

这看起来非常棒.

但我的问题是:为什么他们从C++ 0x删除它?是因为太多的技术难题?时间不够?你是否认为他们会考虑使用它来获得一个不可思议的C++版本?

lan*_*oxx 89

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

WG21在open-std.org上发布了关于C/C++模块规范的草案和几个更新的修订版.我将仅链接到此处的最新文档:

  • 工作草案,扩展到C++ for Modules N4610(2016年10月).
  • 第四版修订版为P0142R0(2016年3月).
  • 模块的措辞发布为P0143R2(2016年3月).
  • clang团队发布了他们的更改的第二次修订:P0273R1(2016年10月).

以下博客文章包含标准会议的摘要,特别是模块草案的当前状态摘要:

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

Microsoft提出的模块规范

以下是此提案包含的最重要概念的快速概述.作为草案,这可能仍然会改变.新模块标准将包括以下内容:

module关键字声明的模块,多个文件可以声明此建立一个模块(但每个模块仅一个编译单元可以包含一个export {}部分):

module M;
Run Code Online (Sandbox Code Playgroud)

可以决定使用import导入模块的关键字来代替importusing module,因此可以避免使用新的导入关键字.

import std.io;
import module.submodule;
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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

#define FILE "my/file"
import std.io;   //will not be impacted by the above definition
Run Code Online (Sandbox Code Playgroud)

重要的是,当前的预处理器系统和模块都能够共存,并且标题仍可用于例如包含宏.

有关更多详细信息,我建议您阅读草稿.

Clang模块

Clang一直致力于模块实现,可以在clang模块页面找到.但是clang目前没有实现模块的具体语法,也就是说,Clang没有实现上述语法.为了解释这一点,该页面包含以下声明:

目前,导入声明没有C或C++语法.Clang将跟踪C++委员会中的模块提案.请参阅包含为导入部分以了解如何在今天导入模块.

Clang目前实现的主要部分是"模块映射语言",它允许对仍使用头文件的现有代码进行写模块映射.

从模块导出的宏

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

#export define MAX(A,B) ((A) > (B)) ? (A) : (B);
Run Code Online (Sandbox Code Playgroud)

  • 从2018年Rapperswil的更新来看,Gabriel dos Reis和Richard Smith的合并提案是p1103r0。https://botondballo.wordpress.com/2018/06/20/trip-report-c-standards-meeting-in-rapperswil-june-2018/#modules (2认同)

Jam*_*lis 70

C++ Evolution状态(Post旧金山2008),模块提案被归类为"标题为单独的TR:"

这些主题被认为太重要了,无法在发布之前等待C++ 0x之后的另一个标准,但是太过实验,无法及时完成下一个标准.因此,这些功能将尽早通过技术报告提供.

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


zah*_*zah 32

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

从道格拉斯·格雷戈尔(开发者实现他们)一些评论:
http://clang-developers.42468.n3.nabble.com/C-modules-td3619936.html

从理论上讲,你可以定义一堆辅助宏象begin_module,end_module,import_module从任何可能的变化是会在未来的语法保护自己.

编辑1:
道格拉斯格雷戈尔发布了关于他的实施的演讲:http:
//llvm.org/devmtg/2012-11/Gregor-Modules.pdf?=submit

编辑2:
clang中的模块支持已在此处记录:http:
//clang.llvm.org/docs/Modules.html

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