Implementace jazyka C++ v RAD Studiu 10.3

Software |

Jazyk C++ prochází v poslední době bouřlivým vývojem. Připomeňme si, že verze standardu tohoto jazyka vydané postupně v letech 2011, 2014 a 2017 přinesly řadu nových možností.

Implementace jazyka C++ v RAD Studiu 10.3




Jazyk C++ prochází v poslední době bouřlivým vývojem. Připomeňme si, že verze standardu tohoto jazyka vydané postupně v letech 2011, 2014 a 2017 (na které se budeme zkráceně odvolávat jako na C++11, C++14 a C++17) přinesly řadu nových možností jak v syntaxi, tak především ve standardních knihovnách. Totéž se očekává i od příští verze, jejíž vydání se předpokládá v roce 2020 (C++20, někdy označované též C++2x).

 

Implementace jazyka C++ v RAD Studiu 10.3

 

Jazyk C++ prochází v poslední době bouřlivým vývojem. Připomeňme si, že verze standardu tohoto jazyka vydané postupně v letech 2011, 2014 a 2017 (na které se budeme zkráceně odvolávat jako na C++11, C++14 a C++17) přinesly řadu nových možností jak v syntaxi, tak především ve standardních knihovnách. Totéž se očekává i od příští verze, jejíž vydání se předpokládá v roce 2020 (C++20, někdy označované též C++2x).  

Překladače C++ v předchozích verzích RAD Studia vycházely ze standardu z roku 2003 a implementovaly některé z novinek standardu C++11. Proto jsem zjišťoval, jak se překladače v RAD studiu vyrovnávají s nejzajímavějšími novinkami jednotlivých standardů počínaje C++11.

Nejprve se však zastavíme u přehledu překladačů C++, které RAD Studio 10.3 Rio používá.

 

Překladače

Součástí RAD Studia je 8 překladačů jazyka C++ pro různé platformy; jejich přehled ukazuje následující tabulka převzatá z dokumentace:

 

Překladač

Cílová platforma

Verze Clang

Verze LLVM

BCC32

Win32

-

-

BCC32c

Win32

5.0

5.0

BCC32X

Win32

5.0

5.0

BCC64

Win64

3.3

3.3

BCCIOSARM

iOS 32bit

3.3

3.3

BCCIOSARM64

iOS 64bit

3.3

3.5

BCCAARM

32bitový iOS

3.3

3.3

BCCOSX

MacOS 32bit

-

-

 

Připomeňme si, že BCC32 je překladač pro dvaatřicetibitová Windows, který je potomkem původního překladače z první verze C++Builderu vydaného firmou Borland. BCC32C a BCC64 jsou novější překladače pro dvaatřicetibitová, resp. pro čtyřiašedesátibitová Windows, založené na vstupní části Clang a na koncové části LLVM – bohužel však na různých verzích. Překladač BCC32X je stejný jako BCC32C, liší se pouze přepínače v příkazové řádce; zatímco BCC32C je má podobné jako BCC32, BCC32X je má stejné jako je obvyklé u překladačů založených na Clang.

Překladač BCCOSX je založen na původním překladači C++ v RAD Studiu BCC32.

Na rozdíl od předchozích verzí RAD Studia je nyní pro aplikace pro Win32 nastaven jako výchozí překladač BCC32C, o původní překladač je třeba požádat v dialogu s vlastnostmi projektu.

Protože překladače BCC64, BCCIOSARM a BCCAARM jsou založeny na stejné verzi Clang, budu v následujících přehledech uvádět výsledky pouze pro BCC64. Podobně nebudu uvádět výsledky pro BCC32X, který je co do implementace jazyka C++ shodný s BCC32C, a pro BCCOSX, který odpovídá BCC32.

 

Podpora vybraných novinek jazyka C++11

V následujících oddílech se vždy nejprve budeme zabývat vlastním jazykem C++, pak standardní knihovnou. Vždy si nejprve uvedeme přehlednou tabulku, za níž bude následovat podrobnější výklad k některým položkám.

 

Vlastnost

BCC32

BCC32C

BCC64

Specifikátor auto

Ano

Ano

Ano

Specifikátor constexpr

Ne

Ano

Ano

Deklarace static_assert

Ano

Ano

Ano

Alias typu pomocí using

Ne

Ano

Ano

Příkaz for pro kontejnery

Ne

Ano

Ano

