问题标签 [c++-modules]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
18362 浏览

c++ - 如何在 Clang 中使用 C++ 模块?

模块是#includes 的替代品。Clang 有一个完整的 C++ 实现。如果我现在想通过 Clang 使用模块,我会怎么做?


使用

在 C++ 源文件中还不能工作(编译),因为模块的规范(包括语法)不是最终的。


Clang 文档指出,当传递标志时-fmodules,#includes 将被重写为相应的导入。但是,检查预处理器会提示其他情况(test.cpp 仅包含#include <stdio.h>一个空的 main):

-fmodules此外,在完全没有标志的情况下编译这个测试文件会产生相同的目标文件。

我究竟做错了什么?

0 投票
2 回答
17488 浏览

c++ - 我应该如何编写我的 C++ 来为 C++ 模块做好准备?

已经有两个编译器支持 C++ 模块:

现在开始一个新项目时,我应该注意什么才能最终在我的编译器中发布模块功能?

是否可以使用模块并仍然保持与不支持它的旧编译器的兼容性?

0 投票
1 回答
1229 浏览

c++ - 如何在 CMake 中使用 VC++ 模块

MS Visual C++ 2015 Update 1实现了模块提案

这是它如何工作的示例:
来源:

构建命令:

依赖图:

每个模块都有一个file.ixx带有导出的模块。
该文件将被编译成ModuleName.ifcfile.obj.

如果文件导入模块MM.ifc则必须存在文件。
默认情况下 cl.exe 搜索.ifc当前目录中的文件,但可以指定显式名称或搜索路径:

所以,问题是:如何在 CMake 中使用模块的 VC++ 实现
不需要使用 MSBuild 后端,Ninja 也可以。

0 投票
3 回答
974 浏览

c++ - c++1z模块会取代windows上对dllimport dllexport的需要吗

我正在了解 C++1z 的模块提案。我最大的希望是它将取代dllimport,dllexport在 windows 上的使用。使用 c++1z 模块,我可以.dll在 windows 和.solinux 上构建,避免使用dllimport/dllexport? 该模块export是所有平台和编译器都需要的吗?

0 投票
1 回答
760 浏览

c++ - 如何将一个模块拆分为多个文件

我阅读了 C++ 中的模块,但有些东西我真的不明白该怎么做。我想知道如何使用当前的合并模块提案有效地将 c++ 模块拆分为多个文件。

假设我有两个要导出的类。我想拆分我的 ixx 文件,以便这些类中的每一个的实现都保留在单独的文件中。

我想象过这样的事情:

接口.ixx:

然后,我想像这样实现我的类,

A.ixx:

B.ixx

我想知道的是:无论文件如何,模块是否都知道它的接口?如果没有,是否有另一种方法将模块拆分为多个文件?我知道在这种情况下可能看起来很傻,但是在大型模块中使用大型类,将事物分开是很诱人的。

0 投票
4 回答
4119 浏览

c++ - 使用 C++ 模块时,是否有任何理由将函数声明(.hpp 文件)与其定义(.cpp 文件)分开?

我习惯于编写没有模块的代码,其中头文件包含函数声明,例如:

并且相应的 .cpp 文件包含定义:

据我所知,这样做是为了减少编译时间和减少依赖。什么时候使用模块,这仍然适用吗?将类与 Java 和 C# 的定义方式放在一个文件中是否一样快?如果是这种情况,使用模块时是否需要.hpp和文件?.cpp

0 投票
0 回答
316 浏览

c++ - 模块 TS 和纯虚拟类

问题

我正在尝试使用我在另一个模块中定义的纯虚拟类,但是在尝试使用它时遇到以下问题:base class undefined

奖金信息

在我确定问题所在的搜索过程中,我发现命名空间本身也遇到了类似的问题

编译器

我目前正在使用VC++具有以下附加设置的编译器: /std:c++latest /experimental:module /module:exportActiveMacros我通过 IDE 项目设置进行的

代码

至于代码,它如下所示:

Foo.ixx

另一个人.ixx

0 投票
1 回答
443 浏览

c++ - 在#include 之后使用类型的 Clang++ -fmodules 错误

以下简单的测试用例文件给我一个编译时错误,当-fmodules使用下面显示的命令编译时,来自 Clang 的 github 镜像的“master”提示。我想知道这是否是 Clang 的新实验模块功能的错误——可能是标准库的模块映射实现的问题——或者我做错了什么。如果我添加-fbuiltin-module-map到命令中,错误仍然会出现。有趣的是,如果我stdint.hcstdint.

这是我的编译命令,带有错误消息:

我正在使用的构建信息:来自 Matus Chochlik 的 github Clang 镜像分支;但我设置为与原始clang git镜像中的“master”负责人(当时)对应的提交(换句话说,它不包括来自Matus Chochlik的功能“reflexpr”分支的提交):

(注意:怀疑这是一个错误,我也将上述报告通过电子邮件发送给 LLVM 管理员,如果他们回复并给我登录,我打算将其提交给 LLVM Bugzilla。但我想我也会在这里发布,以防我弄错了,或者任何使用 Clang 的 C++1z+ 模块支持的人都感兴趣)

编辑1:

如果我添加-v到编译命令行,它表明它确实在搜索我的构建include目录,而不是另一个 Clang 构建的目录,例如:

我不知道问题是否可能是我的 Clang 构建的标头与 OS X 系统标头之间的/usr/local/include交互/usr/include

0 投票
2 回答
557 浏览

c++ - Clang 模块与 std 的交互

(有关我正在使用的特定版本的 Boost 和 Clang 的信息,请参阅问题的结尾)

从 master/HEAD 在 Clang 中编译,使用新的实验-fmodules功能,我在使用如下所示的命令行选项编译以下文件时遇到构建错误:

编译命令和错误:

如果我在 之后删除#include <iterator>或移动它#include <boost/move/iterator.hpp>,错误就会消失。

问题:这仅仅是没有为带有 Clang 模块映射文件的模块准备的 Boost 库(显然是 Boost Move)的副产品吗?这可能是 Clang 现在为 libc++ 实现的模块映射文件的错误,甚至是模块实现本身的错误?

有趣的是,我可以通过注释掉第 28-28 行来消除错误boost/move/detail/iterator_traits.hpp

正在使用的版本

提升 1.61

Clang 来自 LLVM 的 github 镜像中的 master 分支的尖端,截至 2016 年 12 月 7 日(技术上它来自 LLVM 的一个分支,但它仅在与 LLVM 自己的 master 分支相同的 master 分支上):

0 投票
1 回答
2981 浏览

c++ - 使用 clang 的 C++ 模块

看起来Clang 正在为模块 TS 提供支持。我使用从 SVN(主干)编译的 Clang进行了尝试,它按预期工作。

我想把它带到下一步,将catch库包装到一个模块中。

我试图以module.modulemap这种方式声明 a :

main.cpp包含:

编译模型指出“模块的二进制表示是编译器根据需要自动生成的。

编译main.cpp使用clang-4.0 -std=c++1z -fmodules-ts main.cpp我得到:

知道如何解决吗?