Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Język C++ Preprocesor Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła.

Podobne prezentacje


Prezentacja na temat: "Język C++ Preprocesor Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła."— Zapis prezentacji:

1 Język C++ Preprocesor Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka

2 Preprocesor To ta część środowiska programistycznego, która jest uruchamiana bezpośrednio przed uruchomieniem właściwego kompilatora. Dokonuje pierwszego przeglądnięcia plików źródłowych. Rozpoznaje dyrektywy i interpretując je, dokonuje odpowiednich działań ingerując w kod.

3 Preprocesor Dyrektywy są umieszczane w stosownych miejscach programu w osobnej linii programu. Zaczynają się od znaku # (może on być poprzedzony białymi znakami), po którym następuje nazwa dyrektywy oraz ewentualnie argumenty: #nazwa_dyrektywy arg Nie kończą się średnikiem! Jeśli dyrektywa nie mieści się w jednej linii, oddzielamy linie znakiem \ (backslash).

4 nazwa nie może zawierać białych znaków.
Dyrektywa define Postać: #define nazwa zastępczy_ciąg_znaków Dyrektywa ta powoduje, że w kompilowanym pliku każde wystąpienie słowa nazwa będzie zastąpione przez podany dalej zastępczy_ciąg_znaków. nazwa nie może zawierać białych znaków. Białe znaki mogą pojawić się w zastępczym ciągu znaków. Można opuścić zastępczy ciąg znaków: #define nazwa

5 Dyrektywa define #include<iostream> using namespace std; #define PI int main() { cout << PI*2*2 << endl; return 0; } const double PI=3.1416;

6 Dyrektywa define #include<iostream> using namespace std; #define PI void fun(); int main() { cout << PI*1*1 << endl; fun(); system("pause"); return 0; } void fun() cout << PI*2*2 << endl;

7 Dyrektywa define #include<iostream> using namespace std; void fun(); int main() { cout << PI*1*1 << endl; fun(); system("pause"); return 0; } #define PI void fun() cout << PI*2*2 << endl; BŁĄD – PI nie jest znane

8 Dyrektywa define #include<iostream> using namespace std; void fun(); int main() { #define PI cout << PI*1*1 << endl; fun(); system("pause"); return 0; } void fun() cout << PI*2*2 << endl;

9 Dyrektywa undef Postać: #undef nazwa Występuje zawsze w parze z dyrektywą #define nazwa Dyrektywa ta określa miejsce w pliku, od którego przestaje obowiązywać zdefiniowana wcześniej dyrektywa

10 Makrodefinicja #include<iostream> using namespace std; #define wieksza(a,b) (a > b ? a : b) int main() { int a=1,b=5; cout<<wieksza(a,b)<<endl; return 0; }

11 Funkcja inline #include<iostream> using namespace std; inline int wieksza(int a,int b) { return (a>b?a:b); } int main() int a=1,b=5; cout<<wieksza(a,b)<<endl; return 0;

12 Define vs inline #include<iostream> using namespace std; inline int wieksza(int a,int b){ return (a>b?a:b);} int main() { int a=1,b=5; cout<<wieksza(++a,++b)<<endl; cout<<a<<endl; cout<<b<<endl; return 0; } #include<iostream> using namespace std; #define wieksza(a,b) (a>b?a:b) int main() { int a=1,b=5; cout<<wieksza(++a,++b)<<endl; cout<<a<<endl; cout<<b<<endl; return 0; } 6 2 7 2

13 Define vs inline #include<iostream> using namespace std; #define kwadrat(a) a*a int main() { int a=2; cout<<kwadrat(a)<<endl; return 0; } #include<iostream> using namespace std; #define kwadrat(a) a*a int main() { int a=2,b=5; cout<<kwadrat(a+b)<<endl; return 0; } 17 4

14 Działa dla dowolnego typu
Define vs inline #include<iostream> using namespace std; inline int wieksza(int a,int b) { return (a>b?a:b); } #include<iostream> using namespace std; #define wieksza(a,b) (a>b?a:b) Działa dla typu int Działa dla dowolnego typu Rozwiązanie: szablon funkcji

