Faza 7: Białe znaki oddzielające żetony nie mają już znaczenia. Każdy token przetwarzania wstępnego jest konwertowany na token. Otrzymane tokeny są analizowane składniowo i semantycznie oraz tłumaczone jako jednostka tłumaczeniowa.
Faza 8: Przetłumaczone jednostki tłumaczeniowe i jednostki instancyjne są łączone w następujący sposób: Każda przetłumaczona jednostka tłumaczeniowa jest sprawdzana w celu utworzenia listy wymaganych instancji. Znajdują się definicje wymaganych szablonów. To, czy źródło jednostek tłumaczeniowych zawierające te definicje ma być dostępne, jest zdefiniowane przez implementację. Wszystkie wymagane instancje są wykonywane w celu utworzenia jednostek instancji.[ Uwaga: Są one podobne do przetłumaczonych jednostek tłumaczeniowych, ale nie zawierają odniesień do szablonów nieinstancjalnych ani definicji szablonów. —przypis końcowy] Program jest źle sformułowany, jeśli jakakolwiek instancja nie powiedzie się.
Usunąłem część notatek, aby skrócić wklejony tekst.
Dlaczego lokalizowanie i tworzenie instancji szablonów jest wykonywane po tym, jak jednostka tłumaczeniowa została już przetłumaczona w fazie kompilacji C++ 8? Czy te kroki nie powinny mieć miejsca w fazie 7, biorąc pod uwagę dwufazowe wyszukiwanie nazwy?
2 odpowiedzi
Jako szczegół implementacji, oddzielenie tłumaczenia jednostek tłumaczeniowych od tworzenia instancji szablonu może mieć sens, ponieważ może zmniejszyć zbędną pracę podczas tworzenia instancji szablonów. Jednak większość obecnych kompilatorów tworzy instancje wszystkich szablonów podczas translacji jednostek translacji i eliminuje zduplikowane instancje w czasie łączenia.
Mamy nadzieję, że koncepcje i moduły pozwolą w przyszłości na ponowne wprowadzenie podobnej funkcji do języka.
Uważam, że ta część dotyczy wstępnej kompilacji typów szablonów. Dowolny typ, który jest szablonem, będzie „jednostką wystąpienia”. Jeśli typ szablonu jest wstępnie skompilowany, należy go obsłużyć w tej fazie.
Podobne pytania
Nowe pytania
c++
C ++ to język programowania ogólnego przeznaczenia. Pierwotnie został zaprojektowany jako rozszerzenie C i ma podobną składnię, ale teraz jest to zupełnie inny język. Użyj tego tagu w przypadku pytań dotyczących kodu (który ma zostać) skompilowany za pomocą kompilatora C ++. Użyj znacznika specyficznego dla wersji w przypadku pytań związanych z określoną wersją standardu [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] lub [C ++ 23] itp. .