Preprocesor. natychmiast następuje \n są usuwane następny wiersz zostaje połączony z tym, w którym był znak \ o usuwane są wszystkie komentarze są

Podobne dokumenty
Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

zastępować zarezerwowane słowa lub symbole innymi,

Co nie powinno być umieszczane w plikach nagłówkowych:

#line #endif #ifndef #pragma

Etapy kompilacji. Wykład 7. Przetwarzanie wstępne, str. 1. #define ILE for(i=0; i<ile; i++)...

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Podstawy programowania. Wykład 9 Preprocesor i modularna struktura programów. Krzysztof Banaś Podstawy programowania 1

Laboratorium 3: Preprocesor i funkcje ze zmienną liczbą argumentów. mgr inż. Arkadiusz Chrobot

Funkcja (podprogram) void

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

1 Podstawy c++ w pigułce.

Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO. Rozdział 1. Wybór i instalacja kompilatora języka Pascal

Informatyka, Ćwiczenie Uruchomienie Microsoft Visual C++ Politechnika Rzeszowska, Wojciech Szydełko. I. ZałoŜenie nowego projektu

Poprzedni wykład [ ] :

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Programowanie strukturalne i obiektowe

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

1 Podstawy c++ w pigułce.

Języki programowania obiektowego Nieobiektowe elementy języka C++

Programowanie I C / C++ laboratorium 01 Organizacja zajęć

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Wstęp do Programowania, laboratorium 02

FUNKCJE WZORCOWE. Wykład 10. Programowanie Obiektowe (język C++) Funkcje wzorcowe wprowadzenie (2) Funkcje wzorcowe wprowadzenie (1)

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 3. Karol Tarnowski A-1 p.

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Programowanie strukturalne i obiektowe : podręcznik do nauki zawodu technik informatyk / Adam Majczak. Gliwice, cop

Język C - podstawowe informacje

Wstęp do programowania

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch

Wstęp do programowania. Wykład 1

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Zmienne powłoki. Wywołanie wartości następuje poprzez umieszczenie przed nazwą zmiennej znaku dolara ($ZMIENNA), np. ZMIENNA=wartosc.

Zmienne, stałe i operatory

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Podstawy programowania skrót z wykładów:

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Tablice, funkcje - wprowadzenie

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Część 4 życie programu

Tablice. int rozmiar; cout << Jaki ma być rozmiar tabeli? ; cin >> rozmiar; { int tablica[rozmiar]; /* TU JEST ŹLE */... }

PARADYGMATY PROGRAMOWANIA Wykład 4

Podział programu na moduły

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Metodyki i Techniki Programowania MECHANIZM POWSTAWANIA PROGRAMU W JĘZYKU C PODSTAWOWE POJĘCIA

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

I - Microsoft Visual Studio C++

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 2. Karol Tarnowski A-1 p.

Mikrokontroler ATmega32. Język symboliczny

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 2. Karol Tarnowski A-1 p.

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

Abstrakcyjne struktury danych w praktyce

2 Przygotował: mgr inż. Maciej Lasota

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

Podstawy programowania C. dr. Krystyna Łapin

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

1. Wypisywanie danych

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

PMiK Programowanie Mikrokontrolera 8051

Podstawy programowania - 1

Interpreter - EasyCompile

wykład I uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Wstęp do języka C wykład I dr Jarosław Mederski Spis Ogólne informacje

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

KURS C/C++ WYKŁAD 1. Pierwszy program

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Przekazywanie argumentów wskaźniki

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Program 14. #include <iostream> #include <ctime> using namespace std;

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

Języki i metodyka programowania. Wprowadzenie do języka C

Podstawy Kompilatorów

Wprowadzenie do programowania w języku C

INSTRUKCJE REPETYCYJNE PĘTLE

SSK - Techniki Internetowe

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Programowanie - wykład 4

Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++

WIADOMOŚCI WSTĘPNE WPROWADZENIE DO JĘZYKA TURBO PASCAL. Klawisze skrótów. {to jest właśnie komentarz, moŝna tu umieścić dowolny opis}

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Pytania sprawdzające wiedzę z programowania C++

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Pracownia specjalistyczna. Materiały przygotowali: mgr inż. Wojciech Frohmberg, mgr inż. Michał Kierzynka

Wartości domyślne, przeciażenia funkcji

Transkrypt:

