Jezyk C++, C++
[ Pobierz całość w formacie PDF ]
J¦zykC++,studiaj¦zykowe
MichałWilde
1Strukturaprogramu
Poni»szyprzykładpokazujenajprostszyprogramwj¦zykuC.Efektemdziałaniaprogra-
mub¦dzienapis”Witaj±wiecie!”wysłanydostandardowegourz¡dzeniawyj±ciowego.
//programdrukuj¡cynapis"Witaj±wiecie!"
#include<stdio.h>
intmain(intargc,char**argv)
{
printf("Witaj±wiecie!\n");
return0;
}
Pierwszaliniaprogramutokomentarz.Dwauko±nikioznaczaj¡,»etekstnast¦puj¡cy
ponicha»doko«caliniijestignorowany.Je±lijestpotrzebnykomentarzw±rodkulinii
tomo»nagozacz¡¢uko±nikiemzgwiazdk¡(
/*
)izako«czy¢gwiazdk¡zuko±nikiem(
*/
).
Wtrzeciejlinii(uwzgl¦dniaj¡cliniepuste)mamydyrektyw¦kompilatora,którana-
kazujekompilatorowiwczytaniestandardowegoplikunagłówkowegozestandardowymi
operacjiwej±cia/wyj±cia.Plikinagłówkowes¡plikamitekstowymi.Bardzowieletakich
plikówjestdostarczanychzkompilatorem.Oprócztegou»ytkownikmo»etworzy¢wła-
sneplikinagłówkowe.Plikinagłówkowes¡potrzebnekompilatorowiabywiedziałjakie
funkcjes¡dost¦pneijakiemaj¡parametry.Senspisaniawłasnychplikównagłówkowych
jestdopierowtedygdynaszprogrampodzielimynamoduły.
Wła±ciwewykonanieprogramurozpoczynasi¦odwywołaniafunkcjimain.Ka»da
funkcjawj¦zykuCskładasi¦zdwóchcz¦±ci:nagłówkafunkcjiiciałafunkcji.Nagłó-
wekfunkcjiskładasi¦zdeklaracjitypuwyniku(tu:
int
czyliliczbacałkowita),nazwy
funkcji(tu:
main
)ilistyparametrówformalnych(tudwaparametry:
argc
typucałkowi-
tegoi
argv
,któryjesttablic¡wska¹nikównała«cuchy).Nagłówektejwyj¡tkowejfunkcji
mainjestnarzucony.Wyniktokodbł¦du.Je±lifunkcjamainzwróci0toznaczy,»epro-
gramwykonałsi¦poprawnie.Je±liwarto±¢wi¦ksz¡odzeratoznaczy,»enast¡piłbł¡d
otymwła±nienumerze.Pierwszyparametrfunkcji
main
,mówiileparametrówpodał
u»ytkownikponazwiefunkcji.Parametr
argc
jestrówny1je±liu»ytkownikniepodał
»adnegoparametru,2,je±lipodałjedenparametritp.Parametrargcjestwi¦kszyo1
odliczbyparametrówprogramugdy»przystarcieautomatyczniejestdodawanapełna
nazwauruchamianegoprogramu(
argv[0]
).Drugiparametr(
argv
)jesttablic¡wska¹ni-
kówwskazuj¡cychnakolejneparametryprogramu.Zerowyelementtejtablicy(
argv[0]
)
wskazujenapełn¡nazw¦programu,pierwszyelement(
argv[1]
)pokazujenapierwszy
parametrprogramuitd.
Pierwsz¡instrukcj¡funkcjimainjestwywołaniefunkcji
printf
.Tafunkcjasłu»ydo
wysyłaniasformatowanychwydrukówdostandardowegourz¡dzeniawyj±ciowego.Format
wydrukuokre±lapierwszyparametrfunkcjiprintf.Jesttoła«cuch.Jegoznakis¡wysyłane
dostandardowegourz¡dzeniawyj±ciowegoa»donapotkaniaznaku
%
.Znak
%
oznacza,
1
»ewtymmiejscunale»ypodstawi¢parametrwyst¦puj¡cyzaformatem(drugiparametr
funkcji
printf
).Napotkaniedrugieznaku
%
oznacza,»ewtymmiejscunale»ypodstawi¢
drugiparametrpoformacie(trzeciparametrfunkcji
printf
).Poznaku
%
musinast¡pi¢
dodatkoweokre±lenietypuparametru(np.
s
–ła«cuchznaków,
d
–liczbacałkowita,
u
–liczbacałkowitabezznaku,
x
–liczbacałkowitazapisanaszesnastkowo,
f
–liczba
zmiennoprzecinkowa,
c
–znakitp.).Wnaszymprogramie,wformacieniewyst¦puj¡
znaki
%
dlategopoformacieniema»adnychparametrów.
Drug¡instrukcj¡funkcjimainjestwykonaniepowrotuizadeklarowaniakodubł¦du
zwracanegoprzezt¡funkcj¦(tu0,czyliprogramwykonałsi¦poprawnie).
Wj¦zykuCposzczególneinstrukcjeko«czymyznakiem
;
(±rednik).
Zadanie1.Cowydrukujeponi»szyprogram?
#include<stdio.h>
intmain(intargc,char**argv)
{
printf("Witaj/*±wiecie*/!\n");
return0;
}
2Kompilacjaikonsolidacja
Abymo»nabyłoskompilowa¢program,nale»ynajpierwgonapisa¢przyu»yciudowol-
negoedytoratekstowegoizapisa¢wplikunp.podnazw¡
hello.cpp
.Dokompilacji
ikonsolidacjiprogramuzostanieu»ytydarmowykompilatorfirmyBorlandwwersji5.5,
którymo»napobra¢zserwerafirmyInprise(dawniejBorland)podadresem:
ftp://ftpd.inprise.com/download/bcppbuilder/freecommandLinetools.exe.
Natymsamymserwerzeznajdujesi¦równie»darmowydebuggerpracuj¡cywtrybie
tekstowym:
ftp://ftpd.inprise.com/download/bcppbuilder/TurboDebugger.exe.
Kompilacj¦ikonsolidacj¦mo»nawykona¢wjednymwywołaniuprogramu
bcc32
.
Poniewa»±cie»kado
bcc32
(domy±lnie
c:\borland\bcc55\bin
)musiby¢zadeklarowana
w
PATH
,dlategowystarczynapisa¢:
bcc32-tWC-Lc:\borland\bcc55\lib-Ic:\borland\bcc55\includehello.cpp
Opcja
-tWC
informujekompilator,»ejesttoaplikacjakonsolowa,opcja
-L
informuje
kompilatorgdzieznajduj¡si¦bibliotekipotrzebnedokonsolidacji,opcja
-I
informuje
kompilatorgdzieznajduj¡si¦plikinagłówkowe.
Tenprocesmo»nawykona¢wdwóchkrokach.Kompilacjewykonujemypoleceniem:
bcc32-c-tWC-Ic:\borland\bcc55\includehello.cpp
Parametr
-c
oznacza,»eby
bcc32
tylkoskompilowałpodanyprogram.Natomiast
konsolidacj¦wykonujemypoleceniem:
2
ilink32-c-Lc:\borland\bcc55\libc0x32.objhello.obj,hello.exe,
hello.map,cw32.libimport32.lib
Parametr
-c
oznaczacasesensive(wra»liwo±¢nawielko±¢liter),
c0x32.obj
jestko-
demstartowymdlaaplikacjikonsolowych,
hello.obj
jestplikiempo±rednimotrzyma-
nympokompilacji,
hello.exe
jestnazw¡plikuwynikowego,
hello.map
,nazw¡pliku
zsymbolami,a
cw32.lib
i
import32.lib
dwiemaobowi¡zkowymibibliotekamidlaapli-
kacjijednow¡tkowych.
Mo»nastworzy¢du»okrótsz¡aplikacj¦.Je±lizamiastbiblioteki
cw32.lib
u»yjemy
cw32i.lib
toprogramb¦dziewymagałobecno±cibibliotekidynamicznej
cc3250.dll
.Ta
bibliotekamusiby¢dost¦pnaw
PATH
(najlepiejj¡umie±ci¢wkatalogu
c:\windows\system
)
ilink32-c-Lc:\borland\bcc55\libc0x32.objhello.obj,hello.exe,
hello.map,cw32i.libimport32.lib
Gotow¡aplikacj¦uruchamianyprzeznapisanienazwy(tu:
hello.exe
albotylko
hello
)plikuwykonywalnego.
3Automatyzacjakompilacjiikonsolidacji
Proceskompilacjiikonsolidacjimo»nazautomatyzowa¢.Jesttoszczególniewa»neprzy
wi¦kszychprojektach.Dozautomatyzowaniaprocesukompilacjiikonsolidacjimo»na
wykorzysta¢standardowenarz¦dziewchodz¡cewskładpakietuFreeCommanLineTools,
czyli
make
.Najprostszyplikdlaprogramumakemo»emie¢posta¢:
hello.exe:hello.cpp
bcc32-tWC-Lc:\borland\bcc55\lib-Ic:\borland\bcc55\includehello.cpp
Wpierwszejliniaprogramistaokre±liłjakijestcelkompilacji(tu:
hello.exe
)apo
dwukropkuokre±liłjakieplikiwchodz¡wskładprojektu.Wdrugiejliniiprogramista
okre±liłconale»yzrobi¢abytencelosi¡gn¡¢.Reguła(pierwszalinia)musiby¢napisana
bezodst¦puzlewejstrony,akomendatejregułymysiby¢napisanazconajmniejjedn¡
spacj¡odst¦pu.
Je±lipiszemydu»ojednomodułowychprogramówtomo»napisa¢jedenuniwersalny
makefile.mak
(tojestdomy±lnanazwaprojektugdyuruchomimyprogram
make
bez
parametrów).Abyrozró»ni¢projektymo»naprzywywołaniuprogramu
make
definiowa¢
stał¡(np.onazwie
SRC
)owarto±cirównejnazwiekompilowanegoprogramu.Wpliku
makefile.mak
mo»naodwoływa¢si¦dostałychprzeznapisanie
$(xxx)
gdzie
xxx
jest
identyfikatoremstałej.
CC=c:\borland\bcc55\bin\bcc32
LIB=c:\borland\bcc55\lib
INC=c:\borland\bcc55\include
OPT=-5-tWC
$(SRC).exe:$(SRC).cpp
$(CC)$(OPT)-L$(LIB)-I$(INC)$(SRC).cpp
Opcjakompilatora
-5
oznacza,»eprogramwynikowyb¦dzieoptymalizowanydla
procesoraPentium(inieb¦dziedziałałnawcze±niejszychprocesorach).Podobnyplik
dlaprogramumakemo»nanapisa¢gdyzale»ynamnarozdzieleniuprocesukompilacji
iprocesukonsolidacji.Przykładowyplik
hello.mak
mo»ewygl¡da¢nast¦puj¡co.
3
CC=c:\borland\bcc55\bin\bcc32
LINK=c:\borland\bcc55\bin\ilink32
LIB=c:\borland\bcc55\lib
INC=c:\borland\bcc55\include
STDLIB=cw32.libimport32.lib
CCOPT=-5-v-tWC
LINKOPT=-v
.cpp.obj:
$(CC)-c$(CCOPT)-I$(INC)$<
hello.exe:hello.obj
$(LINK)-c$(LINKOPT)-L$(LIB)c0x32.objhello.obj,hello.exe,hello.map,$(STDLIB)
hello.obj:hello.cpp
Opcje
-v
dlakompilatoraidlakonsolidatoraoznaczaj¡,»epowstanieaplikacjazpełn¡
informacj¡dladebugera.Wtymprzykładziezastosowanodefinicj¦regułyogólnej,mó-
wi¡cejconale»yzrobi¢gdywprogramiezaistniejepotrzebaprzekształceniuplikuzroz-
szerzeniem
cpp
naplikzrozszerzeniem
obj
.Wkomendzierealizuj¡cejtoprzekształcenie
zostałou»ytemakro
$<
,którejestzast¦powaneprzezpełn¡nazw¦przekształcanegopli-
ku.Wostatniejliniimówi¡cejokonieczno±cizamiany
hello.cpp
na
hello.obj
niema
potrzebypisaniakomendyprzekształcaj¡cejgdy»jestonanapisanawregule
.cpp.obj
.
4Preprocesor
Preprocesordziałanazasadziewst¦pnejobróbkitekstubezwnikaniawzasadyj¦zykaC.
Dwiepodstawowedyrektywypreprocesorato:
Dyrektywa Opis
#include<nazwapliku>
inkluzjazkatalogukompilatora
#include"nazwapliku"
inkluzjazkataloguprojektu
#definesymbolci¡g
definicjabezparametrów
#definesymbol(parametry)ci¡g
definicjazparametrami
Rzadziejstosowanedyrektywyto:
4
Dyrektywa Opis
#undefsymbol
odwołaniedefinicji
#ifwyra»enie
instrukcje
#else
instrukcje
#endif
kompilacjawarunkowa
#ifdefsymbol
instrukcje
#else
instrukcje
#endif
kompilacjawarunkowa
#ifndefsymbol
instrukcje
#else
instrukcje
#endif
kompilacjawarunkowa
Widentycznysposóbdefiniujesi¦deklaracjekompilatora.Tedyrektywyniemaj¡
wpływunapreprocesor,s¡przekazywanedokompilatoraidopieroonnaniereaguje.
Dwiewa»niejszedyrektywykompilatorato:
Dyrektywa Opis
#errorkomunikat
przerwaniekompilacjizkomunikatembł¦du
#pragmaparametry
zmianaopcjikompilacji
4.1Inkluzje
Pierwszaposta¢inkluzji(
#include<...>
)poszukujewskazanegoplikuw±cie»cestan-
dardowej(podanejwparametrachkompilatora)adruga(
#include"..."
)poszukuje
wplikuzprojektem.Preprocesorwstawitre±¢wskazanegoplikuwmiejscuwyst¡pienia
inkluzji.
4.2Definicje
Definicjapoleganatym,»ewtrakcieczytaniaplikuzkodem¹ródłowymprogramu
wszystkiewyst¡pienia
symbolu
s¡zast¦powaneprzez
ci¡g
.Symbolzostanierozpozna-
nyizast¡pionyje±lib¦dzieodr¦bnymsłowem(aniecz¦±ci¡innegosłowa)orazniemo»e
by¢cz¦±ci¡ła«cucha.Wtrakciezast¦powaniasymboluci¡giempreprocesordodaspacje
(przedizaci¡giem).Niewszystkiesymbolemo»nazdefiniowa¢.Mi¦dzyinnymizastrze-
»onesymboleto:
DATE
,
TIME
,
FILE
,
LINE
.Dwapierwszesymbole
przechowuj¡dat¦iczaskompilacji,trzeciprzechowujenazw¦kompilowanegoprogramu,
czwartynumerwła±niekompilowanejlinii.Dzi¦kidwómostatnimsymbolommo»napre-
cyzyjniepoinformowa¢u»ytkownikawjakimmoduleiwktórejjegoliniinast¡piłbł¡d.
Zadanie2.Cowydrukujeponi»szyprogram?
#include<stdio.h>
#definea10
5
[ Pobierz całość w formacie PDF ]