Reference na r-hodnotu

Ano

Ano

Ano

Stěhovací operátor =

Ano

Ano

Ano

Stěhovací konstruktor

Ano

?

?

Nový tvar hlavičky funkce

Ano

Ano

Ano

Lambda-výrazy

Ne

Ano

Ano

Alias pro jmenný prostor

Ano

Ano

Ano

Uživatelské literály

Ne

Ano

Ano

Atributy

Ne

Ano

Ano

Variadické šablony

Ne

Ano

Ano

Šablony aliasů

Ne

Ano

Ano

Jmenný prostor inline

Ne

Ano

Ano

Jednotná inicializace

Ano

Ano

Ano

 

Stěhovací konstruktor (move constructor)

Stěhovací konstruktor objektového typu T je  nástrojem pro optimalizaci, přesněji pro eliminaci některých zbytečných kopírování dat při inicializaci objektu na základě r-hodnoty představující instanci typu T. Jeho parametrem je reference na r-hodnotu a může měnit (vystěhovat, vytunelovat) svůj parametr. K testování jsem použil jednoduchou třídu

 

class test
{
private:
     int i;
public:
     test(int i);
     test(test &t);
     test(test &&t);
     test operator+(test& a);
     test& operator=(test& t);
     test& operator=(test&& t); // Stěhovací konstruktor
};

 

Napíšeme-li

 

test t3(t1+t2);

 

zavolá překladač BCC32 stěhovací konstruktor, zatímco zbývající dva překladače nikoli. Poznamenejme, že standard stanoví, že překladač může volání konstruktoru při optimalizaci odstranit, ovšem za předpokladu, že se nezmění pozorovatelné chování programu, tedy že zůstanou např. vedlejší efekty – ale ty zde v případě překladačů založených na Clang zmizí.

Šablony

C++11 přineslo dvě velké novinky pro práci se šablonami – variadické šablony (šablony s proměnným počtem parametrů) a šablony aliasů.  Podívejme se na příklad šablony aliasu:

 

template;

 

Tato šablona nám umožní použít typ slovník T na místě, kde bychom jinak museli napsat map string, T .

Jednoduchým příkladem variadické šablony může být deklarace n-tice – třídy   – v hlavičkovém souboru   ,

 

template  class... Types   class tuple;

 

Jiným příkladem může být deklarace šablony pro výpočet největší ze zadaných hodnot různých typů, které lze navzájem porovnávat pomocí operátoru   ,

 

template  typename T1, typename ... Typy 

decltype(auto) Max(T1 n, Typy...arg);

 

Překladač BCC32 ani jednu z těchto novinek neimplementuje, u zbývajících dvou překladačů jsem nenarazil na problémy.

Jmenný prostor inline

V deklaraci vnořeného jmenného prostoru lze uvést modifikátor inline. Takovýto jmenný prostor se zpřístupní automaticky při zpřístupnění jmenného prostoru, který ho obklopuje, takže je třeba ho explicitně uvádět pouze v případě, že hrozí nejednoznačnost. (Standardní knihovna tuto možnost na několika místech využívá.) Tento nástroj implementují oba překladače založené na Clang.

Jednotná inicializace

V C++11 můžeme deklaraci jednoduché proměnné s inicializací proměnné zapsat nově také ve tvaru

 

int a{5};

 

a deklaraci pole s inicializací můžeme vynechat znak = mezi deklarátorem a inicializátorem, který byl ve starších verzích jazyka  povinný, takže lze napsat např.

 

int A[]{1,2,3};

 

Tuto možnost poskytují všechny tří překladače.

 

Podpora vybraných novinek standardní knihovny C++11

Z novinek standardní knihovny C++11 se zmíním o třech, které pokládám za nejdůležitější. V následující tabulce je v závorce vždy uveden hlavičkový soubor nebo soubory, ve kterých jsou uvedené nástroje k dispozici.

 

Nástroje

BCC32

BCC32C

BCC64

Práce s časem ( chrono )

Ne

Ano

Ano

konverze kódování Unicode ( codecvt )

Ne

Ano

Ano

pokročilé generování pseudonáhodných čísel ( random )

Ano

Ano

Ano

Počítání se zlomky v době překladu ( ratio )

Ne

Ano

Ano

Regulární výrazy

Ne

Ano

Ano

n-tice ( tuple )

Ne

Ano

Ano

Hešové tabulky  unodreded_set ,  unordered_map 

