3.42k likes | 3.56k Views
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.
E N D
Programování v C++ David Bednárek www.ksi.mff.cuni.cz/~bednarek
Pravidla studia NPRG041 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. • 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
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
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
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
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
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)
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)
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
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
Architektura Překladače / interpretry
CPU C P U
CPU rozumí pouze binárním kódu C P U 01010000 01110100 11010111 10010110 00100010 10110001
1940... – programování ve strojovém kódu C P U 01010000 01110100 11010111 10010110 00100010 10110001
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
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
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
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
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
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
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
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++
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
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
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
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
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č
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č
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č”
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"; }
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
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
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
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
make Standardní Standardní .obj Standardní .lib Uživatelské .hpp Uživatelské .cpp Kompilátor Přeložené .obj Linker Spustitelný soubor .exe Make makefile
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
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
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
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
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
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
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
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; }