问题标签 [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++ - P1881 中基于 C++ 模块的时期与潜在的基于 #pragma 的时期
在P1881提案中,提出了 C++ 代码的时期(在模块级别)的概念。这样的功能可以允许在模块级别自定义 C++ 语法和 C++ 行为,而不必破坏向后兼容性。提案中给出了更详尽的动机。
提案中的隐式转换示例
版本 1:没有时代,一切都编译得很好
版本 2:(epoch 2023
假设禁用隐式转换),代码格式错误:
这绝对看起来是一个有趣的提议,并且与简单地指定编译开关有很大不同-std=c++XXX
。
但是,我想知道:
- 在 P1881 中,epochs 被定义为模块级开关。除了方便之外,还有什么理由必须在模块级别上吗?为什么不是翻译单元级别?
- 因此,
#pragma
与基于模块的提案相比,这种行为是否可以通过 's 无缝实现,提供编译器支持,或者会引入严重的技术困难(从实现或使用的角度来看)?
说,沿线的东西:
我已经阅读了针对基于模块的实现的建议机制;但是,我不明白为什么它必须是 modules。
c++ - 如何在 C++20 中对模块进行参数化?
我的意思是这样的情况:
这个确切的例子可能很少用,但这只是一个例子,这种方法被广泛使用,尤其是在项目内部。为系统或编译器类型和版本定义的宏采用类似的方式,在编译器命令行中定义的宏也是如此。
import
我的问题是,当您已经有一个使用普通名称的模块时,是否存在一些可供即将使用声明的开发人员使用的机制,如下所示:
或者,甚至更好 - 指定导出到模块的参数专门为其(不会传播到其他模块)。是否有任何机制可以实现它?
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 中可用?”下声明“否”,但也许我只是忽略了一些东西?
c++ - 如何在 cpp20 实验中导入 C 断言
我想assert
在 Visual Studio 2019 中将 C 与 C++20 一起使用(使用 编译std:c++latest
),但我找不到要导入的正确模块。是否已经支持,如果支持,我应该导入哪个模块?
输出:世界你好!
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- 的情况下编译,但在设置时不会编译。我不知道为什么
c++ - Linux 包管理器将如何处理 C++20 模块?
我们现在是 2020 年,C++20 即将到来,还有期待已久的 C++ 模块功能。但是在看了一些关于 CppCon 的演讲后,我发现 C++ 模块的位置很奇怪,尤其是对于 Linux 包管理器(pacman、apt、emerge 等)。
据我所知,C++ 模块是
- 编译器依赖
- 您不能在 Clang 中使用由 GCC 构建的模块
- GCC 9.1 模块不适用于 GCC 9.2
- 您可以拥有同一模块的许多不同版本
- 只要它们不导出到同一范围内
- 如果依赖项更新,您需要重新构建模块
我的问题是,在所有滚动发布的发行版中,编译器一直在更新,用户可能有自己的编译器版本。目前可以只更新编译器或更新libstdc++
. 但是对于模块,似乎建议libstdc++
必须在编译器更新时进行更新。
当编译器更新时,包管理器将如何处理更新,例如 STL?我不认为为每个版本的编译器构建每个版本的 STL 模块是可行的。用户必须构建自己的 STL 模块也不是一个好主意。
c++ - C++20 模块的例子?
在即将到来的 C++20 中,模块是一件大事。当然,对于它们是否很棒有不同的意见,但我认为将来了解它们很重要。我看过一些关于模块的讨论并阅读了一些教程,所以我想我对如何使用它们有一个初步的了解。
但是我学到的大部分都是本地的,即我将如何编写一个模块。所以我不确定模块在更大的范围内会产生什么不同。它们将如何影响我们的库和可执行文件的布局及其使用?
尽管如果您对此有一些参考资料,我将不胜感激,但我更感兴趣的是看到正在运行的模块。你知道任何使用模块的项目示例吗?(最好是中型的)看到项目更改为使用模块之前/之后的比较是完美的,但我对我能得到的任何东西都很满意。
c++ - 模块接口中的内联含义
考虑头文件:
或者,或者:
在预模块世界中,这些标头可能以文本形式包含在多个 TU 中,而不会违反 ODR。此外,由于涉及的成员函数相对较小,编译器可能会“内联”(使用时避免函数调用)这些函数,甚至优化掉一些实例T
。
在最近关于完成 C++20 的会议的报告中,我可以阅读以下声明:
我们澄清了
inline
模块接口的含义:意图是没有显式声明的函数体不是inline
模块 ABI 的一部分,即使这些函数体出现在模块接口中。为了让模块作者对他们的 ABI 有更多的控制,模块接口中类体中定义的成员函数不再是隐式inline
的。
我不确定我没有弄错。这是否意味着,在模块世界中,为了让编译器能够优化函数调用,我们必须对它们进行注释,inline
即使它们是在类中定义的?
如果是这样,下面的模块接口是否等同于上面的标题?
尽管我仍然没有支持模块的编译器,但我想inline
在适当的时候开始使用这样的方法,以尽量减少未来的重构。
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
问:有没有办法用编译器资源管理器做到这一点?
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
后者失败并显示以下错误消息:
当然,我可以更改模块代码并指定模板参数。但是,我想知道:
模块代码或编译器错误是否会出现这种行为?