MSVC: модули C ++ 20, которые импортируют друг друга, не компилируются

Поддержка модулей C ++ 20 недавно была добавлено в MSVC 16.8. Если я не ошибаюсь, одним из преимуществ использования модулей является то, что теперь поддерживаются циклические зависимости импорта. Однако следующий тестовый проект по-прежнему не может быть скомпилирован в последней версии компилятора 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


person Albert Vaca Cintora    schedule 22.11.2020    source источник
comment
Модули реализации модулей A и B могут import B; и import A; соответственно, но не модули интерфейса. Здесь вам нужно объединить модули (поскольку ни один из них не имеет смысла без другого).   -  person Davis Herring    schedule 22.11.2020


Ответы (1)


Если я не ошибаюсь, одним из преимуществ использования модулей является то, что теперь поддерживаются циклические зависимости импорта.

Мне неизвестны версии предложений, стандартов или реализаций модулей, которые когда-либо поддерживали циклические зависимости. Практически в каждой версии модулей как концепции, начиная с итераций до C ++ 11, всегда требовалось, чтобы граф зависимостей модулей был направленным, ациклическим графом.

Даже не имеет смысла, как это будет работать. Если вы импортируете модуль, то по определению вам необходимо, чтобы этот модуль был скомпилирован, прежде чем вы сможете скомпилировать модуль, который его импортирует. Но если этот модуль требует и ваш модуль, порядок компиляции модулей отсутствует. И вы не можете просто скомпилировать модуль сейчас и ждать, пока появится что-то еще, чтобы заполнить пробелы или что-то в этом роде. C ++ просто так не работает.

person Nicol Bolas    schedule 22.11.2020
comment
Это имело бы смысл, потому что это поддерживается в Java, C # и многих других языках, но если вы скажете, что этого никогда не было в предложении, то это ответит на мой вопрос. Тем не менее, я все еще считаю, что Visual Studio не должна давать сбой. - person Albert Vaca Cintora; 23.11.2020
comment
@AlbertVacaCintora: Да, сбой не должен быть, но это ошибка компилятора / системы сборки. - person Nicol Bolas; 23.11.2020