Что такое C++?

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

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

Что такое C++?

Ответы

Ответ 1

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

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