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

c++ - P1881 中基于 C++ 模块的时期与潜在的基于 #pragma 的时期

P1881提案中,提出了 C++ 代码的时期(在模块级别)的概念。这样的功能可以允许在模块级别自定义 C++ 语法和 C++ 行为,而不必破坏向后兼容性。提案中给出了更详尽的动机

提案中的隐式转换示例

版本 1:没有时代,一切都编译得很好

版本 2:(epoch 2023假设禁用隐式转换),代码格式错误:

这绝对看起来是一个有趣的提议,并且与简单地指定编译开关有很大不同-std=c++XXX

但是,我想知道:

  • 在 P1881 中,epochs 被定义为模块级开关。除了方便之外,还有什么理由必须在模块级别上吗?为什么不是翻译单元级别?
  • 因此,#pragma与基于模块的提案相比,这种行为是否可以通过 's 无缝实现,提供编译器支持,或者会引入严重的技术困难(从实现或使用的角度来看)?

说,沿线的东西:

我已经阅读了针对基于模块的实现的建议机制;但是,我不明白为什么它必须是 modules


同样相关:P1881 提案的作者 Vittorio Romeo 在 CppCon 2019 上的一次闪电演讲

0 投票
1 回答
285 浏览

c++ - 如何在 C++20 中对模块进行参数化?

我的意思是这样的情况:

这个确切的例子可能很少用,但这只是一个例子,这种方法被广泛使用,尤其是在项目内部。为系统或编译器类型和版本定义的宏采用类似的方式,在编译器命令行中定义的宏也是如此。

import我的问题是,当您已经有一个使用普通名称的模块时,是否存在一些可供即将使用声明的开发人员使用的机制,如下所示:

或者,甚至更好 - 指定导出到模块的参数专门为其(不会传播到其他模块)。是否有任何机制可以实现它?

0 投票
0 回答
833 浏览

c++ - arm-none-eabi-g++ 中的 C++20 模块

我正在使用STM32CubeIDE,其中包括

arm-none-eabi-g++(STM32 的 GNU 工具7-2018-q2-update.20190328-1800)7.3.1 20180622(发布)[ARM/embedded-7-branch 修订版 261907]

有没有办法使用C++20 模块?C++2a 语言功能在“在 GCC 中可用?”下声明“否”,但也许我只是忽略了一些东西?

在此处输入图像描述

0 投票
2 回答
229 浏览

c++ - 如何在 cpp20 实验中导入 C 断言

我想assert在 Visual Studio 2019 中将 C 与 C++20 一起使用(使用 编译std:c++latest),但我找不到要导入的正确模块。是否已经支持,如果支持,我应该导入哪个模块?

输出:世界你好!

0 投票
2 回答
5172 浏览

c++ - 导入模块的标准方式

我目前正在尝试在应该在 Windows (MSVC) 和 Linux (Clang 和/或 GCC) 上编译的代码中使用 c++ 模块。

我目前正在 Visual Studio 中进行开发,并使用“标准一致性模式”(/permissive-) 使我的代码尽可能可移植。

但是下面的代码:

无法使用 /permissive- 标志进行编译。我收到以下错误:

E3223 找不到要导入的模块文件“std.core”

错误 C2664: 'int _CrtDbgReport(int,const char *,int,const char *,const char *,...)': 无法将参数 4 从 'int' 转换为 'const char *'

我认为“std.core”可能是一个仅限 Windows 的东西,所以我尝试了以下方法(我在很多例子中都看到了):

但它会导致以下错误:

错误 C7612:找不到“PATH_TO_VS\include\iostream”的标头单元

错误 C7612:找不到“PATH_TO_VS\include\vector”的标头单元

错误 C7612:找不到“PATH_TO_VS\include\map”的标头单元

注意:PATH_TO_VS\include 中实际上有名为“iostream”、“vector”和“map”的文件。

因此我想知道导入 c++ 模块的标准方法是什么?如果“import std.core”是标准方式,为什么不使用 /permissive- 编译?

我正在使用 Visual Studio 2019(社区)和 CMake。

编辑:

对不起,我忘了告诉我的编译器标志:

代码在没有 /permissive- 的情况下编译,但在设置时不会编译。我不知道为什么

0 投票
2 回答
1299 浏览

c++ - Linux 包管理器将如何处理 C++20 模块?

