Что такое модуль C++?
Я видел несколько ссылок на термин "компетенция" в контексте модулей C++, например, в https://gcc.gnu.org/wiki/cxx-modules:
Baz (); // Baz's declaration visible from purview Quux interface
Что именно относится к модулю C++?
1 ответ
Давайте разберем этот вопрос на три части:
- Что такое модуль C++?
- Что такое компетенция?
- Какова сфера деятельности модуля C++?
Модули C++
Модули являются будущей функцией C++ и в настоящее время не являются частью языкового стандарта (то есть не в C++ 17). В двух словах, модули предназначены для того, чтобы вы могли импортировать проанализированные / скомпилированные конструкции C++, а не текстовые файлы заголовка в ваш модуль перевода (что мы и делаем в настоящее время, используя #include
директивы препроцессора). Текстовое включение огромного количества текста заголовка является частью того, что замедляет компиляцию C++; если бы мы могли скомпилировать большую часть кода "заголовка" один раз, знать, что он нам предлагает, и компилятор запомнил бы только это (в форме "модулей"), мы могли бы сказать компилятору, что мы используем материал из определенных модулей, а не в том числе много заголовков.
Термин "компетенция"
Это английский термин, который используется в основном на юридическом языке, поэтому многие из нас (которые не говорят по-английски) никогда не слышали его. Что ж, давайте посмотрим на это в словаре (Merriam-Webster):
кругозор, н.:
1.
(а) тело или принимающая часть закона
(б) предел, цель или область действия закона
2. диапазон или предел полномочий, компетенции, ответственности, озабоченности или намерения
3. диапазон зрения, понимания или познания
Так что, в основном, "сфера действия X" = "Что Х покрывает или содержит".
Сфера компетенции модулей C++
Теперь давайте взглянем на черновик технической спецификации модулей C++ (именно он определяет предлагаемую функцию модулей). Это объяснит, что является целью модуля:
Область действия модуля начинается с объявления модуля и продолжается до конца модуля перевода. Сфера именованного модуля M - это набор сфер модульных модулей модулей М.
Таким образом, в основном, когда вы пишете объявление модуля, вы начинаете с объявлений, которые не охватываются моделью (например, откуда-то еще), затем вы "запускаете", определяя экспорт модуля, а затем перечисляете объявления / определения, которые покрыты. по модулю.
Пример:
// module interface of module M
int f();
export module M;
int g();
export int h();
Так int g()
а также int h()
находятся в "компетенции модели", но int f()
нет.
В этом примере есть только один "модульный блок"; если у нас были дополнительные файлы / переводческие единицы, их соответствующее содержание после export module M
также будет в компетенции.