MSVC:相互导入的 C++20 模块无法编译

MSVC: C++20 modules that import each other fail to compile

最近 added in MSVC 16.8 支持 C++20 模块。如果我没记错的话,使用模块的优点之一是现在支持循环导入依赖项。但是下面的测试项目在微软最新版本的编译器中仍然无法编译。

computer.ixx

export module computer;

import printer;

export struct Computer {
    Printer* printer;
};

printer.ixx

export module printer;

import computer;

export struct Printer {
    Computer* computer;
};

main.cpp

import computer;
import printer;

int main() {
    Computer* c = new Computer();
    Printer* p = new Printer();
    p->computer = c;
    c->printer = p;
}

尝试编译此代码会导致: MultiToolTask has encounted an issue scheduling task because one or more tasks still remains but none could be started. Please check the inputs and their dependency to avoid cirular loops.(拼写错误逐字复制)并混淆 IntelliSense,挂起甚至崩溃 Visual Studio。

我也试过颠倒导入和导出行的顺序,但没有解决问题。

我知道这仍然是一个 Beta 版功能,但我想确保我的假设是正确的(这段代码应该有效),如果代码中有任何错误我应该更改以使其正常工作。

如果您想自己尝试,可以在此处找到包含上述代码的 MSVC 项目:https://github.com/albertvaka/ModulesTest

If I'm not mistaken, one of the advantages of using modules is that circular import dependencies are now supported.

我不知道有任何版本的模块提案、标准或实现 曾经 支持循环依赖。在几乎每个版本的模块中作为一个概念,甚至可以追溯到 C++11 之前的迭代,模块依赖图总是被要求是有向的,非循环 图。

它甚至不知道它是如何工作的。如果您导入一个模块,那么根据定义,您需要先编译该模块,然后才能编译导入它的模块。但是,如果该模块也需要您的模块,则没有编译模块的顺序。你不能现在就“有点”编译一个模块,然后等待其他东西出现来填补空白之类的。 C++ 不能那样工作。