Ano

Ano

Ano

Jednotná inicializace

Ne

Ano

Ano

 

Hešové tabulky

Standard jazyka C++ neobsahoval až do roku 2011 jeden z velmi užitečných kontejnerů – hešovou tabulku, a proto nabízely různé knihovny vlastní implementace. Standard z roku 2011 přinesl 4 různé implementace hešových tabulek; aby se však vyhnul konfliktům se jmény podobných kontejnerů ve starších knihovnách, označil je nikoli jako hešové, ale jako „neuspořádané“, takže nyní máme v C++ kontejnery nazvané unordered_set  , unordered_multiset  , unordered_map  unordered_multimap  . Používáme je podobně jako jejich „uspořádané“ protějšky. Najdeme je v knihovnách všech tří překladačů.

Generátory pseudonáhodných čísel

Jinou novinkou C++11 je sada nástrojů pro generování pseudonáhodných čísel, které oceníme nejen při vědeckých a technických výpočtech, ale i v jiných aplikacích, a které poskytují podstatně kvalitnější výsledky než funkce rand() zděděná z knihovny jazyka C. Nabízí jednak „stroje“ (engine), tedy šablony, z nichž lze dosazením vhodných konstant získat lineární kongruenční generátor, zpožděný Fibonacciův generátor a generátor Mersenne-Twister, jednak předdefinované instance těchto šablon. Vedle toho tu najdeme nástroje pro generování pseudonáhodných čísel s cca 20 nejběžnějšími rozděleními pravděpodobnosti.

Také tyto nástroje najdeme v knihovnách všech tří překladačů.

Regulární výrazy

Jeden z aforismů říká, že programátor má jen dvě jistoty – práci se znakovými řetězci a smrt. Toužebně očekávanou novinkou C++11 proto byla knihovna nástrojů pro práci s regulárními výrazy. Jazyk C++ podporuje regulární výrazy podle standardu POSIX, rozšířenou syntaxi POSIX, regulární výrazy jazyka ECMAScript, regulární výrazy jazyka awk, regulární výrazy nástroje grep a rozšířené regulární výrazy nástroje grep. Najdeme je pouze v knihovnách překladačů založených na Clang.

Jednotná inicializace

V C++11 můžeme kontejnery ze standardní knihovny inicializovat podobně jako pole. To znamená, že můžeme napsat např.

 

vector  int  v{1,2,3};

 

(mezi identifikátorem a inicializátorem může být navíc znak  =). Podobně můžeme inicializovat i své vlastní datové struktury; nástrojem k implementaci jednotné inicializace je šablonová třída initializer_list deklarovaná ve stejnojmenném hlavičkovém souboru. Tento nástroj najdeme v obou překladačích založených na Clang, BCC32 ho nenabízí.

 

Podpora vybraných novinek jazyka C++14

Standard C++14 přinesl několik zajímavých novinek v jazyce, které by měly programátorům – a zejména tvůrcům knihoven – usnadnit život.

 

Vlastnost

BCC32

BCC32C

BCC64

Odvození typu funkce

Ne

Ano

Ano

decltype(auto)

Ne

Ano

Ne

Šablony proměnných

Ne

Ano

Ne

Binární literály

Ne

Ano

Ano

Oddělovače tisíců

Ne

Ano

Ne

generické lambda-výrazy

Ne

Ano

Ne

inicializace v záchytu lambda-výrazů

Ne

Ano

Ne

Atribut [[deprecated]]

Ne

Ano

Ne

 

Typ funkce

C++11 nám programátorům dalo možnost deklarovat typ hodnoty vracené funkcí až za seznamem parametrů, tedy napsat např.

 

auto sqr(int n) -> int {
   return n*n;
}

 

Tento tvar deklarace se hodí u některých šablonových konstrukcí. C++14 nám umožnilo typ funkce v deklaraci vynechat, jestliže ho překladač dokáže odvodit z typu výrazu uvedeného v příkazu return. Předchozí deklaraci tedy můžeme napsat ve tvaru

 

auto sqr(int n) {
   return n*n;
}

Tuto možnost podporují pouze překladače naložené na Clang.

Vedle toho můžeme jako typ funkce zapsat specifikaci decltype(auto), jež přikazuje „vezmi výraz uvedený v příkazu return, předej ho operátoru decltype a takto zjištěný typ použij jako typ funkce“.

