Что такое модуль C++?

Я видел несколько ссылок на термин "компетенция" в контексте модулей C++, например, в https://gcc.gnu.org/wiki/cxx-modules:

Baz (); // Baz's declaration visible from purview Quux interface

Что именно относится к модулю C++?

1 ответ

Давайте разберем этот вопрос на три части:

  1. Что такое модуль C++?
  2. Что такое компетенция?
  3. Какова сфера деятельности модуля 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 также будет в компетенции.

Другие вопросы по тегам