Preprocesor włącza się automatycznie, bez udziału uŝytkownika poprzedza kompilację dokonuje konwersji tekstu realizuje dyrektywy (linie zaczynające się od znaku #) dyrektywy mogą wystąpić w dowolnym miejscu tekstu programu oprócz realizacji dyrektyw wykonanie pewnych standardowych przekształceń: o wszystkie wystąpienia znaków \ po którym natychmiast następuje \n są usuwane następny wiersz zostaje połączony z tym, w którym był znak \ o usuwane są wszystkie komentarze są zamieniane na pojedynczą spację o sekwencje specjalne w stałych znakowych i tekstowych są zamieniane na ich równowaŝniki (np. sekwencja \n jest zamieniana znakiem o kodzie ASCII 13) o następuje połączenie sąsiednich stałych tekstowych w jedną stałą tekstową, np.: Ala ma kota Ala ma kota

Makrodefinicje (dyrektywa #define) składnia #define identyfikator ciąg_symboli lub #define ident1(ident2, ident3,, identk) ciąg_symboli Forma krótka: nakazuje preprocesorowi zastąpienie dalszych wystąpień identyfikatora przez ciąg_symboli nie penetruje wnętrza stringów (stałych tekstowych) #define CZTERY 4 extern void funkcja(int k); main() { float tablica[cztery]; int i; i=cztery + 2*CZTERY; funkcja(cztery-1); printf( Mowilem Ci to CZTERY razy!!!\n ); } Dyrektywy #define mogą wykorzystywać wcześniej wykonane definicje #define DLUGOSC 20 #define SZEROKOSC 15 #define POLE (DLUGOSC*SZEROKOSC)

dyrektywa #define słuŝy nie tylko definicji stałych, np.: #define forever for( ; ; ) forever { break; } długie dyrektywy gdy ciąg_znaków jest długi, to moŝemy wpisać kończąc linię znakiem \, po którym następuje \n i kontynuując w następnej linijce: #define ADRES Politechnika Krakowska\n\ im. Tadeusza Kosciuszki\nul. Warszawska 24\n\ 31-155 Krakow\n cout << ADRES; definiowanie stałych o poprzez dyrektywę #define o poprzez kwalifikator const #define PI 3.1415926 const double PI=3.1415926; RóŜnice: gdy uŝyjemy #define to identyfikator nie jest znany kompilatorowi; gdy const jest. To daje większą szansę wykrycia błędów składniowych przez kompilator.

Forma długa: słuŝy do definiowania makr z argumentami (zastępowany tekst moŝe być róŝny dla róŝnych makrowywołań) pomiedzy ident1 a prawym nawiasem nie moŝe być spacji #define KWADRAT(a) ((a) * (a)) Działanie: KWADRAT(parametr) ((parametr)*(parametr)) np. KWADRAT(x+0.5) ((x+0.5)*(x+0.5)) a=kwadrat(c)+kwadrat(a+1) a=((c)*(c))+((a+1)*(a+1)) Zalety brak zaleŝności od typu (gdybyśmy zdefiniowali makro jako funkcję, to musielibyśmy zdefiniować wiele wariantów dla roŝnych typów Pułapki o moŝliwe efekty uboczne: KWARDAT(n++) dwukrotna inkrementacja o uwaga na nawiasy gdy określimy: #define KWADR(a) a*a to KWADR(n+1) n+1*n +1 = 2*n +1 naleŝy definiować jako ((a)*(a))

Odwołanie definicji dyrektywa #undef dyrektywa #define obowiązuje od momentu wystąpienia do końca pliku jeŝeli zamieścimy dyrektywę #undef wyraz to od tej chwili definicja dokonana przez dyrektywę #define wyraz... przestaje obowiązywać Dyrektywy kompilacji warunkowej stosowane w sytuacjach, gdy chcemy pewne fragmenty kodu włączyć selektywnie do kompilacji x=i*c + szereg(x0); printf( x = %f\n,x); /* wydruk pomocniczy */ m=funkcja(x); Po uruchomieniu wydruk pomocniczy niepotrzebny; moŝemy: fizycznie usunąć pracochłonne; być moŝe znów będzie potrzebny zakomentować j.w., ryzyko zagnieŝdŝenia komentarza (gdy usuwamy kilka linii zawierających juŝ komentarze) zastosować kompilację warunkową najlepsze rozwiązanie

Jak to się robi? obszar kompilacji warunkowej ograniczamy linijkami będącymi dyrektywami preprocesora #if warunek linie kompilacji warunkowej #endif warunek wyraŝenie stałe (takie, w którym kaŝdy element jest stały a jego wartość jest znana w momencie, gdy preprocesor pracuje nad daną linijką) #define PRZYPADEK 2 printf( Ta linia jest kompilowana zawsze\n ); #if (PRZYPADEK==1) printf( Ta linia jest kompilowana gdy PRZYPADEK=1\n ); #endif printf( Ta linia jest znowu kompilowana zawsze\n ); Opłaca się ostatnią dyrektywę zapisywać: #endif warunek wersja dwuwariantowa: #if warunek instrukcje 1 #else instrukcje 2 #endif dalsze uogólnienie wersja wielowariantowa (dyrektywa #elif)

podprogram opisujący wysuwanie podwozia samolotu (kilka wersji) #define PODWOZIE_707 1 #define PODWOZIE_747 2 #define PODWOZIE_DC11 3 #define PODWOZIE_LIL 4 #define TYP_PODWOZIA PODWOZIE_747 int wystaw_kola(void); { #if (TYP_PODWOZIA== PODWOZIE_707) printf( O.K. Wystawiam 707\n ); #elif (TYP_PODWOZIA== PODWOZIE_747) printf( O.K. Wystawiam 747\n ); #elif (TYP_PODWOZIA== PODWOZIE_LIL) printf( O.K. Wystawiam LIL\n ); #elif (TYP_PODWOZIA== PODWOZIE_DC11) printf( O.K. Wystawiam DC11\n ); #else printf( To sie nie moŝe zdarzyc\n ); #error zle zdefiniowana wersja programu!!! #endif TYP_PODWOZIA return 1; } Dla ustawień jak wyŝej po preprocessingu dostaniemy tekst: int wystaw_kola(void) { printf( O.K. Wystawiam 747\n ); return 1; }

inne dyrektywy kompilacji warunkowej: dyrektywy #ifdef oraz #ifndef (#if defined () lub #if! defined()) Składnia: #ifdef nazwa lub #if defined(nazwa)... grupa_instrukcji... #endif Działanie: grupa_instrukcji zostanie włączona do kompilacji o ile wcześniej wystąpiła dyrektywa #define nazwa oraz nie nastąpiło jej odwołanie poprzez #undef nazwa Podobnie: #ifndef nazwa warunek spełniony, gdy nie było dyrektywy #define nazwa zagnieŝdŝanie dyrektyw kompilacji warunkowej #if (WERSJA==1) #if (NUMER==1) c_inst1 #else c_inst2 #endif NUMER #else #if (NUMER==1) c_inst3 #else c_inst4 #endif NUMER #endif WERSJA np. gdy WERSJA=7, NUMER=1, to wybrany zostanie ciąg instrukcji c_instr3

Dyrektywa #error składnia #error string działanie: gdy dyrektywa ta zostanie osiągnięta, to kompilacja jest przerywana i wypisywany jest komunikat o błędzie, którego fragment stanowi treść napisu string Dyrektywa #line słuŝy do zmiany numerów linii i nazw plików uŝywanych do wyświetlania komunikatów o błędach i ostrzeŝeniach o przebiegu kompilacji Normalnie komunikat zawiera nazwę pliku (z systemu plików) i numer linii (liczony od początku pliku) miejsca, gdzie wystąpił błąd. MoŜna to zmienić stosując dyrektywę #line składnia #line stała_liczba nazwa_pliku działanie o kompilator przyjmie, Ŝe linia w której wystąpi dyrektywa znajduje się w pliku o nazwie nazwa_pliku w linii o numerze stała_liczba o wszystkie dalsze komunikaty o błędach w tym pliku przyjmują jako punkt odniesienia tak zdefiniowaną nazwę pliku i numer linii o parametr nazwa_pliku jest opcjonalna

Wstawianie treści innych plików (#include) dotyczy zwłaszcza plików nagłówkowych składnia #include <nazwa_pliku> #include nazwa_pliku pierwsza forma plik będzie poszukiwany w standardowym miejscu druga forma plik będzie poszukiwany najpierw w bieŝącym katalogu; jeŝeli tam go nie będzie, to w miejscu standardowym reguła: - włączanie własnych plików < > - włączanie nagłówkowych plików bibliotecznych Problem włączanie wielu plików do programu Włączamy pliki A, B, C, X. W definicji B jest włączenie pliku X. To powoduje, Ŝe do kompilacji będą włączone pliki: A, B, X, C, X MoŜliwe błędy (gdy X zawiera definicje stałych lub funkcji) MoŜliwe rozwiązanie kompilacja warunkowa: Plik X powinien mieć postać: #ifndef PLIK_X #define PLIK_X tresc pliku X #endif

Inny przykład wielowariantowy wybór nagłówka #if SYSTEM==SYSV #define HDR sysv.h #elif SYSTEM==BCD #define HDR bcd.h #elif SYSTEM==MSDOS #define HDR msdos.h #else #define HDR default.h #endif #include HDR Operator ## (sklejacz) Dokleja jeden z argumentów makrodefinicji do stojącego po jego lewej stronie, np.: #define cat(x,y) x##y wywołanie cat(var,123) daje var123 Dyrektywa pusta # nie powoduje Ŝadnego działania preprocesor ją ignoruje Dyrektywa #pragma #pragma komenda pozwala wykonać komendę charakterystyczną dla danego kompilatora wykaz komend w opisie kompilatora gdy komenda nieznana kompilatorowi dyrektywa ignorowana

Nazwy predefiniowane w preprocesorze LINE - liczba całkowita, numer bieŝącej linii kodu NAME - napis reprezentujący nazwa aktualnie kompilowanego pliku DATE - napis reprezentujący datę w chwili komplilacji (format Mmm dd yyyy ) TIME - napis reprezentujący czas w chwili kompilacji (format gg:mm:ss) Przykład uŝycia: printf( Kompilacja pliku %s\n (linia %d)\n, FILE, LINE ); printf( zaczela się %s o godz.%s.\n, DATE, TIME ); Gdy plik się nazywa test.c, pierwsza linijka wydruku ma numer 10, zaś kompilacja miała miejsce 20 marca 2003 o godz. 12:33:03, to kaŝde wywołanie programu będzie generować wydruk: Kompilacja pliku test.c (linia 10) zaczela się Mar 20 2003 o godz.12:33:03