Ответ 1
Давайте разберем этот вопрос на три части:
- Что такое модуль C++?
- Что такое компетенция?
- Что такое модуль C++?
C++ модули
Модули являются будущей особенностью C++ и в настоящее время не являются частью языкового стандарта (то есть не в C++ 17). В двух словах, модули предназначены для того, чтобы позволить вам импортировать проанализированные/скомпилированные конструкции C++, а не текстовые файлы заголовков в ваш модуль перевода (что мы и делаем в настоящее время, используя директивы препроцессора #include
). Текстовое включение огромного количества текста заголовка является частью того, что замедляет компиляцию C++; если бы мы могли скомпилировать большую часть кода "заголовка" один раз, знать, что он нам предлагает, и компилятор запомнил бы это (в форме "модулей"), мы могли бы сказать компилятору, что мы используем материал из определенных модулей, а не включая много заголовков.
Термин "компетенция"
Это английский термин, который используется в основном на юридическом языке, поэтому многие из нас (которые не говорят по-английски) никогда не слышали его. Хорошо, давайте посмотрим на это в словаре (Merriam-Webster):
purview, н. :
1.
(a) основа или часть устава
(b) предел, цель или область действия закона
2. диапазон или предел полномочий, компетенции, ответственности, озабоченности или намерения
3. диапазон зрения, понимания или познания
Так что, в основном, "сфера действия X" = "Что Х покрывает или содержит".
Сфера применения C++ модулей
Теперь давайте взглянем на черновик технической спецификации модулей C++ (именно это определяет функцию предлагаемых модулей). Это объяснит, что такое область действия модуля:
Область действия модуля начинается с объявления модуля и продолжается до конца модуля перевода. Область именованного модуля M - это набор областей модулей модуля модулей Ms.
Таким образом, в основном, когда вы пишете объявление модуля, вы начинаете с объявлений, которые не охватываются модулем (например, откуда-то еще), затем вы "запускаете", определяя экспорт модуля, затем вы перечисляете декларации/определения, которые охватываются модулем.
Пример:
// module interface of module M
int f();
export module M;
int g();
export int h();
Таким образом, int g()
и int h()
входят в "область компетенции модели", но int f()
нет.
В этом примере есть только один "модульный блок"; если бы у нас были дополнительные файлы/переводческие единицы, их релевантное содержимое после export module M
также было бы в компетенции.