问题标签 [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 投票
0 回答
73 浏览

c++ - C++20 模块相对于预编译头文件在编译速度方面的优势?

C++20 的模块特性应该可以提高编译速度。但是,与预编译头文件相比,它的优势是什么,这也使得包含库的速度更快?

0 投票
2 回答
705 浏览

c++ - MSVC 16.8.0 Preview 3.2 找不到标准模块接口文件

如果我从命令行编译这段代码,使用 cl /c /O2 /D NDEBUG /D _CONSOLE /D _UNICODE /D UNICODE /EHsc /MD /std:c++latest /Gd /TP /experimental:module /ifcSearchDir "C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.28.29304\ifc\x64\Release" ConsoleApplication1.cpp 它可以很好地编译和链接。

如果我使用 IDE 和相同的选项编译相同的代码,输出窗口会显示此结果。

谁能启发我这里发生了什么?我忘记了什么?

0 投票
1 回答
994 浏览

c++ - 是否可以在带有自定义规则的 bazel 中使用 C++20 模块?

Bazel 不直接支持模块(参见问题 #4005)。

但是,可以为 bazel 提供自定义 CROSSTOOL。

来自https://docs.bazel.build/versions/0.22.0/crosstool-reference.html

默认情况下,Bazel 会自动为您的构建配置 CROSSTOOL,但您可以选择手动配置它。

并且可以使用自定义规则扩展 bazel。

来自https://docs.bazel.build/versions/master/skylark/rules.html

Bazel 本身内置了一些规则。这些原生规则,例如 cc_library 和 java_binary,为某些语言提供了一些核心支持。通过定义自己的规则,您可以为 Bazel 本身不支持的语言和工具添加类似的支持。

这个关于 Bazel 模块问题的评论表明,即使没有本机支持,您也可以使用自定义 CROSSTOOL 来支持模块:

关于模块的所有内容(仅适用于 clang)都是开源的。唯一缺少的部分是使用它们并提供所有必要功能的 CROSSTOOL。

谁能展示如何为 clang 编写自定义 CROSSTOOL 以及如何使用它为模块(例如cc_module)编写自定义 C++ 规则,以便您可以执行以下操作:

编写一个基本模块

使用模块

将部件集成到构建系统中

0 投票
0 回答
234 浏览

c++ - 从clang c++20模块中导出全局变量

使用 clang 12 构建 c++20 模块时(它也使用 clang 10 复制)从模块中导出全局变量并在另一个编译单元中从同一个导出类声明全局变量会导致“`vtable for foo' 的多重定义”。

我的理解是可以使用单个 cppm 源创建 c++20 模块(clang 使用 cppm 作为模块),编译器将生成模块声明和它的定义。在这种情况下,clang++ 似乎确实生成了两次 vtable。

这是设置

foo.cppm:

主.cpp:

构建主可执行文件的编译步骤:

导致 foo 类的重复 vtable 和类型信息:

这是一个 llvm 错误还是我做错了什么,我对模块应该如何工作感到困惑?

0 投票
1 回答
541 浏览

c++ - MSVC:相互导入的 C++20 模块无法编译

最近在 MSVC 16.8 中添加了对 C++20 模块的支持。如果我没记错的话,使用模块的优点之一是现在支持循环导入依赖项。但是,以下测试项目仍然无法在最新版本的 Microsoft 编译器中编译。

computer.ixx

printer.ixx

main.cpp

尝试编译此代码会导致:( MultiToolTask has encounted an issue scheduling task because one or more tasks still remains but none could be started. Please check the inputs and their dependency to avoid cirular loops.错字逐字复制)并混淆 IntelliSense、挂起甚至使 Visual Studio 崩溃。

我还尝试颠倒导入和导出行的顺序,但这并没有解决问题。

我知道这仍然是一个测试版功能,但我想确保我的假设是正确的(该代码应该可以工作),并且如果代码中有任何错误,我应该更改它以使其工作。

如果您想自己尝试一下,可以在这里找到包含上述代码的 MSVC 项目:https ://github.com/albertvaka/ModulesTest

0 投票
1 回答
140 浏览

c++ - “在不同的源文件中分离模块接口/实现单元”和使用“私有模块片段”之间的权衡是什么

从表面上看,使用私有模块片段来分离接口和实现看起来优于在不同的源文件中分离模块接口和实现单元,因为在使用私有模块片段时您只需要管理单个源文件。

但是使用私有模块片段是否比在不同的源文件中分离模块接口/实现单元更好?有哪些取舍?

0 投票
1 回答
205 浏览

c++ - 如何在 gcc 或 clang 中使用 c++20(启用模块)包含多个预编译头文件

在c ++ 20中,启用模块时,每个包含都应该被封装,以便顺序无关紧要,宏不会泄漏等。

显然是否可以预编译多个头文件的问题是肯定的。

我现在的问题是:你如何做到这一点:也就是说:我如何首先预编译一组头文件,然后使用 c++20 模块让编译器将它们(全部)识别为我的翻译单元的预编译头文件,(使用linux命令行)。

我想为 g++ 提供解决方案,但如果只有 clang 才有可能,那么这个答案就可以了。

请注意,这个问题可能已经过时了。

0 投票
0 回答
84 浏览

c++ - 类构造函数被误解

下面的构造函数参数const int被 Visual Studio 2019 的 Intellisense 误解为 a,我得到一个错误。我正在使用 C++ Preview (C++ 20) 和模块。编译成功。我可能错过了什么吗?可能有关于我缺少的模块的关键细节。

https://github.com/Karutoh/MinimalExamples/tree/master/MisinterpretedConstructor

在此处输入图像描述

0 投票
0 回答
429 浏览

c++ - 共享库中的 Clang C++20 模块

是否可以通过共享库公开 C++ 模块?

我意识到这是最前沿(2021 年 1 月),但我仍然敢于问是否有人知道如何通过共享库完成暴露模块。

这是生成文件:

代码和我想象的一样简单:

代码文件“sublib.cpp”有一个相应的函数,可以从 a 中减去 b。

和主文件:

我故意$(MOD_IMP)从编译命令中删除来构建 main,因为我只想依赖于共享库。但是,我收到此编译器错误

0 投票
1 回答
578 浏览

c++ - C++ 模块的两步编译?

Clang 和 GCC(也许还有 MSVC?)目前正在为他们的模块实现使用两步编译:

  • 生成 BMI/CMI(MSVC 的 IPR,如果它仍然这样做?)以供其他人的导入使用。
  • 生成要馈送到链接器的目标文件。

生成 BMI/CMI 但不生成目标文件的模块似乎有一些可能的用途,例如仅导出用于条件编译的类型或 constexpr 变量的模块。

据我从标准中可以理解,没有什么说我必须生成/链接对象文件。所以我想知道我是否错过了关于使用这样的模块的一些明显的东西,如果我们希望工具支持这种“作为模块构建,而不是作为对象构建”的工作流程?