Ccccc ...
Microsoftu je trebalo nekoliko godina da napravi port STLa (Standard
Template Library) da se može koristiti i
na .NET platformi i onda naprave ovako
traljavi release !!!
Za neupućene, kratka rekapitulacija. Dakle, STL http://en.wikipedia.org/wiki/Standard_Template_Library
je biblioteka za programski jezik C++ u kojoj se nalaze implementacije
mnooooogobrojnih izrazito korisnih struktura podataka (što bi rekli –
„kolekcija“ iliti containera –
vector, list, map, set, hash, queue, stack) i algoritama za operiranje nad njima.
Prije nešto više od destak godina, kad sam se prvi put
upoznao s STLom, to je bilo vauuuu :-))))). Dinamičke i strogo tipizirane strukture podataka, s ugrađenim efikasnim
algoritmima – što je više mogao poželjeti C/C++ programer !?
Klasični ArrayList iz .NET-a je u usporedbi s time bio čisti
smijeh ...
Nažalost (u stvari na
sreću ;-), .NET je imao „poneku“ :-) drugu prednost pred native C++om tako
da je danas broj developera na .NET razvojnom okruženju vjerojatno puno veći od
broja developera koji koriste C++. Treba priznati i da se situacija značajno popravila s uvođenjem genericsa
u C# 2.0 i ugrađivanjem tipiziranih kolekcija podataka pa je ArrayList (ne
koristite ga više, je'l da ;-) zamijenjen s List<T> i onda se dalo nekako
živjeti bez STL-a.
Stoga, kad sam vidio da je STL/NET konačno postao dio Visual
Studio 2008 okruženja, nisam mogao dočekati da ga malo okušam.
Pa sam lijepo kreirao novi Visual C++ projekt (tab CLR pa CLR
Console Application) i ukucao najtrivijalniji mogući primjer:
#include "stdafx.h"
#include <cliext/vector>
using namespace System;
int main(array<System::String
^> ^args)
{
cliext::vector<wchar_t> c1;
c1.push_back(L'a');
c1.push_back(L'b');
c1.push_back(L'c');
for each (wchar_t elem in c1)
System::Console::Write(" {0}", elem);
return 0;
}
Pravi C++ gurui će ovdje odmah graknuti da „kakav for each“,
da nema toga u STLu i gdje su const_iterator, begin i end ? OK, može i tako,
ali for each je idiom koji je u .NET svijetu bread-and-butter i ruku na srce, ima puno manje kucati :-)))) I
mislim da je sasvim zgodno da su implementatori STL/CLRa omogućili korištenje
tog idioma sa STL/NET kolekcijama. Uostalom, to je ionako syntactic sugar ...
Ostalo je manje više jasno. Treba uključiti header
cliext/vector da bi kompajler imao potrebne deklaracije (nešto ala „Add
reference“ za C# programere), push_back je „klasičan“ način za dodavanje
elementa na kraj kolekcije (Add za C#ovce) i tu bi sve trebalo biti jasno.
F7 i ...
1>C:\Program
Files\Microsoft Visual Studio 9.0\VC\include\cliext/xutility(9) : fatal error C1107: could not find assembly
'Microsoft.VisualC.STLCLR.dll': please specify the assembly search path
using /AI or by setting the LIBPATH environment variable
Neba ti nebeskog ... ???
Što je sad ?
Otvaranjem xutility headera (.h nastavak za headere standardnih
biblioteka je „izgubljen“ u zadnjoj inkarnaciji C++ standarda) i odlaskom na
liniju 9 se nađe „uzrok“ pogreške i tamo piše:
#using <Microsoft.VisualC.STLCLR.dll>
U redu, jer TO JE TOČNO NO ŠTO BI TREBALO PISATI !!!???
Dotični dll-u je library u kojem je duša STL/CLR i #using
direktiva je nužna kao pointer kompajleru. Taj dll se fizički nalazi u C:\Program
Files\Microsoft Visual Studio 9.0\VC\lib direktoriju, gdje se nalaze i
mnogobrojne druge biblioteke za Visual C++ kompajler, i referenciran je kroz
Libraries setting.
Dakle, kompajler bi ga
morao vidjeti !!!
A on kaže da ga nema ?
Pokušao sam nekoliko trikova (npr. staviti ga ručno u
referencirane biblioteke za projekt) ali nije mi baš išlo :-(. Ipak, na kraju
sam našao spasonosno rješenje.
U xutility headeru sam dotičnu liniju promijenio u:
#using "C:\Program Files\Microsoft Visual Studio
9.0\VC\lib\Microsoft.VisualC.STLCLR.dll"
I sve je proradilo kako treba ... Prijavio sam bug
Microsoftu, i sad se na miru mogu (možete) poigrati sa STL/CLRom ...