Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
Skorzystaniezzapisuusingnamespacepozwalapominąćkwalifikację
zużyciemprzestrzeninazw.Wciążjednakpotrzebujeszkwalifikatorawna-
zwieFunc::Jabberwock,ponieważniejestonaczęściąprzestrzeninazwCreature.
Używanieprzestrzeninazwjestwykorzystaniemidiomatycznychcech-
zykaC++irealizowaniemzasadydarmowejabstrakcji.Podobniejakinne
identyfikatorytegotypu,równieżsłowonamespacejestusuwaneprzezkom-
pilatorpodczasgenerowaniawynikowegokoduasemblera.Przydajesięono
zwłaszczawdużychprojektach,ponieważpozwalaumieszczaćkodwróżnych
bibliotekach.
ŁączenieplikówobiektowychjęzykówCiC
++
ZzachowaniempewnejostrożnościkodyjęzykówCiC++mogąpokojowo
współistnieć.Czasamikoniecznejest,abykompilatorCpołączyłplikiobiek-
towewygenerowaneprzezkompilatorC++(iodwrotnie).Takaoperacjajest
możliwa,alewymagatrochęwysiłku.
Złączeniemplikówzwiązanedwaproblemy.Popierwsze,konwencje
wywoływaniawkodachjęzykówCiC++mogąbyćpotencjalnieniezgodne
zesobą.Naprzykładmogłybyistniećodmienneprotokołyustawianiastosu
irejestrówpodczaswywoływaniafunkcji.Teróżnicewkonwencjachwywo-
ływaniawystępująnapoziomiejęzykainieogólniezwiązaneztym,wjaki
sposóbtworzyszswojefunkcje.Podrugie,kompilatoryC++generująinne
symboleniżkompilatoryC.Czasamikonsolidatormusizidentyfikowaćobiekt
ponazwie.KompilatoryC++umożliwiajądekorowanieobiektu,dołączając
doniegołańcuchzwanynazwądekorowaną.Kompilator,wykorzystującdeko-
rację,zapamiętujeopróczsamejnazwyfunkcjirównieżinnezwiązaneznią
informacje.Mogąonedotyczyćprzeciążaniafunkcji,konwencjiwywoływania
czyteżużyciaokreślonejprzestrzeninazw.Dekorowaniemanaceluzapewnie-
nie,żekonsolidatorbędziemógłjednoznaczniezidentyfikowaćdanąfunkcję.
Niestety,niezostałstworzonyżadenstandarddefiniującysposóbwystępowa-
niadekoracjiwjęzykuC++(dlategopodczasłączeniajednostekkompilacji
powinieneśużywaćtychsamychnarzędziiustawień).Konsolidatoryjęzyka
CniemająpojęciaosposobiedekorowanianazwC++,comożespowodo-
waćproblemy,jeślidekoracjaniezostanieodpowiedniozmienionazakażdym
razem,gdybędzieszdołączaćkodCdokodujęzykaC++(iodwrotnie).
Rozwiązanieproblemujestproste.Jeślibędzieszchciałdołączyćkod
językaC,powinieneśzawrzećgowinstrukcjiextern"C",jakpokazanonali-
stingu13.
//header.h
#ifdef––cplusplus
extern"C"{
#endif
voidextract–arkenstone();
structMistyMountains{
intgoblin–count;
};
xlviWstępdlaprogramistówC