Projekt modułów C ++ (specyfikacja techniczna po C ++ 17)
Szkic i kilka zaktualizowanych wersji specyfikacji modułu C / C ++ zostało opublikowanych przez WG21 na open-std.org. Podam link tylko do najnowszych dokumentów tutaj:
- Working Draft, Extensions to C ++ for Modules N4610 (październik 2016).
- Czwarta rewizja opublikowana jako P0142R0 (marzec 2016).
- Sformułowanie dla modułów opublikowanych jako P0143R2 (marzec 2016).
- Zespół clang opublikował drugą wersję swoich zmian: P0273R1 (październik 2016).
Poniższe posty na blogu zawierają podsumowanie spotkań normalizacyjnych, aw szczególności podsumowanie aktualnego stanu projektu modułów:
Aktualizacja: Jak wyjaśniono w raporcie z podróży Kona, do którego odniosłem się powyżej, obecnie istnieją dwie konkurencyjne oferty, jedna od firmy Microsoft i jedna od Clang. Proponowane rozwiązanie firmy Microsoft nie pozwala na eksport makr, natomiast rozwiązanie zespołu Clang wspierałoby eksportowanie makr. Jak dotąd tylko Microsoft złożył formalnie projekt specyfikacji modułu.
Specyfikacja modułu zgodnie z propozycją firmy Microsoft
Oto krótki przegląd najważniejszych pojęć zawartych w tej propozycji. Ponieważ jest to szkic, może to się jeszcze zmienić. Nowy standard modułów będzie składał się między innymi z:
Słowo module
kluczowe do deklarowania modułu, wiele plików może zadeklarować to, aby zbudować jeden moduł (ale dla każdego modułu tylko jedna jednostka kompilacji może zawierać export {}
sekcję):
module M;
import
Słów kluczowych modułów importu, zamiast import
niego może być również postanowił wykorzystać using module
zamiast, więc można by uniknąć nowego słowa kluczowego import.
import std.io;
import module.submodule;
export
Składnia, która definiuje publiczne deklaracje , które są częścią tego modułu, bez interfejsu deklaracje , które nie powinny być wywożone w ramach modułu zostaną określone na zewnątrz bloku eksportu. Deklaracje mogą być dowolnymi deklaracjami w C / C ++, czyli nie tylko funkcjami, ale także zmiennymi, strukturami, szablonami, przestrzeniami nazw i klasami:
export {
int f(int);
double g(double, int);
int foo;
namespace Calc {
int add(int a, int b);
}
}
void not_exported_function(char* foo);
Ważną zmianą modułów będzie to, że makra i definicje preprocesorów będą lokalne dla modułów i nie będą eksportowane. Dlatego makra nie mają żadnego wpływu na importowane moduły:
#define FILE "my/file"
import std.io; //will not be impacted by the above definition
Należy zauważyć, że zarówno obecny system preprocesora, jak i moduły będą mogły współistnieć, a nagłówki mogą być nadal używane na przykład do dołączania makr.
Aby uzyskać bardziej szczegółowe informacje, proponuję przeczytać projekt.
Moduły Clang
Clang pracuje nad implementacją modułów, którą można znaleźć na stronie modułów clang . Jednak Clang nie implementuje obecnie konkretnej składni dla modułów, to znaczy żadna z wyżej wymienionych składni nie została zaimplementowana przez Clang. Aby to wyjaśnić, strona zawiera następujące oświadczenie:
Obecnie nie ma składni C lub C ++ dla deklaracji importu. Clang będzie śledzić propozycje modułów w komisji C ++. Zobacz sekcję Uwzględnia jako import, aby zobaczyć, jak moduły są dziś importowane.
Główną częścią obecnie wdrażaną przez Clang jest „Język mapy modułów”, który umożliwia pisanie map modułów dla istniejącego kodu, który nadal używa plików nagłówkowych.
Eksport makr z modułów
Jak wspomniano powyżej, nadal nie jest jasne, czy eksport makr będzie częścią ostatecznej wersji TS Modułów . W P0273R1 zaproponowano następującą składnię do eksportu makr:
#export define MAX(A,B) ((A) > (B)) ? (A) : (B);