Tuto možnost podporuje pouze překladač BCC32C.

Šablony a lambda-výrazy

C++14 přineslo dvě hlavní novinky týkající se šablon, a to šablony proměnných a generické lambda-výrazy.

Učebnicovým příkladem šablony proměnné je deklarace

 

template  typename T  
constexpr T pi = T(3.141592653589793238462643383);

 

Hodnotu Ludolfova čísla typu double pak získáme zápisem pi.

Generické lambda-výrazy jsou šablony lambda-výrazů. Lambda-výraz je generický, jestliže jako typ alespoň jednoho z parametrů použijeme specifikátor auto. Příkladem může být deklarace

 

auto fce = [](auto x) {return x * x; };

 

Každému specifikátoru auto v seznamu parametrů odpovídá jeden typový parametr šablony.

V záchytu (capture) lambda-výrazu lze také specifikovat inicializaci, např.

 

auto fff = [i = 4](int x){ return x * i; };

 

Všechny tyto možnosti najdeme pouze v BCC32C.

Celočíselné literály

V zápisu číselného literálu lze počínaje C++14 používat znak ‘ (apostrof) v roli oddělovače skupin (nemusí jít o trojice číslic). Překladač tyto znaky prostě ignoruje. Tuto možnost nabízí pouze BCC32C.

Vedle toho můžeme celočíselné literály zapisovat ve dvojkové soustavě; deklarace konstanty s hodnotou 10 může mít tvar

 

int i = 0b1010;

 

Tuto možnost podporují oba překladače založené na Clang.

Atribut [[deprecated]]

Součástí C++14 je i standardní atribut [[deprecated]] používaný k označení nedoporučovaných (zavržených) konstrukcí. Tento atribut zná pouze BCC32C; BCC64 ho nezná, ale ignoruje ho (neohlásí při jeho použití chybu).

 

Podpora vybraných novinek standardní knihovny C++14

Z novinek standardní knihovny C++14 jsem vybral následující.

 

Nástroje

BCC32

BCC32C

BCC64

Standardní „uživatelské“ literály

Ne

Ano

Ne

Přístup ke složkám n-tice zadáním typu

Ne

Ano

Ano

 

Standardní uživatelské literály

Součástí standardní knihovny C++14 jsou i „standardní uživatelské literály“, tedy operátorové funkce umožňující programátorovi definovat  literály typu string, literály představující komplexní čísla a literály pro časové jednotky. Jsou definovány ve jmenných prostorech std::literals::string_literals, std::literals::chrono_literals a std::literals::complex_literals, které jsou deklarovány s modifikátorem inline, takže je není třeba uvádět, pokud nehrozí nedorozumění.

To znamená, že např. "ahoj"s je literál typu string, 1s je literál představující 1 sekundu a 1 + 2i je literál představující uvedené komplexní číslo. Tyto literály jsou k dispozici pouze v knihovně BCC32C.

Přístup ke složkám n-tice zadáním typu

Jinou z novinek je zpřístupnění složky n-tice (instance šablonové třídy tuple) pomocí typu, je-li jeho použití jednoznačné (v C++11 byly složky n-tic přístupné pouze pomocí pořadových čísel). To znamená, že máme-li instanci deklarovanou příkazem

 

tuple  string, string, int   t("ahoj", "nazdar", 7); 

 

můžeme její třetí složku získat nejen zápisem

 

int j = get 2 (t);

 

jako v C++11, ale i zápisem

 

int i = get int ,(t); 

 

Poznamenejme, že příkaz

 

string s = get string ,(t);  // Nelze

 

způsobí chybu, neboť určení složky na základě typu není jednoznačné.

Tuto možnost najdeme v obou překladačích založených na Cang.

 

Podpora vybraných novinek jazyka C++17

Standard C++17 přinesl opět řadu novinek – člověk se až diví, co všechno lze do jednoho programovacího jazyka přidat. Vedle toho odstranil některé zastaralé nástroje: zmizelo klíčové slovo register (nyní je vyhrazeno, není ale použito), zmizely trigrafy (tříznakové náhrady znaků, které chybí na některých národních klávesnicích) a zmizely  některé zavržené knihovní konstrukce (např. třída auto_ptr). Významnější novinky shrnuje následující tabulka.

 

Vlastnost

Bcc32

Bcc32c

Bcc64

Odstranění modifikátoru register

Ne

Ano

Ne

