0

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

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 崩溃。

我还尝试颠倒导入和导出行的顺序,但这并没有解决问题。

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

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

4

1 回答 1

2

如果我没记错的话,使用模块的优点之一是现在支持循环导入依赖项。

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

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

于 2020-11-22T15:15:15.463 回答