问题标签 [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++ - 如何不使用`export`关键字从模块中导出函数和类?
我正在研究在我的宠物项目中使用 C++ Modules TS 的机会。对我来说,重要的用例之一是包装遗留标头。
假设我有一个包含一些函数和类的头文件std.io.ixx:
根据这篇文章,我使用以下命令编译模块:
这给了我一个新文件std.io.ifc
。然后我在另一个源文件main.cxx中使用这个模块:
使用以下命令编译:
编译给了我以下错误:
因此,正如我们所见,模块中的标识符没有被导出。export
我可以通过在要导出的每个标识符之前手动添加关键字来解决此问题,但这对于包装遗留标头的用例是不可能的。
我做错了什么?如何从标头中导出所有可能的标识符?
c++ - C++ 20?模块 - 不导出私人信息
观看了 2 CppCon Gabriel Dos Reis 关于模块 TS 的讨论。
我记得他不想导出任何私有成员/函数,所以其他模块根本无法使用它们。
我理解他的立场,但它不会与未来的 C++ 反射冲突吗?例如,当 C++ 具有可以枚举所有类函数的反射时,它不应该也能够枚举私有函数吗?
我知道,访问私有函数是不好的,但在极少数极端情况下它是必要的(有时需要 const_cast,尽管编写它的开发人员应该感觉很糟糕)
编辑:
并且“不暴露私有”至少有一个例外 - 如果类使用“非虚拟接口”模式
visual-c++-2015 - 为什么在 c++ 模块中导出时类成员内联初始化不起作用?
我刚刚开始在 Visual Studio 2015 中使用 C++ 中的实验模块,并发现在使用内联初始化时,在模块中导出的类和“普通”类之间的行为存在差异。
我的消费代码:
输出:
如果我为 Foo 即 Foo(){} 提供一个空的构造函数,那么上面的代码按预期工作,我得到 foo num = 34。(顺便说一下 Foo() = default; 不起作用,因为我得到未解决的符号错误。)
谁能解释发生了什么?这是一个错误还是我错过了与模块工作方式有关的东西?
c++ - 联合未定义结构中的 C++ 模块模板 - VC 2017
我正在尝试将 Visual Studio 2017 的实验模块内容与模块中的模板一起使用。这是我正在尝试制作的模块的简化示例
这就是我尝试使用模块和模板结构的方式
编译给出以下信息:error C2079: 'Struct_2::x' uses undefined struct 'Struct_1<T>
我知道模块是一个实验性功能,但是,当不使用模块时,定义这样的结构可以正常工作。它说Struct_1<T>
未定义,这是否意味着我需要以某种方式显式实例化模板?
我的编译器命令行如下所示:
cl /utf-8 /experimental:module MyModule.ixx /std:c++latest /W3 /Zi /MDd /EHsc main.cpp /link /OUT:test.exe /INCREMENTAL:NO
任何帮助表示赞赏。
更新
我认为这是某种 MSVC 编译器错误。我使用 Clang 编译了相同的代码,它工作正常。Clang 模块文件看起来和上面一样,除了文件扩展名是 .cppm 并且在顶部它有:
export module MyModule;
我的编译器命令行如下所示:
在使用模块之前等待 MSVC 编译器成熟一点可能是个好主意,但如果有人暂时知道解决这个问题的方法,我会很感兴趣。
谢谢
c++ - “导入标准;”的目的 在 C++ 中
我在cppdepend网站上看到了以下一小段代码。
那么,import std;
在 C++ 中的目的是什么?如何在 C++中使用import std;
而不是使用?using namespace std;
我尝试在G++编译器中编译程序,但出现错误。
c++ - 导出命名空间之后的所有内容都没有导出吗?
我正在阅读有关模块的内容,并且希望执行以下操作:
a.cpp
b.cpp
主文件
由于模块接口不能相互使用,为了使其工作,导出命名空间之后的所有内容都不能是接口的一部分。根据当前的TS,以上是否正确?对于实现中的循环依赖,是否需要将其拆分为另一个文件?
c++ - C++ 中的头文件和模块:朋友还是敌人?
有一个工作草案,模块的 C++ 扩展(可在Experimental C++ Features中找到)。如果这成为标准,这对传统标题意味着什么?
我的意思是,当我听说要导入模块时,我会想到 Angular 或 Python,我专门导入东西,而不是包含它们。
这是否意味着模块系统将取代包含?或者他们会一起玩,并在最适合的地方使用?
诸如将头文件中的特定函数包含到c ++代码中的材料以这种方式呈现。
c++ - 在 Linux 上使用带有标准头文件的 C++ 模块 TS
我正在使用模块 ts 测试一个简单的 C++ 模块:
当我尝试在 linux 上使用 clang (trunk) 和 GCC 7.2 头文件编译它时,我得到了这个:
我试图预先包含<bits/gthr-default.h>
(在 之前export module
),但后来我收到关于time.h
和sched.h
...的错误
有谁知道如何编译它?
(有关完整的错误消息,请参见此处:https ://godbolt.org/g/wfjmpW )
c++ - C ++模块:不必要的重新编译的模块实现单元?
最近观看的 CppCon 2017 视频:Boris Kolpackov “构建 C++ 模块” https://www.youtube.com/watch?v=E8EbDcLQAoc
大约在 31 点 35 分,他开始解释我们仍然应该使用标头/源拆分,并展示了 3 个原因。第一个原因:
如果您在触摸此模块时将两个声明/定义放在同一个位置,则将重新编译依赖于模块接口(BMI) 的所有其他模块。
我一点也不喜欢。听起来我们还处于 90 年代,编译器还不够聪明,无法看到与 BMI 相关的更改和与实现相关的更改的差异。正如我所看到的,编译器能够快速扫描每个模块并从中仅生成 BMI。如果 BMI 没有改变 - 不要重新编译依赖它的其他模块。
还是我错过了什么?