1 / 342

P rogramování v C++

P rogramování v C++. David Bednárek www.ksi.mff.cuni.cz/~bednarek. Pravidla studia. N PRG0 41 2/2 Z,Zk. Zápis na cvičení. Elektronický zápis do jednotlivých skupin is .cuni.cz/ studium Z ápis předmětů a rozvrhu - zápis Grupíček - výsledky Zapsáni musejí být všichni Do 16 .10.

cade
Download Presentation

P rogramování v C++

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programování v C++ David Bednárek www.ksi.mff.cuni.cz/~bednarek

  2. Pravidla studia NPRG041 2/2 Z,Zk

  3. Zápis na cvičení • Elektronický zápis do jednotlivých skupin • is.cuni.cz/studium • Zápis předmětů a rozvrhu - zápis • Grupíček - výsledky • Zapsáni musejí být všichni • Do 16.10. • Kapacita laboratoře je omezena, skupiny nelze přeplňovat • Repetenti oznámí, zda chtějí navštěvovat výuku • Udělit zápočet může jen cvičící,ke kterému je student zapsán • Kdo nebude do 16.10. zapsán, zápočet v tomto šk. roce nedostane

  4. Udělení zápočtu • Základní podmínky společné všem skupinám • Úspěšné složení zápočtového testu • 1. a 2. pokusy ve zkouškovém období ... 3. pokusy v dubnu • 2-3 hodiny v laboratoři, společně pro všechny skupiny • Vypracování zápočtového programu • Dohoda o tématu - do listopadu • Předvedení cvičícímu do 29.3.2013 • Doladění a odevzdání do 24.5.2013 • Další podmínky udělení zápočtu určuje cvičící • Cvičící může podmínky individuálně upravit, pokud se s ním student na začátku semestru dohodne • Přiměřená účast na cvičeních • Úspěšné odevzdání domácího úkolu

  5. Zkouška • Zkouška bude provedena formou abc-testu • Vlastnosti a pravidla jazyka C++ • Používání knihoven C++ (kontejnery, algoritmy, iostream) • Typické konstrukce objektového programování • Run-time/static polymorphism • Termíny • Ve zkouškovém období ZS • Během výuky v LS

  6. Pravidla pro budoucí neúspěšné • Zkouška • Pokud letos složíte zkoušku se známkou výborně nebo velmi dobřea nedostanete zápočet, bude vám příští rok uznána • Tento mechanismus je implementován zkoušejícími, nikoliv studijním oddělěním • Zápočet • Pokud nedostanete zápočet, budete příští rok opakovat ty části, které jste letos nesplnili • Podmínky splněné letos se automaticky uznávají • V příštím roce se musíte na začátku semestru přihlásit v SISu k některému z cvičících a dohodnout se s ním na konkrétních podmínkách

  7. Literatura

  8. Vývoj jazyka a normy • ISO/IEC JTC1/SC22/WG21:14882 - Programming languages - C++ (1998, 2003, 2011) • http://www.open-std.org/jtc1/sc22/wg21/ • 1998 - První norma C++ • Standardizace konstrukcí, které již některé překladače uměly • 2003 • Dodatky a opravy • 2005: C++ 2003 TR1 • Nové rozšíření knihoven (podporováno GCC 4.1 a MSVC 2008) • 2011: C++0x = C++11 • Podpora paralelismu, lambda, &&, auto a mnoho dalších • Některé překladače již některé novinky zvládají • Některé novinky dají překladačům zabrat

  9. Literatura • Pro začátečníky • Bruce Eckel:Thinking in C++ (2000)Myslíme v jazyku C++ (Grada 2000) • Miroslav Virius:Pasti a propasti jazyka C++ (Computer Press 2005)Programování v C++ (ČVUT 2001) • Andrew Koenig, Barbara E. Moo:Accelerated C++ (2000) • Stanley B. Lippman:Essential C++ (2000)

  10. Literatura • Pro středně pokročilé • Andrei Alexandrescu, Herb Sutter:C++ Coding Standards (2005) • Scott Meyers:Effective C++ (1998)More Effective C++ (1996)Effective STL (2001) • Herb Sutter:Exceptional C++ (2000)More Exceptional C++ (2002)Exceptional C++ Style (2004) • Nicolai M. Josuttis:Object-Oriented Programming in C++ (2002)The C++ Standard Library (1999)

  11. Literatura • Až si budete myslet, že všechno umíte • Andrei Alexandrescu:Modern C++ Design (2001)Moderní programování v C++ (Computer Press 2004) • David Vandevoorde, Nicolai M. Josuttis:C++ Templates (2003) • C++11 • Scott Meyers: Overview of the New C++ (C++11) • 360 slajdů z přednášek • Prozatím jediná "kniha" o C++11

  12. www http://www.open-std.org/jtc1/sc22/wg21/ • ISO http://www.gotw.ca/ • Herb Sutter: Guru of the Week http://www.boost.org/ • Knihovna Boost http://gcc.gnu.org/ • GCC

  13. Architektura Překladače / interpretry

  14. CPU C P U

  15. CPU rozumí pouze binárním kódu C P U 01010000 01110100 11010111 10010110 00100010 10110001

  16. 1940... – programování ve strojovém kódu C P U 01010000 01110100 11010111 10010110 00100010 10110001

  17. 1940... – programování ve strojovém kódu C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 01010000 01110100 11010111 10010110 00100010 10110001

  18. 1940... – programování ve strojovém kódu C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X 01010000 01110100 11010111 10010110 00100010 10110001

  19. 1950... – assembler C P U C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X 01010000 01110100 11010111 10010110 00100010 10110001 PRINT NOGEN BEGIN BEGIN REGS SR R2,R2 SR R3,R3 LOOP AR R2,R3 LA R3,1(R0,R3) C R3,=F'10' BNE LOOP CVD R2,DBL ED RESULT,DBL+6 WTO RESULT RETURN LTORG RESULT DC X'40202120' DBL DC D'0' END BEGIN assembler

  20. 1950... – operační systém C P U C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém loader PRINT NOGEN BEGIN BEGIN REGS SR R2,R2 SR R3,R3 LOOP AR R2,R3 LA R3,1(R0,R3) C R3,=F'10' BNE LOOP CVD R2,DBL ED RESULT,DBL+6 WTO RESULT RETURN LTORG RESULT DC X'40202120' DBL DC D'0' END BEGIN assembler

  21. 1950... – operační systém C P U C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém loader PRINT NOGEN BEGIN BEGIN REGS SR R2,R2 SR R3,R3 LOOP AR R2,R3 LA R3,1(R0,R3) C R3,=F'10' BNE LOOP CVD R2,DBL ED RESULT,DBL+6 WTO RESULT RETURN LTORG RESULT DC X'40202120' DBL DC D'0' END BEGIN myprog.exe assembler

  22. 1950... – překladač C P U C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 X X X X X X X X X XXXX X X X X X X X X X X X XX X X X X XX X X XX X X X XXX X X X X X XX XXXX X XXXX X XX X XXX X X X XX X X X X X X X X XX X X X X X X X X X X X X X X XX X X X X X X X X X X X X 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém loader READ INPUT TAPE 5, 501, IA, IB, IC 501 FORMAT (3I5) IF (IA) 777, 777, 701 701 IF (IB) 777, 777, 702 702 IF (IC) 777, 777, 703 703 IF (IA+IB-IC) 777,777,704 704 IF (IA+IC-IB) 777,777,705 705 IF (IB+IC-IA) 777,777,799 777 STOP 1 799 S = FLOATF (IA + IB + IC) / 2.0 AREA = SQRT( S * (S - FLOATF(IA)) * (S - FLOATF(IB)) * + (S - FLOATF(IC))) WRITE OUTPUT TAPE 6, 601, IA, IB, IC , AREA STOP END myprog.exe překladač Fortran

  23. 1970... – překladač C C P U C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 Hello,world! 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém loader #include <stdio.h> int main(int,char**) { printf( "Hello, world!\n"); } myprog.exe překladač C

  24. 1980... – překladač C++ C P U C P U 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 Hello,world! 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém loader #include <iostream> int main(int,char**) { std::cout << "Hello, world!\n"; } myprog.exe překladač C++

  25. 1960... – interpret(er) C P U 10 INPUT "What is your name: ", U$ 20 PRINT "Hello "; U$ 30 INPUT "How do you want: ", N 40 S$ = "" 50 FOR I = 1 TO N 60 S$ = S$ + "*" 70 NEXT I 80 PRINT S$ 90 INPUT "Do you want? ", A$ 100 IF LEN(A$) = 0 THEN 90 110 A$ = LEFT$(A$, 1) 120 IF A$ = "Y" THEN 30 130 PRINT "Goodbye ";U$ 140 END 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X interpret operačnísystém

  26. Interpretace s mezikódem C P U 10 INPUT "What is your name: ", U$ 20 PRINT "Hello "; U$ 30 INPUT "How do you want: ", N 40 S$ = "" 50 FOR I = 1 TO N 60 S$ = S$ + "*" 70 NEXT I 80 PRINT S$ 90 INPUT "Do you want? ", A$ 100 IF LEN(A$) = 0 THEN 90 110 A$ = LEFT$(A$, 1) 120 IF A$ = "Y" THEN 30 130 PRINT "Goodbye ";U$ 140 END 04FBC41E 77AB2000 1AE04E33 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 X X X X X X X X X XX X XX XX XX X XX X X X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXX X X X X X X X XX X X X XX X XXX X X X X X X X překladač interpret operačnísystém

  27. interpretovaný mezikód (bytecode) C P U C P U publicclass HelloWorld { publicstaticvoid main(String[] args) { System.out.println( "Hello, world!"); } } myprog.class překladač 04FBC41E 77AB2000 1AE04E33 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 Hello,world! interpret operačnísystém

  28. JIT překladač C P U C P U publicclass HelloWorld { publicstaticvoid main(String[] args) { System.out.println( "Hello, world!"); } } myprog.class překladač 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 Hello,world! JIT překladač 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém

  29. Srovnání JIT/non-JIT C P U C P U C P U C P U publicclass HelloWorld { publicstaticvoid main(String[] args) { System.out.println( "Hello, world!"); } } myprog.class překladač JIT překladač 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém 01010000 01110100 11010111 10010110 00100010 10110001 #include <iostream> int main(int,char**) { std::cout << "Hello, world!\n"; } operačnísystém loader myprog.exe překladač

  30. Srovnání JIT/non-JIT

  31. Dynamické spojování…? C P U C P U publicclass HelloWorld { publicstaticvoid main(String[] args) {mylib.doit(); } } myprog.class } } překladač mylib.class překladač JIT překladač 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém int main() { doit(); } 01010000 01110100 11010111 10010110 00100010 10110001 #include <iostream> int main() { std::cout << "Hello, world!\n"; } operačnísystém loader myprog.exe překladač mylib.dll překladač

  32. Dynamické spojování C P U C P U import acme.mylib; publicclass HelloWorld { publicstaticvoid main(String[] args) {mylib.doit(); } } myprog.class publicclass HelloWorld { publicstaticvoid main(String[] args) { System.out.println( "Hello, world!"); } } překladač mylib.class překladač JIT překladač 01010000 01110100 11010111 10010110 00100010 10110001 operačnísystém #include "mylib.hpp" int main() { doit(); } // mylib.hpp void doit(); 01010000 01110100 11010111 10010110 00100010 10110001 #include <iostream> int main() { std::cout << "Hello, world!\n"; } operačnísystém loader myprog.exe “překladač” mylib.dll “překladač”

  33. Překlad jednoduchého programu // iostream #include <fstream> namespace std { extern ofstream cout, cerr; }; // iostream #include <fstream> namespace std { extern ofstream cout, cerr; }; iostream.obj msvcrt.lib Kompilátor myprog.obj Linker myprog.exe // myprog.cpp #include <iostream> int main() { std::cout << "Hello, world!\n"; }

  34. Oddělený překlad a spojování modulů Standardní Standardní .obj Standardní .lib Uživatelské .hpp Uživatelské .cpp Kompilátor Přeložené .obj Linker Spustitelný soubor .exe

  35. Spojování modulů myprog.cpp #include "bee.hpp"intmain(int,argv**) { return B( 7);} myprog.obj 0000: 01010000 ???????? 11010111 exportmain(int,argv**) importB(int) Kompilátor bee.hpp #ifndef bee_hpp#define bee_hppint B( int q);#endif myprog.exe 0000: 01010000 00001100 110101111100: 10010110 00100010 10110001 Linker bee.cpp #include "bee.hpp"int B( int q) { return q+1; } bee.obj 0000: 10010110 00100010 10110001 exportB(int) Kompilátor

  36. Deklarace a definice • Deklarace • Zápis sdělující, že věc (typ/proměnná/funkce/...) existuje • Identifikátor • Základní vlastnosti věci • Umožňuje překladači přeložit kód, který na věc odkazuje • V některých případech je k tomu zapotřebí i definice • Definice • Zápis, který určuje všechny vlastnosti věci • Obsah třídy, inicializace proměnné, kód funkce • Umožňuje překladači vygenerovat kód a data, která věc reprezentují za běhu • Každá definice je i deklarace • Deklarace umožňují (některá) použití věci bez definice • Oddělený překlad modulů • Vyřešení cyklických závislostí • Zmenšení objemu překládaného zdrojového kódu

  37. Deklarace a definice • One-definition rule #1: • Jedna překladová jednotka... • (modul, tj. jedno .cpp včetně inkludovaných hpp) • ... smí obsahovat nejvýše jednu definici věci • One-definition rule #2: • Program... • (tj. .exe včetně připojených .dll) • ... smí obsahovat nejvýše jednu definici proměnné nebo non-inline funkce • Definice třídy, typu či inline funkce se v různých modulech opakovat smějí (typicky vložením téhož .hpp souboru) • Nejsou-li opakované definice totožné, nebo nesouhlasí-li definice s deklarací, program je nekorektní • Diagnostika na úrovni programu není normou požadována a překladače/linkery ji dělají jen v jednoduchých případech

  38. Deklarace a definice tříd a typů

  39. Deklarace a definice proměnných

  40. Deklarace a definice funkcí

  41. make Standardní Standardní .obj Standardní .lib Uživatelské .hpp Uživatelské .cpp Kompilátor Přeložené .obj Linker Spustitelný soubor .exe Make makefile

  42. Integrované prostředí Standardní Standardní .obj Standardní .lib Uživatelské .hpp Uživatelské .cpp Kompilátor Přeložené .obj Linker Spustitelný soubor .exe Editor Debugger projekt

  43. Statické knihovny Standardní Standardní .obj Standardní .lib Uživatelské .hpp Uživatelské .cpp Kompilátor Přeložené .obj Linker Spustitelný soubor .exe Knihovní .hpp Knihovna .lib Knihovní .cpp Kompilátor Přeložené .obj Librarian

  44. Dynamické knihovny (Microsoft) Standardní Standardní .obj Standardní .lib Uživatelské .hpp Uživatelské .cpp Kompilátor Přeložené .obj Linker Spustitelný soubor .exe Knihovní .hpp Knihovna .lib Knihovní .cpp Knihovna.dll Kompilátor Přeložené .obj Linker

  45. Dynamické knihovny (GNU) Standardní Standardní .o Standardní .a Uživatelské .hpp Uživatelské .cpp Kompilátor Přeložené .o Linker Spustitelný soubor Knihovní .hpp Knihovní .cpp Knihovna.so Kompilátor Přeložené .o Librarian

  46. main

  47. Start programu • Start programu z pohledu OS • „Někdo“ (shell,...) požádá OS o spuštění programu • Jméno spustitelného souboru • Parametry (MS: vcelku, unix: po částech) • OS (loader) • vytvoří proces, vyhradí základní kvantum paměti • načte instrukce (a inicializační data) ze souboru do paměti • doplní referencované DLL, pospojuje odkazy a relokuje • oživí proces na definovaném místě • Proces běží a prostřednictvím systémových volání žádá o • interakci s okolím (soubory, uživatelská rozhraní, komunikace,...) • přidělení další paměti, vytvoření dalších vláken, ... • ukončení (s návratovým kódem) • Proces je zlikvidován (na vlastní žádost nebo po pádu), zabit, ... • nadřazenému procesu je předán návratový kód • význam návratového kódu je závislý na konvencích

  48. Start programu • Start programu z pohledu C++ knihoven • OS (loader) • oživí proces na definovaném místě v kódu standardní knihovny • Knihovní kód • požádá OS o první kvantum paměti pro dynamickou alokaci • inicializuje struktury dynamické alokace • naváže standardní vstupy a výstupy na OS • inicializuje všechny globální proměnné • zkonvertuje parametry programu • zavolá main • uklidí globální proměnné • zavře všechny otevřené soubory • požádá o ukončení s návratovým kódem vráceným z main • Proces je zlikvidován

  49. Funkce main #include <vector> #include <string> #include <iostream> intmain( int argc, char * * argv) { std::vector<std::string> arg( argv, argv + argc); if ( arg.size() > 1 && arg[1] == "--help" ) { std::cout << "Usage: myprog [OPTION]... [FILE]..." << std::endl; return -1; } // ... return 0; } • Kontejnery počítají pozice od 0 do size()-1 • arg[0] je jméno souboru spouštěného programu • arg[1] je první parametr

  50. Podmíněný překlad • V C++ lze programovat tak, aby se program choval stejně na všech platformách (hardware, překladačích, operačních systémech) • Pokud se má program chovat jinak, lze použít direktivy #if... intmain( int argv, char * * argc) { std::vector<std::string> arg( argv, argv + argc); #ifdef unix if ( arg.size() > 1 && arg[1] == "--help" ) #else if ( arg.size() > 1 && arg[1] == "/HELP" ) #endif { std::cout << "Usage: myprog [OPTION]... [FILE]..." << std::endl; return -1; } // ... return 0; }

More Related