15 Operator ## #include<iostream> using namespace std; #define polacz(a,b) a ## b int main() { polacz(c,out) << "To sie pojawi na ekranie" << endl; system("pause"); return 0; }

16 Kompilacja warunkowa Czasem istnieje konieczność, aby pewne linie kody były kompilowane tylko wtedy, gdy będzie to konieczne, np.: Debugowanie programu – wyświetlanie dodatkowych informacji, Dołączanie pewnych fragmentów kodu zależy od środowisku pewnych nazw. Kompilacja danego oznaczonego fragmentu kodu wykona się lub nie w zależności od spełnienia pewnych warunków.

17 Kompilacja warunkowa #include<iostream> using namespace std; #define N 0 int main() { int a=1,b=5; #if N cout<<a<<endl; #endif cout<<b<<endl; return 0; } #denife N 1 5 1 5

18 Kompilacja warunkowa #include<iostream> using namespace std; #define N 2 int main() { #if N == 0 cout<<"N=0"<<endl; #elif N == 1 || N == 2 cout<<"N=1 lub N=2"<<endl; #else cout<<"N nieznane"<<endl; #endif system("pause"); return 0; }

19 Dyrektywa include Postać: #include <nazwa_pliku> #include "nazwa_pliku" W dane miejsce w kompilowanym pliku źródłowym (w którym występuje ta dyrektywa) wstawiana jest zawartość pliku o zadanej nazwie. Najczęściej używana dla wstawiania plików nagłówkowych (z definicjami typów, struktur danych, klas, itp.).

20 Plik a.h int a; Plik b.cpp #include"a.h" int b;
Pliki nagłówkowe Plik a.h int a; Plik b.cpp #include"a.h" int b; Plik b.cpp int a; int b;

21 Plik a.h int a; Plik b.h #include"a.h" int b; Plik c.cpp #include"b.h"
Pliki nagłówkowe Plik a.h int a; Plik b.h #include"a.h" int b; Plik c.cpp #include"b.h" Plik b.h int a; int b; Plik c.cpp int a; int b; BŁĄD redefinicja

22 ifdef ifndef #ifndef PLIK_H #define PLIK_H ... tersc pliku naglowkowego #endif

23 Nie definiujemy po raz drugi a
Pliki nagłówkowe Plik a.h #ifndef A_H #define A_H int a; #endif Plik b.h #ifndef B_H #define B_H #include"a.h" int b; Plik c.cpp #include"b.h" Plik b.h #ifndef B_H #define B_H #ifndef A_H #define A_H int a; #endif int b; Plik c.cpp #ifndef A_H #define A_H int a; #endif #ifndef B_H #define B_H int b; Nie istnieje A_H Definiujemy A_H Definiujemy a Nie istnieje B_H Definiujemy B_H Istnieje A_H Nie definiujemy po raz drugi a Definiujemy b

24 Dyrektywa error #include<iostream> using namespace std; #define N 0 int main() { #if N == 0 #error N jest rowne 0 #endif system("pause"); return 0; }

25 Dyrektywa warning #include<iostream> using namespace std; #define N 0 int main() { #if N == 0 #warning N jest rowne 0 #endif system("pause"); return 0; }

26 Data i godzina kompilacji (nie aktualna)
Nazwy predefiniowane #include<iostream> using namespace std; int main() { cout<<__FILE__<<endl; cout<<__LINE__<<endl; cout<<__DATE__<<endl; cout<<__TIME__<<endl; return 0; } Data i godzina kompilacji (nie aktualna)

27 Prezentacja udostępniona na licencji Creative Commons: Uznanie autorstwa, Na tych samych warunkach 3.0. Pewne prawa zastrzeżone na rzecz autorów. Zezwala się na dowolne wykorzystywanie treści pod warunkiem wskazania autorów jako właścicieli praw do prezentacji oraz zachowania niniejszej informacji licencyjnej tak długo, jak tylko na utwory zależne będzie udzielana taka sama licencja. Tekst licencji dostępny jest na stronie:


Pobierz ppt "Język C++ Preprocesor Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła."

Podobne prezentacje


Reklamy Google