如何将 #include 与模块一起使用?

How do i use #include with modules?

提问人:YetiFan14 提问时间:11/16/2023 最后编辑:Remy LebeauYetiFan14 更新时间:11/16/2023 访问量:112

问:

module;
#include <iostream>
export module modultest;
export class Test{
    public:
    Test(){}
    void print(){
        
    }
};

我想使用 创建一个函数,我需要,但如果我包含,我会得到多个错误,例如:printcout<iostream>iostream

error: redefinition of 'void operator delete(void*, void*)'
  180 | inline void operator delete  (void*, void*) _GLIBCXX_USE_NOEXCEPT { }

我在 VSCode 中使用 g++ 编译器。

C ++20 C++模块

评论

0赞 tadman 11/16/2023
vs. 的顺序是否。 这里有什么关系吗?#includemodule
1赞 YetiFan14 11/16/2023
module-declaration 只允许作为第一个声明,因此无法将 #include 与模块切换。
0赞 Guillaume Racicot 11/16/2023
这是一个编译器错误。GCC 还不支持模块。尝试使用 clang 或 MSVC
0赞 tbxfreeware 11/16/2023
首先:如果你只是想玩,我建议下载Visual Studio的(免费)社区版。与gcc相比,Microsoft似乎在模块实现方面遥遥领先。第二:我尝试在 Visual Studio 中运行您的代码。您的模块编译完美,但我在模块 main 中遇到了一个奇怪的编译器错误,我在其中放置了函数,并且还导入了模块。程序不会运行,直到我放入模块 main 的全局模块片段!当我这样做时,一切都很顺利。mainmodultest#include <compare>
0赞 tbxfreeware 11/16/2023
虽然它仍然被认为是“实验性的”,并且还不建议用于生产代码,但Microsoft在几个月前就实现了。很甜!使用 ,唯一需要包含在全局模块片段中的标准库标头是依赖于宏的标头,例如 。这些应该包含在他们的 C 形式中。如果包含像 这样的标头,则会出现错误,这些标头将 C 函数包装在 中。import stdimport std<assert.h><cassert>namespace std

答:

0赞 Remy Lebeau 11/16/2023 #1

每 cppreference.com:

导入模块和标头单元

...

不应在模块单元中使用 #include在全局模块片段之外),因为所有包含的声明和定义都将被视为模块的一部分。相反,也可以使用导入声明将标头导入为标头单元

export(可选) import header-name attr(可选);

标头单元是从标头合成的独立翻译单元。导入标头单元将使其所有定义和声明都可访问。预处理器宏也是可访问的(因为预处理器可以识别导入声明)。

...

因此,请尝试改用。#include <iostream>import <iostream>;

评论

5赞 Guillaume Racicot 11/16/2023
奇怪的是,OP 的代码是正确的,因为 include 位于全局模块片段中。我强烈怀疑 GCC 错误,因为 GCC 没有良好的模块支持