Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Podobné dokumenty
VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Algoritmizace a programování

Programování v C++ 1, 1. cvičení

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Jazyk C++, některá rozšíření oproti C

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Operační systémy. Cvičení 4: Programování v C pod Unixem

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Programování v jazyce C pro chemiky (C2160) 10. Grafická knihovna g2

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Programování v C++ 1, 14. cvičení

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Úvod do programování. Lekce 1

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

Abstraktní třídy, polymorfní struktury

Práce s knihovnami. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

IUJCE 07/08 Přednáška č. 1

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

PROGRAMOVÁNÍ V C++ CVIČENÍ

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

PREPROCESOR POKRAČOVÁNÍ

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY

Ukazatele, dynamická alokace

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Programovací jazyk C++ Hodina 1

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Struktury, funkce, reference

Základy C++ I. Jan Hnilica Počítačové modelování 18

Operační systémy. Cvičení 3: Programování v C pod Unixem

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Abstraktní datové typy, moduly

Prezentace a vysvětlení programového prostředí NXC

PB071 Programování v jazyce C

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

přetížení operátorů (o)

- tzv. standardní vstupní a výstupní proud (input / output stream)

Výrazy, operace, příkazy

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: Ukončí program. Nula znamená, že vše proběhlo bez chyby.

MPASM a IDE pro vývoj aplikací MCU (Microchip)

Dynamika objektů. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Mělká a hluboká kopie

DTP Základy programování Úvod do předmětu

Data, výrazy, příkazy

Vector datový kontejner v C++.

Úvod do programování. Lekce 3

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

- jak udělat konstantu long int: L long velka = 78L;

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

11. Přehled prog. jazyků

C++ objektově orientovaná nadstavba programovacího jazyka C

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Virtuální metody - polymorfizmus

PB161 Programování v jazyce C++ Přednáška 4

C99 základní informace o standardu programovacího jazyka C Výpočty v přesné aritmetice

Opakování programování

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Programování v C++ 1, 5. cvičení

Programování v jazyce C a C++

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Ošetření chyb a výjimky

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Konstruktory a destruktory

ČÁST 1. Základy 32bitového programování ve Windows

Funkce, intuitivní chápání složitosti

10 Práce s řetězci - pokračování

Odvozené a strukturované typy dat

dovolují dělení velkých úloh na menší = dekompozice

Algoritmizace a programování

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

IUJCE 07/08 Přednáška č. 6

Jazyk C++ I. Šablony

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

Programování v C++ 1, 17. cvičení

Stručný obsah První týden Druhý týden 211 Třetí týden 451 Rejstřík 787

PB161 Programování v jazyce C++ Přednáška 10

1. Programování proti rozhraní

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG )

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

Algoritmizace a programování

Úvod. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík,2016

PB161 Programování v jazyce C++ Přednáška 10

Úvod do programovacích jazyků (Java)

IPA - Lab.1 Úvod do programování v ASM

Transkript:

Preprocesor Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016 Programování v C++, A7B36PJC 4/2016, Lekce 9b https://cw.fel.cvut.cz/wiki/courses/a7b36pjc/start

Preprocesor Příklad: Definice symbolické konstanty #define MAX 100 printf("max=%d\n", MAX); MAX=100 Příklad: Definice makra #define SUM(X,Y) ((X)+(Y)) printf("sum(3,7)=%d\n", SUM(3, 7)); SUM(3,7)=10 2

Ukázka programu v C++ se symb. konst. /* převodní tabulka Fahrenheit - Celsius: C = (5/9)(F-32) */ #include <iostream> #define POCATEK 0 #define KONEC 300 #define KROK 20 int main() { int F; float C; F = POCATEK; while (F <= KONEC) { C = (5.0 / 9.0) * (F - 32); } } return 0; definice symbolických konstant (makra bez parametrů) // spočte stupně v C std::cout << F << " - " << C << "\n"; // tiskne řádek tabulky F = F + KROK; // posune na další F 3

