如何在导出模块中使用#include?

问题描述 投票:0回答:2
module;
#include <iostream>
export module modultest;
export class Test{
    public:
    Test(){}
    void print(){
        
    }
};

我想使用

print
创建一个
cout
函数,我需要
<iostream>
来实现,但是如果我包含
iostream
我会收到多个错误,例如:

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

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

c++ c++20 c++-modules
2个回答
2
投票

实际上,您的代码是正确的。 Includes需要放入全局模块片段中:

module; // global module fragment
#include <iostream> // correct, inside the global module fragment

export module modultest; // named module declaration

// module purview, owned by module modultest
export class Test {
    public:
    Test(){}
    void print(){
        
    }
};

此代码是正确的,因为

module;
之后的所有内容都位于全局模块片段中,可以在其中包含任何内容。然后,您声明命名模块,之后的任何其他内容都是模块本身的一部分。

您遇到的错误是编译器错误。这是因为 GCC 目前对模块的支持很差。希望您的代码能够与其他编译器或未来版本的 GCC 一起使用。


1
投票

根据 cppreference.com:

导入模块和标头单元

...

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

导入

导出(可选)导入标头名称属性(可选);

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

...

因此,请尝试将

#include <iostream>
替换为
import <iostream>;

© www.soinside.com 2019 - 2024. All rights reserved.