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

#c #visual-studio #visual-c #c 20 #c -modules

#c #visual-studio #visual-c #c 20 #c -модули

Вопрос:

Поддержка модулей 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

Комментарии:

1. Модули реализации модулей A и B могут import B; и import A; соответственно, но не интерфейсные модули. Здесь вам нужно объединить модули (поскольку ни один из них не имеет смысла без другого в любом случае).

Ответ №1:

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

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

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

Комментарии:

1. Это имело бы смысл, потому что это поддерживается в Java, C # и многих других языках, но если вы скажете, что этого никогда не было в предложении, то это ответ на мой вопрос. Я все еще думаю, что Visual Studio не должна аварийно завершать работу.

2. @AlbertVacaCintora: Да, это не должно привести к сбою, но это ошибка компилятора / системы сборки.