Hlavní navigace

Podpora nového standardu C++ v překladačích

22. 9. 2011 9:26 (aktualizováno) zboj

Tentokrát jen krátce. Nedávno byl schválen nový standard C++11 (dříve provizorně označovaný C++0×), který kromě rozšíření syntaxe přidává užitečné třídy do standardní knihovny STL. Bohužel ne ve všech překladačích můžete využít vše, co nový standard nabízí.

Clang (frontend pro LLVM) ve své nejnovější verzi nemá lambda výrazy. Místo nich má „bloky“ (proprietární uzávěry), které se ovšem kromě syntaxe drobně liší od normy i sémantikou. Nevýhodou je, že tyto uzávěry nejsou typu std::function<…>, takže zatímco v GCC nebo Visual Studiu klidně napíšete např. std::thread t([](){ /* kód vlákna */ }), uzávěr takto přímo použít nelze. Řešení je jednoduché, můžete si napsat třídu, do které uzávěr zabalíte a přetížíte operátor (), takže nakonec dostanete objekt typu std::function<…>. Přesto se ale jedná o zbytečnou komplikaci.

Naopak Visual Studio (ani ve verzi 2011, tedy preview pro WinRT) nepodporuje rychlou enumeraci ve for cyklu. Tedy vlastně podporuje, jen ne podle standardu. V GCC nebo clangu můžete použít for (auto& element : vector), Visual Studio podporuje jedině for each (auto& element in vector) (což Microsoft zavedl už dříve v C++/CLI pro enumeraci kolekcí v .NET).

Píšete-li kód, který má fungovat ve více překladačích, lze oba uvedené problémy řešit jednoduše makry, jen to trochu znepřehlední kód. Podpora nových věcí v STL je naopak velmi dobrá (byť ne kompletní) jak v clangu, tak ve Visual Studiu.

NB: Úsměvná poznámka na okraj, na for each a obecně na všechna klíčová slova obsahující mezeru má Microsoft patent :-)

Sdílet