Úprava static_assert

Ne

Ano

Ne

Zkrácená deklarace vnořeného jmenného prostoru

Ne

Ano

Ne

Nové standardní atributy

Ne

Ano

Ne

Literály v UTF-8

Ne

Ano

Ne

Šestnáctkové reálné literály

Ne

Ano

Ne

Odvození parametru šablony konstruktoru

Ne

Ano

Ne

Redukce balíku parametrů variadické šablony

Ne

Ano

Ne

if constexpr

Ne

Ano

Ne

Inicializace v podmínce příkazu if

Ano

Ano

Ano

Inicializace ve výrazu příkazu switch

Ano

Ano

Ano

Proměnné inline

Ne

Ano

Ne

Operátor preprocesoru __has_include

Ne

Ano

Ano

Deklarace vazby na strukturu

Ne

Ano

Ne

 

Šablony

Velkou novinkou C++17 je tzv. redukce balíku parametrů šablony (fold expression), jež umožňuje redukovat balík netypových parametrů variadické šablony pomocí zadaného binárního operátoru. Bez podrobnějšího výkladu si ukážeme příklad. Šablonu funkce, jež dostane libovolný počet parametrů libovolných typů, na které lze použít operátor +, a vrátí jejich součet, můžeme v C++17 napsat takto:

 

template  typename... T 
auto součet_parametrů(T... s)
{
     return (... + s); // Zde je použita redukce
}

 

Redukci balíku parametrů podporuje pouze BCC32C.

Vedle toho můžeme v C++17 vynechat parametry šablony objektového typu při volání konstruktoru, jestliže si je dokáže překladač odvodit. To znamená, že můžeme napsat např.

 

std::pair p(1, 6.2);

 

a překladač pochopí, že má zavolat konstruktor třídy std::pair int, double . Také toto vylepšení je k dispozici pouze v BCC32C.

Operátor preprocesoru __has_include

Tento operátor umožňuje testovat, zda je k dispozici požadovaný hlavičkový soubor; používá se v podmínce direktivy #if. Poskytují ho oba překladače založené na Clang.

Deklarace vazby na strukturu

C++17 umožňuje deklarovat vazbu na strukturu (structure binding declaration). Podívejme se na příklad. Platí-li deklarace,

 

std::pair int, double  p{4, 4.1};

 

můžeme napsat

 

const auto& [a, b] = p;

 

Tím jsme deklarovali dvě jména, a a b, a navázali jsme je na složky struktury použité jako inicializátor. Poznamenejme, že na pravé straně může být pole nebo instance objektového typu (nikoli unie); často se vazba na strukturu používá ve spojitosti s n-ticemi (tuple).

Vazbu na strukturu podporuje pouze BCC32C. Ovšem při překladu složitějšího příkladu převzatého z portálu cppreference.com ohlásil tento překladač interní chybu.

 

Podpora vybraných novinek standardní knihovny C++17

Standardní knihovna C++17 přinesla řadu novinek, z nichž některé programátorům opravdu chyběly.

 

Nástroje

Bcc32

Bcc32c

Bcc64

basic_string_wiew  

Ne

Ano

Ano

Sdílené mutexy

Ne

Ano

Ano

Paralelizované algoritmy

Ne

Ano

Ne

Práce se souborovým systémem

Ne

Ano

Ano

Speciální matematické funkce

Ne

Ano

Ano

Typ byte

Ne

Ano

Ano

Typ optional  

Ne

Ano

Ne

Typ variant  

Ne

Ano

Ne

Typ any

Ne

Ano

Ne

Funkce uncaught_exceptions()

Ne

Ano

Ne

Nové metody tříd map   a unordered_map  

Ne

Ano

Ne

Jednotný přístup ke kontejnerům

Ne

Ano

Ne

Logické „operátory“ pro práci s parametry šablon

Ne

Ano

Ne

Pohled na řetězec

Šablona basic_string_wiew   a její specializace, třídy string_wiew, wstring_wiew a další, představují nástroje pro práci s vybraným úsekem znakového řetězce. Najdeme je v překladačích založených na Clang.

Nástroje pro paralelní počítání

Ve standardní knihovně C++17 najdeme dvě větší novinky pro paralelní výpočty – sdílené mutexy a paralelizované algoritmy (funkce z hlavičkového souboru  algorithm ).