我们现在是 2020 年,C++20 即将到来,还有期待已久的 C++ 模块功能。但是在看了一些关于 CppCon 的演讲后,我发现 C++ 模块的位置很奇怪,尤其是对于 Linux 包管理器(pacman、apt、emerge 等)。

据我所知,C++ 模块是

  1. 编译器依赖
    • 您不能在 Clang 中使用由 GCC 构建的模块
    • GCC 9.1 模块不适用于 GCC 9.2
  2. 您可以拥有同一模块的许多不同版本
    • 只要它们不导出到同一范围内
  3. 如果依赖项更新,您需要重新构建模块

我的问题是,在所有滚动发布的发行版中,编译器一直在更新,用户可能有自己的编译器版本。目前可以只更新编译器或更新libstdc++. 但是对于模块,似乎建议libstdc++必须在编译器更新时进行更新。

当编译器更新时,包管理器将如何处理更新,例如 STL?我不认为为每个版本的编译器构建每个版本的 STL 模块是可行的。用户必须构建自己的 STL 模块也不是一个好主意。

0 投票
0 回答
329 浏览

c++ - C++20 模块的例子?

在即将到来的 C++20 中,模块是一件大事。当然,对于它们是否很棒有不同的意见,但我认为将来了解它们很重要。我看过一些关于模块的讨论并阅读了一些教程,所以我想我对如何使用它们有一个初步的了解。

但是我学到的大部分都是本地的,即我将如何编写一个模块。所以我不确定模块在更大的范围内会产生什么不同。它们将如何影响我们的库和可执行文件的布局及其使用?

尽管如果您对此有一些参考资料,我将不胜感激,但我更感兴趣的是看到正在运行的模块。你知道任何使用模块的项目示例吗?(最好是中型的)看到项目更改为使用模块之前/之后的比较是完美的,但我对我能得到的任何东西都很满意。

0 投票
2 回答
1260 浏览

c++ - 模块接口中的内联含义

考虑头文件:

或者,或者:

在预模块世界中,这些标头可能以文本形式包含在多个 TU 中,而不会违反 ODR。此外,由于涉及的成员函数相对较小,编译器可能会“内联”(使用时避免函数调用)这些函数,甚至优化掉一些实例T

在最近关于完成 C++20 的会议的报告中,我可以阅读以下声明:

我们澄清了inline模块接口的含义:意图是没有显式声明的函数体不是inline模块 ABI 的一部分,即使这些函数体出现在模块接口中。为了让模块作者对他们的 ABI 有更多的控制,模块接口中类体中定义的成员函数不再是隐式inline的。

我不确定我没有弄错。这是否意味着,在模块世界中,为了让编译器能够优化函数调用,我们必须对它们进行注释,inline即使它们是在类中定义的?

如果是这样,下面的模块接口是否等同于上面的标题?

尽管我仍然没有支持模块的编译器,但我想inline在适当的时候开始使用这样的方法,以尽量减少未来的重构。

0 投票
1 回答
1875 浏览

c++ - 如何使用 Godbolt(编译器资源管理器)测试 C++ 模块?

为了询问或演示 C++20 中自写模块的错误/功能,能够使用Matt Godbolt 的编译器资源管理器会很棒。

例子:

test.cpp(模块测试):

编译clang++ -std=c++20 -stdlib=libc++ -fmodules -c -Xclang -emit-module-interface -o test.pcm test.cpp

主.cpp:

编译clang++ -std=c++20 -stdlib=libc++ -fmodules -fimplicit-modules -fimplicit-module-maps -fprebuilt-module-path=. main.cpp

问:有没有办法用编译器资源管理器做到这一点?

0 投票
0 回答
110 浏览

c++ - 类模板参数推导(CTAD)应该在模块内工作吗?

给定以下模块

用clang编译: clang++ -std=c++20 -stdlib=libc++ -fmodules -c -Xclang -emit-module-interface -o mod.pcm mod.cpp

以及以下应用程序代码:

编译: clang++ -std=c++20 -stdlib=libc++ -fmodules -fimplicit-modules -fimplicit-module-maps -fprebuilt-module-path=. main.cpp

后者失败并显示以下错误消息:

当然,我可以更改模块代码并指定模板参数。但是,我想知道:

模块代码或编译器错误是否会出现这种行为?