Ukázka programu v C++ s konstantami {/* převodní tabulka Fahrenheit - Celsius: C = (5/9)(F-32) */ #include <iostream> const int pocatek = 0; const int konec = 300; const int krok = 20; int main() { } int F; float C; F = pocatek; while (F <= konec) { } return 0; C = (5.0 / 9.0) * (F - 32); // spočte stupně v C std::cout << F << " - " << C << "\n"; // tiskne řádek tabulky F = F + krok; definice konstantních buněk // posune na další F 4

Preprocesor (doplňky) Konstanty zavedené pomocí const a #define: Poskytují podobnou funkcionalitu. #define je v C i v C++, const není v C89 Debugger zná konstanty zavedené const, ale nezná konstanty nahrazené preprocesorem. Konstanty zavedené #define nerespektují jmenné prostory a pravidla zastiňování. #define je lepší použít, pokud píšeme rozhraní dynamicky linkované knihovny: nešikovné řešení s const zavádí zbytečné relokace, u dynamicky linkovaných knihoven není předem jasné, kde všude budou použity (zda vždy pouze v C++). 5

Preprocesor (doplňky) Podmíněný překlad: #if konstantní výraz #ifdef jméno #ifndef jméno #elif konstantní výraz #else #endif Příklad: #if MAX > 10 Zde je kód pro MAX > 10 #else Zde je kód pro MAX <= 10 #endif 6

Preprocesor (doplňky) Příklad: vícenásobné větvení #if MAX > 10 Zde je kód pro MAX > 10 #elif MAX > 5 Zde je kód pro MAX <= 10 a MAX > 5 #else Zde je kód pro MAX <= 5 #endif 7

Preprocesor (doplňky) Příklad: korektní předefinování makra #ifdef MAX #undef MAX #endif #define MAX 100 8

Preprocesor (doplňky) Příklad: stráže hlaviček knihoven (umožňují libovolný počet vložení hlavičky) #ifndef STDIO_H #define STDIO_H tělo knihovny #endif Alternativa: #pragma once 9

Preprocesor (doplňky) Preprocesor nabízí některá předdefinovaná makra: FILE jméno zdrojového souboru, LINE číslo řádky v aktuálním souboru, func jméno aktuálně překládané funkce, cplusplus příznak, zda je zdrojový kód kompilován překladačem C nebo C++. Kompilátory pak nabízejí předdefinovaná makra specifická pro výrobce/platformu: WIN32 BORLANDC DEBUG RELEASE příznak kompilace pro Windows, Borland kompilátory, příznak kompilace pro ladění, příznak kompilace pro ostré nasazení. 10

Preprocesor (doplňky) Předdefinovaná makra mohou usnadnit ladění: int divide(int num, int denom) { if (denom == 0) { cout << "Deleni nulou" << endl << " funkce: " << func << " soubor: " << FILE << " radek: " << LINE << endl; return (0); } return (num / denom); } 11

Preprocesor operátory # a ## Definice maker připouští dva speciální operátory (# a ##) v těle makra: Operátor #, následovaný jménem parametru se nahradí řetězcem, který je parametrem (jako by byl uveden v uvozovkách) : #define str(x) #x cout << str(test); Bude nahrazeno textem: cout << "test"; Operátor ## spojí dva argumenty (aniž je oddělí mezerou) : #define glue(a,b) a ## b glue(c,out) << "test"; Bude rovněž nahrazeno textem : cout << "test"; 12

Preprocesor direktiva #line Direktiva #line umožňuje změnu hlášení pozice chyby nalezené překladačem. Direktiva má tvar: #line number "filename" kde jméno souboru není povinné. Např.: 10. #line 20 "cosi.txt" 11. int a7; Způsobí, že překladač hlásí chybu v souboru "cosi.txt" na řádku 20, místo v aktuálním souboru na řádku 11. Lze to použít pro odkazy na zdrojový kód z nějž bylo C++ generováno. 13

Preprocesor direktiva #error Direktiva #error způsobí, že překladač hlásí chybu a ukončí překlad. Direktiva má tvar: Např.: #error text chybové zprávy #ifndef cplusplus #error A C++ compiler is required! #endif Způsobí, že pokud není makro cplusplus definováno, překladač ohlásí chybu A C++ compiler is required! a ukončí překlad. 14

Preprocesor direktiva #pragma Direktiva #pragma je určena pro speciální parametry různých prostředí. Pokud překladač direktivě neporozumí (neumí parametry interpretovat), ignoruje ji. Direktiva má tvar: Např.: #pragma parametry #pragma once Způsobí u některých překladačů, že soubor, který ji obsahuje bude překládán jen jednou. Pokud překladač této direktivě nerozumí, nebude jedinečný překlad zajištěn. Proto je lepší kombinovat tuto direktivu s běžnými strážemi hlavičkových souborů zajištěných podmíněným překladem. 15

Preprocesor assert Pomoc při ladění makro assert v hlavičkovém souboru <assert.h> (<cassert>) Makro má jako parametr podmínku: je-li podmínka platná, nic se nedělá, není-li podmínka platná, zobrazí pozici a podmínku, která vedla k jeho vyvolání. Zároveň ukončí program. Volání assert se typicky nechají v kódu: pro ladění se použijí, ve finální verzi se hromadně odpojí definicí: #define NDEBUG 16

Preprocesor assert (příklad) void print_number(int* myint) { assert (myint!=null); printf ("%d\n",*myint); } int main() { int a = 10; int *b = NULL; int *c = NULL; b = &a; } print_number(b); print_number(c); Assertion failed: myint!= NULL, file d:\výuka\fel\a7b36pjc\prednasky\2015\priklady\assert\assert\assert.cpp, line 12 abnormal program termination 17

Deklarace funkce s proměnným počtem parametrů Funkce s proměnným počtem parametrů (nutno použít standardní knihovnu <stdarg.h>) #include <stdarg.h> int K(int, ); /* proměnný počet parametrů */ int printf(char *format, ); 18

Definice funkce s proměnným počtem parametrů Hlavička: paměťová třída, typ návratové hodnoty, jméno funkce a seznam deklarací pevných parametrů zakončený (ellipsis): #include <stdarg.h> long Sum(int n, ) { long result = 0; va_list pt; va_start(pt, n); while (n-- >= 0) result += va_arg(pt, int); va_end(pt); return result; } long l = Sum(4, 2, 45, 3, 17); Při volání funkcí s proměnným počtem parametrů se kontrolují pevné parametry, proměnné parametry se samozřejmě kontrolovat nedají. 19

The End