问题标签 [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++ - 在 C++20 中混合模块和头文件是否可能/可接受?
我实际上是在尝试通过编写自己的小模块来理解 C++20 模块系统。假设我想提供一个函数来删除字符串开头和结尾的所有空格(一个trim
函数)。以下代码可以正常工作。
但是如果我只想使用特定的标头而不是std.core
在我的模块中呢?如果我这样做,用import std.core
以下代码替换,我会在 Visual Studio 2019 上收到错误。
但是,如果在main.cpp
I 中也替换了import std.core
with #include <iostream>
,则代码会再次编译。这就像使用两个系统证明链接器来完成它的工作。
问题是:我做错了吗?import
同时使用新方法和旧#include
方法是一种不好的做法吗?我在 Internet 上的多个帖子中看到,您可以在模块中包含一些旧标题,从而在不破坏现有代码的情况下更新您的代码。但是,如果此标头包含 STL 的某些部分,比如#include <string>
我的模块使用了import std.core
怎么办?
我只使用 Visual Studio 2019 进行测试,因为到目前为止,import std.core
它不适用于 GCC。那么,它可能来自 VS 中的错误吗?还是所有编译器的问题都一样?
c++ - 是否有必要用导出注释导出实体的模板特化?
…或者在模块接口单元声明它们就足够了?
测试.cpp:
主.cpp:
输出:
c++ - 为什么我的项目中的模块无法正常工作?
我的设置:
我正在使用 Visual Studio 2019,而且我是 C++ 模块的新手。这是我模块中的代码:
这是 .cpp 文件中的代码
但我不断收到错误:
如何解决错误?
c++ - 使用遗留头文件作为 c++20 模块
我正在将我的旧代码转换为可作为 c++ 模块导入的东西。问题是我希望它仍然可以工作并且很容易维护为旧的标头/源版本。我该怎么做(如果可能)。
是否可以创建一个导出标题内容的模块?(也接受任何其他允许您维护旧的 .cpp/.h 文件和模块文件的解决方案)
玩具示例:
我尝试过的只是export Vector
不同的版本,有和没有模板等。
额外的问题:你能为标准库做到这一点吗?(例如 iostream 或字符串)
c++ - 使用 clang 将 std lib 作为模块导入
我正在尝试使用 clang 中的模块,并希望将标准库作为模块而不是包含在内。
目前我这样做
似乎您在 msvc 中应该能够导入标准库,例如
然而,当使用 clang 时,这似乎没有实现,或者以另一种方式实现。
我的问题是:是否可以像 microsoft 建议那样导入 stl-include,或者是否可以将标准 lib 包含映射到模块 somhow。
注意:我不能使用的原因#include <...>
或者#import <...>
是因为其他错误可能会产生自己的问题。所以我认为import std.core
如果可能的话,getting 或类似的方法是现在要走的路。
ModernesCpp还提到了 std.core。
c++ - C++ 模块导入链导致奇怪的编译器错误
使用 clang 编译 c++-20 模块时。导入一个导入另一个文件的文件时出现奇怪的编译错误,该文件又导入了第三个文件,如下所示:
编译器输出:
它还列出了一些似乎同时具有内联和非内联定义的函数,例如 isprint、iscntrl、isupper。
有什么办法可以绕过这些错误。
注意:删除std::string
并#include <string>
删除编译错误,所以我认为错误来自<string>
c++ - 如何制作自己的 std.core 模块声明?
但是,由于在 C++20 中将模块引入 C++,因此 std 库本身在 C++23 之前不能作为模块导入。
我想编写这样的代码,import std.core;
所以我尝试制作自己的 std 库,只需从std::
.
文件 stdcore.mpp 如下所示:
和 main.cxx:
用这些编译它们:
一切看起来都很好,但是当我执行此操作时:
我有:
这意味着什么?
c++ - 有没有办法用 gcc 查询直接模块依赖关系?
给定一个模块
有没有一种调用 gcc 的方法(类似于 -M 对标头所做的),它将列出对其他模块和导入标头(即 B、C 和“Dh”)的直接依赖关系?
c++ - 如何分发 C++ 模块?
使用“旧”C++ 编译模型组织和构建项目通常遵循一些常见做法:
- 将您的公共标头放在一个
include
目录中。 - 将实现和私有头文件放在一个
src
目录中 - 从您的源代码编译库
- 将库(静态或动态)与公共标头一起分发
当然,有很多不同的方法可以实现这一点,但这里的要点是:您将库二进制文件和公共标头作为纯文本分发。
现在有了模块,编译模型可以发生巨大变化。但到目前为止我发现的所有内容都只解释了如何在封闭项目中使用模块——没有分发,没有外部依赖项。
现在可以将属于特定模块的所有内容放在一个文件中(这将有一些很好的好处,例如避免重复声明)。这就提出了一个问题:我必须分发什么才能让其他人使用我的库?哪些部分可以保密?也许这可以通过实施单元解决?
c++ - clang 编译的模块 pcm 文件有什么用?
我正在查看 clang 模块的驱动程序测试用例: https ://github.com/llvm-mirror/clang/blob/master/test/Driver/modules.cpp
它包括生成 .pcm.o 文件的步骤。我想知道它们是干什么用的。
给定一个 c++20 模块
您可以使用编译它
生成预编译的模块文件a.pcm
。
但也有将 .pcm 文件编译为 .o 文件的步骤。
从驱动程序测试:
.pcm.o 文件是如何使用的?
如果我写一个主程序
编译
然后尝试与.pcm.o链接,我得到
注意:可以编译 am.cc
并与 ao 链接,但 .pcm.o 文件是做什么用的?并且它们可以用来避免在您预编译 am.cc 后再次编译它吗?