问题标签 [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.
c++ - 使用 clang 链接 C++ 模块 TS
我正在尝试将 C++ 模块 TS 与 clang 一起使用。
我创建了两个文件:
和
foo.cppm
我用这个命令编译
它编译没有错误并创建一个foo.pcm
文件,但是当我尝试使用此命令编译二进制文件时:
它打印一个错误:
我用 clang 7 trunk 和 clang 6 进行了尝试。我还尝试了不同的std
选项和这个命令:
没有任何帮助。
有趣的是,如果一个模块使用来自其他模块的符号,clang 会编译这些模块。据我了解,问题出在链接阶段。
有什么问题?
c++ - C++ 模块是否使 ODR 违规不存在?
从N4720 C++ 模块草案中,[basic.def.odr]/6 说:
[…]对于具有出口声明的实体,该实体应只有一个定义;仅当模块的抽象语义图包含实体的定义时,才需要进行诊断。[注:如果定义不在接口单元中,则最多一个模块单元可以拥有并使用该定义。— 尾注] […]
根据我的理解,这实际上使模板有机会只被编译器解析一次,这与当前的事态(每个翻译单元都有其定义的精确副本)形成鲜明对比。这对于具有类似情况的其他实体也有效,例如内联函数/变量。
我的问题源于这样一个事实,因为每个翻译单元最多只能有一个实体定义(如[basic.def.odr]/1中所述),因此跨 TU 具有不同的实体定义是未定义的行为. 而且,由于导出的实体在整个编译单元中只有一个定义(使未导出的实体对其实现单元唯一),因此在我看来,如果不是不可能的话,弄错定义会更难。
最后,简单地说:模块的使用是否会(或是否,或应该)使违反 ODR 规则变得不可能,或者更难出错?
c++ - 即将在 c++ 中添加的模块会修复/减轻对 pimpl 习语的需求吗?
据我所知,pimpl 习惯用法将私有实现隐藏在前向声明的符号名称后面,因此可以在私有 cpp 模块中声明和使用它。
示例:https ://cpppatterns.com/patterns/pimpl.html
据我所知,因为类 hosint pimpl 需要知道它的结构(大小,对齐),所以 pimpl 必须通过某种指针间接。
(或分配为足够大小的块,然后将其移动/创建到稍后由 cast 重新解释的位置。)
即将发布的模块规范是否以任何方式解决了这个问题?
c++ - 什么是 C++ 模块权限?
我在 C++ 模块的上下文中看到了一些对“权限”一词的引用,例如在https://gcc.gnu.org/wiki/cxx-modules中:
C++ 模块权限到底是什么?
c++ - 如何将标准库与 C++ 模块一起使用?(例如:`import std.io`)
如何在 Clang 中使用 C++ 模块中给出的基本示例?对我有用,但不导入标准库(例如 via import std.stdio;
);在浏览 http://clang.llvm.org/docs/Modules.html之后,不清楚如何在 C++ 模块中使用标准库,例如:
这给出了一个错误:
clang++ -std=c++17 -fmodules-ts --precompile foo.cppm -o foo.pcm
foo.cppm:4:8: fatal error: module 'std.stdio' not found
注意:
clang++ --version
Apple LLVM version 9.1.0 (clang-902.0.39.1)
Target: x86_64-apple-darwin17.4.0
我在 OSX 上。我还尝试了 brew install llvm 的叮当声,但也没有用。
做这样的事情最简单的方法是什么?
c++ - 导出从另一个模块导入的类
我正在尝试使用 C++ 模块,clang 5.0
并且我试图了解如何从一个模块中导出我从另一个模块中导入的东西。这甚至可能吗?
例如,我想要这样的东西:
和这个:
所以最后我可以做类似的事情
这样的事情可能吗?我还尝试弄清楚是否有办法导入root
, like的所有子模块import root.*
,但这也不起作用。
c++ - 无法导入子模块
在clang version 6.0.0 (tags/RELEASE_600/final)
我无法导入std
像std.vector
. 整体import std
工作正常,但import std.vector
不是。我正在使用libc++
正确定义此模块的模块映射。
编辑
自定义模块映射存在同样的问题
它无法加载模块test.sub
,但报告foo
可以在其中找到符号。
编辑 2
clang 5.0.2
行为方式相同。
编辑 3
6.0.1-rc1
相同的
是否有任何与此相关的问题或尚不支持的信息?
c++ - C++ 20 工作草案是否包含别名导入的模块?
Modules TS 是否包含导入模块的别名符号?我做了一些简短的搜索,但没有看到任何提到这一点的东西。
事后看来不好的例子,但我很好奇是否有任何相当于 ES201N 的 c++
c++ - C++ 模块中的前向声明 (MSVC)
我最近一直在试验 MSVC 提供的模块实现,我遇到了一个有趣的场景。我有两个类在它们的接口中相互依赖,这意味着我必须使用前向声明来编译它。以下代码显示了一个示例:
Module interface
Module implementation
现在我想将这两个类拆分为它们自己的名为Foo
和的模块Bar
。但是,每个模块都需要导入另一个,因为它们的接口相互依赖。根据目前的模块提案,不允许循环接口导入。本文建议使用proclaimed ownership
声明,但似乎尚未在模块的 MSVC 实现中实现。
因此,我是否正确假设目前无法使用 MSVC 提供的当前实现来解决这种情况?还是有一些我想念的替代品?在这种情况下,情况非常简单,但是我在模块化具有许多具有此类依赖关系的类的库时遇到了这个问题。我意识到循环依赖通常表明设计不好,但是在某些情况下,它们是不可避免的或难以重构的。
c++ - build2:编译器不支持模块
我可以使用build2构建没有 c++ 模块的 c++ 项目,但是当我尝试使用 c++ 模块配置和使用 build2 时,出现“编译器不支持模块”错误。
我确信我的编译器能够构建模块,因为我可以使用这些命令手动构建:
我的 clang 版本是 7.0.0:
为了在 build2 中启用模块支持,我在 root 中添加了以下几行buildfile
:
有什么问题?这是我第一次使用 build2,所以我可能会遗漏一些非常简单的东西。