Sdílený mutex (shared mutex) je mutex, který lze získat dvěma způsoby – jako sdílený nebo jako výlučný. Jestliže některý podporces (vlákno) získá takovýto mutex jako sdílený, může ho ve stejném režimu získat i jiný podproces, nemůže ho ale získat jako výlučný. Získá-li ho některý proproces jako výlučný, nemůže ho získat žádný jiný podporoces, dokud ho první podproces neuvolní.

Sdílený mutex se hodí např. v situaci, kdy do sdíleného úložiště jeden podproces zapisuje a ostatní z něj čtou.

Poznamenejme, že časově omezený sdílený mutex, třída

shared_timed_mutex, byla už v C++14.

Sdílené mutexy jsou v obou překladačích založených na Clang.

Většina „algoritmů“, tedy funkcí deklarovaných v hlavičkovém souboru  algorithm  , má počínaje C++17 paralelizovanou verzi. To je přetížení zmíněné funkce, které má navíc parametr určující strategii paralelního zpracování; tento parametr je typu ExecutionPolicy&&.

Paralelizované verze algoritmů najdeme pouze v BCC32C.

 

Práce se souborovým systémem

Knihovna pro práci se souborovým systémem obsahuje nástroje pro reprezentaci cesty (třída path), položky adresáře (třída directory_entry), iterátory pro procházení adresáře (třída directory_iterator) a další. Vedle toho obsahuje funkce pro zjišťování, zda soubor existuje, jaká jsou pro přístup k němu potřeba oprávnění atd.; najdeme tu i funkce pro kopírování, přejmenování nebo smazání souboru, pro vytvoření odkazu na soubor (zástupce, link) a řadu klasifikačních funkcí.

Tato knihovna je k dispozici v obou překladačích založených na front-endu Clang.

 

Speciální matematické funkce

Knihovna speciálních matematických funkcí byla už součástí návrhu standardu C++11, v publikované verzi tohoto standardu však nebyla. Místo toho byla vydána jako samostatný standard ISO/IEC 29124:2010 popisující nepovinnou část knihovny jazyka C++. Počínaje C++17 však je závaznou součástí standardní knihovny.

V této knihovně najdeme tzv. Besselovy funkce, eliptické integrály, beta-funkci, Hermiteovy, Legendreovy a Laguerreovy polynomy a další funkce potřebné v některých vědeckých a technických výpočtech.

Také tato knihovna je k dispozici v obou překladačích založených na front-endu Clang.

Nové datové typy

Typ std::byte je datový typ, který prostě představuje jeden bajt. Slouží k nízkoúrovňovému přístupu do paměti; nejedná se o znakový typ a nejedná se o aritmetický typ.

Typ optional T  může, ale nemusí obsahovat hodnotu typu T. V programování se začíná používat především pro návratovou hodnotu u funkcí, které v případě neúspěchu vracely nullptr nebo NULL, ale i v jiných situacích. Nutí programátora zkontrolovat vrácenou hodnotu.

Typ variant   představuje zabezpečenou unii se složkami typů určených parametry šablony a typ any představuje typově bezpečný kontejner obsahující hodnotu libovolného typu.

Tyto typy najdeme v knihovně BCC32C. Knihovna BCC64 sice obsahuje  hlavičkový soubor  optional  , avšak překladač při jeho zpracování mi ohlásil interní chybu.

Zatím nezachycené výjimky

C++11 a následující verze jazyka obsahují funkci uncaught_exception(), jež umožňuje zjistit, zda je program ve stavu po vyvolání výjimky, ale před jejím obsloužením. (To může být užitečné v destruktoru nebo ve funkci volané z destruktoru.) Tato funkce je však v C++17 zavržena (deprecated) a v C++20 by měla být odstraněna. Počínaje C++17 je k dispozici náhrada, funkce uncaught_exceptions(), jež místo logické hodnoty vrátí celé číslo představující počet aktuálně neobsloužených výjimek. Najdeme ji pouze v BCC32C.

 

Závěrem

Implementace C++17 ve dvaatřicetibitovém překladači pro Windows, BCC32C, úspěšně prošla téměř všemi testy, kterým jsem ji podrobil. Na druhé straně původní dvaatřicetibitový překladač BCC32 implementuje s omezeními C++11. Čtyřiašedesátibitový překladač BCC64 implementuje s C++11 a několik nástrojů z C++14.

 

 



Úvodní foto: Fotolia










Související články




Komentáře