问题标签 [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 回答
1181 浏览

c++ - C++ 模块和动态链接的预期关系是什么?

C++ 模块 TS 为消除预处理器、缩短编译时间以及通常支持更健壮、模块化的 C++ 代码开发(至少对于非模板代码)提供了极好的工具。

底层机制提供对普通程序中符号的导入和导出的控制。

然而,为两种动态加载开发库存在一个主要问题:启动时加载和运行时加载。这个问题涉及从库中导出符号,这通常在可见性方面进行讨论。

通常,并非所有用于构建动态链接库的翻译单元的外部符号都应该对用户可见。此外,对于运行时加载,尤其是插件概念,必须从许多同时加载的库中导出相同的符号。

在 Windows 上使用语言扩展

作为符号属性附加在源代码中,最近在 unix 平台上的 gcc 和 clang 系统上,使用

旨在支持旨在由图书馆公开的符号的提供和使用。使用这些是复杂而混乱的:在 Windows 上,必须在编译库时使用宏来导出符号,但在使用时导入它们。在 unix 平台上,必须将可见性设置为导出和导入符号的默认值,编译器根据是否找到定义自行决定:编译器必须调用

转变。静态链接不需要导出/导入属性,并且可能应该将其宏化为空字符串。编写代码并摆弄构建系统以使这一切正常工作,特别是考虑到在编译库翻译单元期间#includes 必须具有正确的符号可见性设置非常困难,存储库中所需的文件结构一团糟,源代码乱七八糟使用宏,一般来说..整个事情都是一场灾难。几乎所有开源存储库都无法正确导出动态链接的符号,并且大多数程序员不知道动态库代码结构(使用两级命名空间)与静态链接有很大不同。

可以在此处看到如何执行此操作的示例(希望是正确的):

https://github.com/calccrypto/uint256_t

这个存储库曾经有 2 个头文件和 2 个实现文件,构建库的用户会看到 2 个头文件。现在有 7 个头文件和 2 个实现文件,构建库的用户将看到 5 个头文件(3 个带有扩展名include表示它们不被直接包含)。

所以在冗长的解释之后,问题是:最终的 C++ 模块规范是否有助于解决动态链接符号的导出和导入问题?我们能否期望能够为共享库进行开发,而不会使用供应商特定的扩展和宏污染我们的代码?

0 投票
2 回答
743 浏览

c++ - 在 clang-cl 中启用 C++ Modules TS

我在 Windows 上通过clang-cl.

我正在尝试让 C++ 模块工作。我已经尝试过 clang 命令行参数-fmodules-ts-fmodules.

我还尝试了msvc命令行参数(在 MSVC 下工作 - 我使用的是 15.8.5)/experimental:module /module:interface(这将是非实验选项的正常方式)。

所有选项都会导致错误clang-cl.exe: warning: unknown argument ignored in clang-cl

任何人都知道是否可以在下面使用 C++ Modules TS clang-cl

0 投票
2 回答
553 浏览

c++ - C++ 的模块标准是否解决了对调用者隐藏私有数据的问题?

在 C++ 中,模块正在被标准化以解决 #include 膨胀等问题。C++ 中的编译器必须解析太多。

而且,由于 C++ 以高效的方式内联存储数据,因此即使调用者也必须了解对象的内存布局。

即将推出的模块标准是否解决了这个问题?

例子:

包含指向内部实现的指针的对象可以通过空声明来解耦,即:

类 GLFW 窗口;

但是,如果为了性能,我们在窗口中包含 mat4 对象,那么我们需要知道大小,这目前意味着包含一个定义,引入一个由于级联包含而通常很大的头文件。模块中是否有任何机制可以隐藏细节并允许为对象保留正确的空间量,同时使其像指针一样不透明?

0 投票
1 回答
241 浏览

c++ - 无法在带有 Clang 的模块中使用对齐的“operator new”

我正在尝试使用 Clang“模块”功能,并且正在尝试编译以下代码:

Try it live

当我尝试clang++ -std=c++2a -pedantic-errors -fmodules-ts --precompile -x c++-module a.cpp -o a.pcm时,我得到了

删除-pedantic-errors修复了错误,但是当我尝试使用链接生成的模块时clang++ -std=c++2a -fmodules-ts a.pcm -o a.exe,我得到

这特别烦人,因为<iostream>(间接)似乎依赖于对齐operator new,所以我也不能在模块中使用它。以及其他一些标准标题。

这里发生了什么?

这是一个 Clang 错误,我该如何解决?


My Clang 是 MSYS2 提供的最新版本:


编辑:

提交了一个错误报告,让我们看看会发生什么......

0 投票
1 回答
102 浏览

c++ - 模块名称是否位于单独的“名称空间”中,或者它们是否会与变量名称发生冲突?

我猜/希望模块名称不会与变量名称冲突。有人可以证实这一点,并可能参考(即将发布的)标准中的合适部分吗?

文件:a_module.cc

文件:main.cc

0 投票
1 回答
133 浏览

c++ - 包含中的 C++“取消定义”模块关键字

我想在 Visual Studio 中使用 C++20 模块,但我的一个项目使用Magick++,它在“magick++.h”中定义了一个名为“module”struct的成员:char*

我可以告诉编译器不要处理特定#include 中的“模块”吗?

0 投票
8 回答
23170 浏览

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

ClangMSVC已经支持来自未完成的 C++20 标准的模块 TS 。我可以使用 CMake 或其他构建系统构建基于模块的项目吗?如何构建?

我尝试了build2,它支持模块并且运行良好,但我对它的依赖管理有疑问(UPD:问题已关闭)。

0 投票
1 回答
452 浏览

c++ - C++ 标头单元导入语法

在当前的 C++ 草案(2019 年 8 月)中,pp-import http ://eel.is/c++draft/cpp.import#nt:pp-import 的语法允许pp-tokensheader-nameheader-name-tokens.

该部分的当前版本是P1703: "Recognizing Header Unit Imports Requires Full Preprocessing"的结果。在此提议引起的更改之前,语法仍然允许在或之后预处理标记标记,但以 a 的形式。(P1103 的 [ cpp.module ] 部分)。header-nameheader-name-tokenspp-import-suffix

在这种情况下允许额外的、未使用的预处理令牌背后的原因是什么?

谢谢你。

0 投票
1 回答
587 浏览

c++ - 从模块导出全局常量的正确方法是什么?

声明全局常量可能很方便,但在 C++ 中并不容易。例如,请参阅Fluent C++ 上的这篇最新文章。它主要解释了如何做到这一点,但没有提到 C++20 模块。

在命名空间级别的常规头文件中,我会声明一个像这样的常量:

在这里我需要inline,因为符号可能包含在几个翻译单元中。IIUC,导出符号的模块定义单元是一个单独的翻译单元。所以我会简单地声明如下:

这是正确的做法,还是我错过了什么?

0 投票
1 回答
552 浏览

c++-modules - C++ 模块在哪些文件中,它与模板的关系如何?

据我了解,模块接口及其实现可以分为两个不同的文件。与 header.h 和 source.cpp 文件类似。

这些文件的约定名称和文件后缀是什么?我们是否坚持使用“.h”作为界面?

因此,对于一个非常简单的情况:它看起来是否类似于标头声明、源代码实现?

如果我们编写模板代码,它的行为如何?它仍然只是“标题”(即模块接口),还是我们现在可以将它移到实现文件中?