苹果Clang 13 C++20模块支持缺失
根据官方文档 Clang 13支持C ++ 20模块通过使用-fmodules命令行参数. 我什至无法使用Clang 13(Macos Monterey)在Intel或M1的Macs上获得基本模块. 假设文件的以下文本内容module.cpp: export module a; export int f(int a, int b) { return a + b; } 运行以下内容: $ clang++ --version Apple clang version 13.0.0 (clang-1300.0.29.3) Target: x86_64-apple-darwin21.1.0 $ clang++ -std=c++20 -stdlib=libc++ -fmodules -fbuiltin-module-map -c module.cpp module.cpp:1:8: error: expected template export module
20 2024-03-02
编程技术问答社区
在Visual Studio 2022中导入外部C ++ 20模块
我正在Visual Studio 2022中探索C ++ 20的模块,并且正在研究外部模块.一个项目中已编译的模块,我将其称为图书馆项目,并在另一个项目中导入.据我了解,这可以通过将库项目编译为静态库并生成.lib文件来完成,然后可以将其作为另一个项目的依赖性添加.然后,要添加库项目中的模块接口,我可以通过将其相应的.ixx.ifc文件添加到C/C++ -> Additional Module Dependencies. 来添加每个模块接口 这可以正常工作,但是我想知道是否有更好的方法可以做到这一点,因为指定每个.ixx.ifc文件对大型库会变得混乱.也许有一种方法可以将模块组合为可以导入的较大模块,而无需导入较小的模块?我已经尝试在其中添加一个新的模块和export import - 在其中添加其他模块,但是我似乎仍然必须将每个其他模块'.ixx.ifc文件添加为依赖项.也许有一种方法可以一次添加多个.ixx.ifc文件作为依赖项? 解决方案 项目参考通常足够 在Vi
22 2023-11-24
编程技术问答社区
当实现在独立的模块单元中时,C++20模块程序会失败
在重新分配我的项目以与模块一起使用之前,我写了一个测试项目ExImMod,以查看是否可以将模块文档中宣传的声明和定义分开.对于我的项目,我需要将声明和定义保留在单独的翻译单元(tu)中,这也可以根据模块文档.我不想使用模块分区. 不幸的是,我的测试ExImMod项目表明它们不能完全分开,至少对于Visual Studio 2022(STD:C ++最新)编译器(VS22). 这是我的主要测试程序: // ExImModMain.cpp import FuncEnumNum; import AStruct; int main() { A a; a.MemberFunc(); } A的成员函数MemberFunc()在此处声明: // AStruct.ixx // module; // global fragment moved to AMemberFunc.cppm (Nicol Bolas) // #include expor
20 2023-11-24
编程技术问答社区
C++模块中的前向声明(MSVC)
我最近一直在尝试MSVC提供的模块实现,并且我遇到了一个有趣的方案.我有两个类在其界面中具有相互依赖的类别,这意味着我必须使用前瞻性声明来进行编译.以下代码显示了一个示例: Module interface export module FooBar; export namespace FooBar { class Bar; class Foo { public: Bar createBar(); }; class Bar { public: Foo createFoo(); }; } Module implementation module FooBar; namespace FooBar { Bar Foo::createBar() { return Bar(); } Foo Bar::createFoo() {
16 2023-11-20
编程技术问答社区
在C++20模块中用前向声明来打破循环依赖的做法不可行
我已经在这个问题上一直在敲打这个问题,我阅读了很多文档和有关新的C ++ 20模块的帖子,其中这个官方的,这个和 stackoverflow上的另一个,但我确实无法解决这个问题. 我正在使用使用 Visual Studio Preview 16.6.0 2.0 交付的MSVC编译器.我知道这还不是一个稳定的版本,但是我想弄乱新功能以开始学习它们. 基本上,我编写了该模块的模块(myModule)和2个分区(mySubmodule1和mySubmodule2),然后在两个模块实现文件(mySubmodule1Impl.cpp和mySubmodule2Impl.cpp)中实现了它们. mySubmodule1对mySubmodule2有一个依赖性,反之亦然.这是来源: mySubModule1.ixx export module myModule:mySubmodule1; export namespace myNamespace{ class MyClas
14 2023-11-20
编程技术问答社区
什么是C++模块的权限?
我在C ++模块的上下文中看到了一些对" purview"一词的引用,例如,在 https://gcc.gnu.org/wiki/cxx-modules : Baz (); // Baz's declaration visible from purview Quux interface c ++模块purview到底是什么? 解决方案 让我们将这个问题分为三个部分: 什么是C ++模块? 什么是purview? 什么是C ++模块的puview? C ++模块 模块是C ++的未来功能,目前不是语言标准的一部分(即,不在 c ++ 17 ).简而言之,模块旨在允许您导入解析/编译的C ++构造,而不是将标头文件预备到您的翻译单元(使用#include预处理程序指令).文本包含大量的标题文本是使C ++汇编缓慢的一部分.如果我们可以一次编译大多数"标题"代码,请知道它为我们提供了什么,并让编译器记住(以"模块"的形式),我们可以告诉编译器我们使用的是
20 2023-10-17
编程技术问答社区
如何在C++模块中使用标准库?(例如: `import std.io`)
// foo.cppm: export module foo; // works: #include // none of these work: import std.stdio; import std.io; import std; export void test_foo(){ printf("hello world\n"); } 这给出了一个错误: 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的Cl
88 2023-09-29
编程技术问答社区
C++20模块的 "循环依赖性"
im试图在另一个模块中包含一个模块,但是由于以下错误,我无法编译: "无法构建以下源文件,因为它们之间存在环状依赖性:module1.ixx取决于module2.ixx依赖于module1.ixx." 我想modClass1_包含modClass2_类,modClass2_包含一个指针到静态modclass1 _. 代码我尝试使用C ++ 17标头和源文件(.h and .cpp)成功尝试 // Class1.h #pragma once #include "Class2.h" class modClass2_; class modClass1_ { public: modClass1_() {}; ~modClass1_() {}; int V = 2; int getV() { return V; }; static modClass2_ mc2; }; extern modClass1_ mc1; // Class1.
256 2023-03-30
编程技术问答社区
如何用CMake来使用c++20模块?
clang 和 msvc 已经支持模块ts 来自未完成的C ++ 20标准. 我可以使用CMAKE或其他构建系统构建基于模块的项目,以及如何? 我尝试了 build2 ,它支持模块,并且效果很好,但是我有一个问题关于它的依赖性管理(upd:Question:Question:topedial Conseal). 解决方案 cmake当前不支持C ++ 20模块. 另请参见 cmake问题跟踪器中的相关问题.请注意,支撑模块比插入新的编译器选项需要更多的支持.它从根本上改变了构建过程中必须处理源文件之间的依赖性:在预模型世界中,所有CPP源文件都可以按任何顺序独立构建.有了不再正确的模块,这不仅对CMAKE本身有影响,还对下游构建系统也有影响. 看一下 fortran模块纸细节.从构建系统的角度来看,Fortran的模块的行为与C ++ 20模块非常相似. 更新: cmake 3.20引入了对模块的实验支持,该模块使用忍者发生器(and for Ninja)
1598 2023-03-15
编程技术问答社区
使用clang链接C++模块TS
我正在尝试将C ++模块与Clang一起使用. 我已经创建了两个文件: // foo.cppm export module foo; export void test() { } 和 // bar.cpp import foo; int main() { test(); return 0; } i编译foo.cppm使用此命令 clang++ --std=c++17 -fmodules-ts --precompile foo.cppm -o foo.pcm 它没有错误编译并创建foo.pcm文件,但是当我尝试使用此命令编译二进制文件时: clang++ --std=c++17 -fmodules-ts -fprebuilt-module-path=. -fmodule-file=foo.pcm bar.cpp 它打印一个错误: /tmp/bar-f69a1f.o: In function `main': bar.cpp:(.
16 2023-03-12
编程技术问答社区
如何在CLang C++下编译/使用头文件单元模块?
在文档中据说Clang中的模块支持是部分的.我在Windows 64位下使用LLVM 12.0的Windows 64位. . 我成功地使用了常规模块(您通过import modulename;导入). ,但我尚未设法创建和使用您通过import "header.hpp";导入的标头单元模块.您能建议如何使用示例做到这一点? 对于尝试标头单元,我创建了下一个玩具文件: hello.hpp : #include 使用.cpp : import "hello.hpp"; int main() { std::vector v(123); } 然后我成功(我希望)将标头单元hello.hpp纳入PCM文件: clang++ -std=c++20 -Xclang -emit-header-module -I. hello.hpp -o hello.pcm 命令无错误运行并产生hello.pcm.如果在没有-o标
154 2023-03-11
编程技术问答社区
我如何在Clang中使用C++模块?
模块是#crudes的替代方法. clang拥有C ++的完整实现.如果我想立即使用clang使用模块,该怎么办? 使用 import std.io; 在C ++源文件中尚不正常(编译),因为模块的规范(包括语法)不是最终的. clang documentation c0>标志,#includes将被重写其适当的导入.但是,检查预处理器建议其他建议(test.cpp仅包含#include 和一个空的主体): $ clang++-3.5 -fmodules -E test.cpp -o test $ grep " printf " test extern int printf (const char *__restrict __format, ...); 此外,用-fmodules vs vs no vrags编译此测试文件会产生相同的对象文件. 我在做什么错? 解决方案 就像您提到的那样,Clang还没有c ++语法用于导入
258 2023-03-11
编程技术问答社区
C++-模块导入链导致奇怪的编译器错误
用叮当声编译C ++ -20个模块.导入导入另一个文件的文件时,我会遇到奇怪的编译错误: : // a.cppm #include export module a; export std::string getStuffA() { return "a"; } // b.cppm #include import a; export module b; export std::string getStuffB() { return "b" + getStuffA(); } // c.cpp #include import b; int main() { std::cout
22 2023-03-11
编程技术问答社区
Clang++ -fmodules在#include <cstdint>之后使用类型的错误。
使用下面显示的命令,使用Clang的Github镜像中的"主人"的提示给我带来的编译时间错误.我想知道这是否是针对Clang的新实验模块功能的错误 - 也许是标准库模块地图实现的问题 - 或者我是否做错了.如果我将-fbuiltin-module-map添加到命令中,仍然会出现错误.有趣的是,如果我用stdint.h代替cstdint. ,该错误将不再出现. #include uint64_t foo; 这是我的编译命令,带有错误消息: anhall@leviathan: /Users/anhall/impersonal/code/llvm-reflexpr/install/bin/clang++ -o module-uint64_t-test.o -c module-uint64_t-test.cpp --std=c++1z -fmodules module-uint64_t-test.cpp:3:1: error: missing '#includ
90 2023-03-11
编程技术问答社区
使用遗留的头文件作为c++20模块
我正在将我的旧代码转换为可作为C ++模块导入的东西.问题在于,我希望它仍然可以正常工作并轻松作为旧标头/源版.我该怎么做(如果可能的话). 是否可以创建导出标头内容的模块? (也可以接受任何其他可以维护旧的.cpp/.h文件和模块文件的解决方案) 玩具示例: // In vector.h template struct Vector { T x, y; } // In .cppm export module vector; // #include "vector.h" // Export struct/class Vector from header 我尝试过的只是export Vector在不同版本中,带有和没有模板等. 奖励问题:您可以为STD Lib做到这一点吗? (对于Exmaple iostream或字符串) 解决方案 最近我创建了两个答案第一个关于如何从任何旧的旧模块中创建模块(在clang中) - 风
88 2023-03-11
编程技术问答社区
如何在gcc或clang中用c++20包含多个预编译的头文件(启用模块)。
在C ++ 20中,当启用模块时,每个包含都应该被封装,以使订购无关紧要,并且宏不泄漏等等. . 显然是问题如果有可能预编译多个标题是YES. 我现在的问题是:您如何执行此操作:也就是说:我首先要预编译一组标题,然后使编译器(全部)成为我的预编译标题使用C ++ 20模块的翻译单元(使用Linux命令行). 我想为G ++提供解决方案,但是如果只有clang才有可能,那么答案就可以了. 请注意,这个问题已过时. 解决方案 如何包含多个预编译的标头...在GCC 中 没有办法.正如文档所说: 仅一个预编译标头可以在特定的汇编中使用. (启用模块)在GCC 中 在写作时,没有发布的GCC版本支持模块. 目前尚不清楚"包含预编译标头"与模块的完全相关,但我猜您可能对Clang文档的"使用预制模块"部分感兴趣.
100 2023-03-11
编程技术问答社区
用clang导入std lib作为模块
我正在使用Clang中的模块进行实验,并希望将标准LIB作为模块而不是AS包含. 目前我这样做 #include #include 似乎您在MSVC 应该能够用例如 导入标准液体 import std.core; 使用clang时,似乎并未实现或以其他方式实现. 我的问题是:是否可以像Microsoft建议的那样导入包括STL,还是可以映射标准LIB包含在模块中. 注意:我无法使用#include 或#import 的原因是因为其他可能会有自己的问题的错误.因此,我认为如果可能的话,获得import std.core或类似的方法. ModernEscpp 也提到了STD.Core. 解决方案 C ++ 20标准不包括C ++标准库的模块定义. Visual Studio do (不幸的是),许多不良站点将是标准的.但这不是;这只是Microsoft的事情. 如果要通过平台上
34 2023-03-11
编程技术问答社区
如何使用g++在c++ 20中使用模块?
我阅读此链接 - 模型 ,并试图从本网站复制以下示例.我已经知道该编译器部分支持模块系统. (注意:我使用Windows) // hello.cc module; #include #include export module hello; export void greeter(std::string_view const &name) { std::cout
44 2023-03-02
编程技术问答社区
有没有办法用gcc直接查询模块的依赖性?
给定一个模块 // a-m.cc export module A; import B; import C; import "D.h"; ... 是否有一种调用GCC的方法(类似于-m对标题的作用),它将列出其他模块和导入标头的直接依赖项(即B,C和" D.H")? 解决方案 [编辑] 似乎我们可以使用flag -MMD调用GCC,该>也跟踪模块依赖性.给定一个示例项目,我这样生成了: // partition.cpp export module partition; import :partition1; export import :partition2; export import :partition3; export void Hello1() { _Hello1(); } 由于某种原因,我需要在编译主模块接口之前对模块分区进行编译(上面显示的文件),但也许可以以某种方式规避.我像这样编译上述文件: g++-11 -std=c++
28 2023-03-02
编程技术问答社区