Preprocesor języka C: dyrektywy, makrodefinicje

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

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

PROGRAMOWANIE w C prolog

Funkcja (podprogram) void

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

Poprzedni wykład [ ] :

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

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

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

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

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

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

#line #endif #ifndef #pragma

Wykład 1

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

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

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

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

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

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ą

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch

Programowanie Proceduralne

Programowanie w języku Python. Grażyna Koba

Funkcje. czyli jak programować proceduralne. Programowanie Proceduralne 1

Funkcje. czyli jak programować proceduralne. Programowanie Proceduralne 1

Laboratorium 1. I. Zainstaluj program Eclipse (wersja C/C++ w odpowiednim systemie operacyjnym

Informatyka I : Tworzenie projektu

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

WYKŁAD 1 - KONSPEKT. Program wykładu:

Mikrokontroler ATmega32. Język symboliczny

Szablony funkcji i klas (templates)

Fragment wykładu z języka C ( )

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Sieciowa komunikacja procesów - XDR i RPC

Wstęp do Programowania, laboratorium 02

Język C - podstawowe informacje

Lab 1. Wstęp do programowania w C. Zintegrowane środowisko programistyczne Visual Studio.

Elementarne wiadomości o języku C

Podstawy programowania komputerów

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

1 Podstawy c++ w pigułce.

Wstęp do programowania

Podstawy programowania w języku C i C++

OSI Data Link Layer. Network Fundamentals Chapter 7. Version Cisco Systems, Inc. All rights reserved. Cisco Public 1

Podział programu na moduły

1. Wprowadzenie do C/C++

Automatyzacja kompilacji. Automatyzacja kompilacji 1/40

C++. Leksykon kieszonkowy

Programowanie strukturalne język C - wprowadzenie

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Wstęp. #define include include include include include include

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

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

Warsztaty dla nauczycieli

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Język C część 1. Sformułuj problem Zanalizuj go znajdź metodę rozwiązania (pomocny może byd algorytm) Napisz program Uruchom i przetestuj czy działa

Wstęp. do języka C na procesor (kompilator RC51)

Paostwowa Wyższa Szkoła Zawodowa w Płocku Dariusz Wardowski

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

Inżynieria Wytwarzania Systemów Wbudowanych

Automatyzacja kompilacji. Automatyzacja kompilacji 1/28

Podstawy programowania. Wykład Funkcje raz jeszcze. Biblioteka standardowa. Krzysztof Banaś Podstawy programowania 1

System operacyjny Linux

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 8. Karol Tarnowski A-1 p.

Wstęp do programowania. Wykład 1

Konsolidacja (linking)

1. Wprowadzenie do C/C++

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

W większości języków programowania(nie we wszystkich) wymaga się, żeby użyte w programie zmienne były wcześniej zadeklarowane:

Programowanie w C++ Wykład 10. Katarzyna Grzelak. 21 maja K.Grzelak (Wykład 10) Programowanie w C++ 1 / 21

Sposoby wykrywania i usuwania błędów. Tomasz Borzyszkowski

Programowanie strukturalne i obiektowe

Języki i paradygmaty programowania 1 studia niestacjonarne 2018/19

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

Wstęp do programowania

MS Visual Studio 2005 Team Suite - Performance Tool

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

Popularne biblioteki C++

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Programowanie w elektronice: Podstawy C

Programowanie obiektowe i C++ dla matematyków

Zmienne, stałe i operatory

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

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

Deklaracje. W większości języków programowania(nie we wszystkich) wymaga się, żeby użyte w programie zmienne były wcześniej zadeklarowane:

I - Microsoft Visual Studio C++

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Kompilacja i scalanie programów w linii poleceń gcc i make

2018 Marcin Kukliński. Niesforne bity i bajty

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 26 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 28

Pobieranie argumentów wiersza polecenia

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Ćwiczenia nr 11. Translatory. Wprowadzenie teoretyczne

Utworzenie pliku. Dowiesz się:

Transkrypt:

Preprocesor języka C: dyrektywy, makrodefinicje wer. 8 z drobnymi modyfikacjami! Wojciech Myszka 2017-04-07 09:34:45 +0200

Od kodu do programu wykonywalnego 1. Kod źródłowy 2. Preprocesor (gcc -E) 3. Kompilacja (konwersja do języka wewnętrznego) (gcc -S) 4. Assembler (tworzy pliki wynikowe) (gcc -c) 5. Konsolidowanie (przeglądanie bibliotek, budowa pliku wykonywalnego). 6. Uruchomienie 7. Debugowanie

Preprocesor 1. Pierwszym krokiem kompilacji jest przetwarzanie programu za pomocą preprocesora.

Preprocesor 1. Pierwszym krokiem kompilacji jest przetwarzanie programu za pomocą preprocesora. 2. Najczęściej stosowanymi poleceniami preprocesora są:

Preprocesor 1. Pierwszym krokiem kompilacji jest przetwarzanie programu za pomocą preprocesora. 2. Najczęściej stosowanymi poleceniami preprocesora są: #include

Preprocesor 1. Pierwszym krokiem kompilacji jest przetwarzanie programu za pomocą preprocesora. 2. Najczęściej stosowanymi poleceniami preprocesora są: #include #define

Preprocesor 1. Pierwszym krokiem kompilacji jest przetwarzanie programu za pomocą preprocesora. 2. Najczęściej stosowanymi poleceniami preprocesora są: #include #define polecenia kompilacji warunkowej (#if, #ifdef, #ifndef, #endif, #else, #elif)

Wstawianie plików 1. Każdy wiersz programu o postaci: jest zastępowany zawartością pliku o wskazanej nazwie.

Wstawianie plików 1. Każdy wiersz programu o postaci: #include "nazwa-pliku" jest zastępowany zawartością pliku o wskazanej nazwie.

Wstawianie plików 1. Każdy wiersz programu o postaci: #include "nazwa-pliku" #include <nazwa-pliku> jest zastępowany zawartością pliku o wskazanej nazwie.

Wstawianie plików 1. Każdy wiersz programu o postaci: #include "nazwa-pliku" #include <nazwa-pliku> jest zastępowany zawartością pliku o wskazanej nazwie. 2. Jeśli nazwa pliku ograniczona jest cudzysłowami poszukiwanie pliku rozpoczyna się tam gdzie znaleziono plik źródłowy.

Wstawianie plików 1. Każdy wiersz programu o postaci: #include "nazwa-pliku" #include <nazwa-pliku> jest zastępowany zawartością pliku o wskazanej nazwie. 2. Jeśli nazwa pliku ograniczona jest cudzysłowami poszukiwanie pliku rozpoczyna się tam gdzie znaleziono plik źródłowy. 3. Jeśli nazwa pliku ograniczona jest nawiasami kątowymi <, > plik szukany jest wśród plików systemowych (w miejscach zależnych od implementacji).

Wstawianie plików 1. Każdy wiersz programu o postaci: #include "nazwa-pliku" #include <nazwa-pliku> jest zastępowany zawartością pliku o wskazanej nazwie. 2. Jeśli nazwa pliku ograniczona jest cudzysłowami poszukiwanie pliku rozpoczyna się tam gdzie znaleziono plik źródłowy. 3. Jeśli nazwa pliku ograniczona jest nawiasami kątowymi <, > plik szukany jest wśród plików systemowych (w miejscach zależnych od implementacji). 4. Plik włączany poleceniem #include może zawierać kolejne polecenia #include.

Standardowe pliki nagłówkowe I ANSI C library header files Ważne pliki nagłówkowe: 1. <assert.h> Contains the assert macro, used to assist with detecting logical errors and other types of bug in debugging versions of a program. 2. <complex.h> A set of functions for manipulating complex numbers. (New with C99) 3. <ctype.h> Contains functions used to classify characters by their types or to convert between upper and lower case in a way that is independent of the used character set (typically ASCII or one of its extensions, although implementations utilizing EBCDIC are also known). 4. <errno.h> For testing error codes reported by library functions.

Standardowe pliki nagłówkowe II ANSI C library header files 5. <fenv.h> For controlling floating-point environment. (New with C99) 6. <float.h> Contains defined constants specifying the implementation-specific properties of the floating-point library, such as the minimum difference between two different floating-point numbers (_EPSILON), the maximum number of digits of accuracy (_DIG) and the range of numbers which can be represented (_MIN, _MAX). 7. <inttypes.h> For precise conversion between integer types. (New with C99) 8. <iso646.h> For programming in ISO 646 variant character sets. (New with NA1)

Standardowe pliki nagłówkowe III ANSI C library header files 9. <limits.h> Contains defined constants specifying the implementation-specific properties of the integer types, such as the range of numbers which can be represented (_MIN, _MAX). 10. <locale.h> For setlocale() and related constants. This is used to choose an appropriate locale. 11. <math.h> For computing common mathematical functions 12. <setjmp.h> Declares the macros setjmp and longjmp, which are used for non-local exits 13. <signal.h> For controlling various exceptional conditions 14. <stdarg.h> For accessing a varying number of arguments passed to functions.

Standardowe pliki nagłówkowe IV ANSI C library header files 15. <stdbool.h> For a boolean data type. (New with C99) 16. <stdint.h> For defining various integer types. (New with C99) 17. <stddef.h> For defining several useful types and macros. 18. <stdio.h> Provides the core input and output capabilities of the C language. This file includes the venerable printf function. 19. <stdlib.h> For performing a variety of operations, including conversion, pseudo-random numbers, memory allocation, process control, environment, signalling, searching, and sorting. 20. <string.h> For manipulating several kinds of strings. 21. <tgmath.h> For type-generic mathematical functions. (New with C99)

Standardowe pliki nagłówkowe V ANSI C library header files 22. <time.h> For converting between various time and date formats. 23. <wchar.h> For manipulating wide streams and several kinds of strings using wide characters - key to supporting a range of languages. (New with NA1) 24. <wctype.h> For classifying wide characters. (New with NA1)

Makrorozwinięcia I 1. Makrorozwinięcia to definicje które pozwalają duży fragment tekstu zastąpić krótkim: #define nazwa z a s t e p u j a c y _ t e k s t 2. Każde użycie ciągu znaków nazwa zostanie zamienione przez zastepujacy_tekst. 3. Definicja może korzystać z poprzednich definicji. 4. Makrorozwinięcia nie obowiązują wewnątrz stałych tekstowych (ograniczonych znakami cudzysłowów). 5. Makrorozwinięcia stosuje się do całych jednostek leksykalnych. Zatem jeżeli zdefiniowane jest coś takiego:

Makrorozwinięcia II #define YES "Tak" to każde wystąpienie YES zostanie zamienione na "Tak", ale nie będzie to dotyczyło p r i n t f ( "YES" ) ; albo wystąpienia napisu YESMAN A co będzie w przypadku p r i n t f ( YES ) ;

Makrorozwinięcia z parametrami I 1. Istnieje możliwość definiowania makr z argumentami zastępujący tekst może być różny dla różnych wywołań: #define max(a, B) ( (A) > (B)? (A) : (B) ) Bardzo przypomina wywołanie funkcji, ale realizowane będzie w sposób następujący: Pojawienie się w tekście programu napisu x = max( p+q, r+s ) ; zostanie rozwinięte jako x = ( ( p+q ) > ( r+s )? ( p+q ) : ( r+s ) )

Makrorozwinięcia z parametrami II Rozwiązanie takie ma wadę: wyrażenia obliczane są dwukrotnie, zatem w z = max( i ++, j ++); wartości i, j zostaną zwiększone dwukrotnie! 2. W przypadku gdy makrorozwinięcia używane są do prowadzenia obliczeń, pamiętać należy o odpowiednim stosowaniu nawiasów. #define s q u a r e ( x ) x x tłumaczone jest rozsądnie w najprostszym przypadku y = square(v); na y = v v ; ale w przypadku y = square(v + 1); na y = v + 1 v + 1 ;

Makrorozwinięcia z parametrami III 3. Poprawna definicja powinna wyglądać jakoś tak: #define s q u a r e ( x ) ( x ) ( x ) 4. Uwaga: pomiędzy nazwą a nawiasem otwierającym nie może być odstępu! 5. Makra rozwijanie są przed kompilacją!

Makrorozwinięcia z parametrami I 1. Jeżeli nazwę parametru w zastępującym tekście poprzedzimy znakiem # to cała kombinacja (parametr i znak) zostaną rozwinięte w ciąg znaków ograniczonych cudzysłowami. 2. Przyjmijmy, że mamy taką definicję: #define d r u k u j ( t e k s t ) p r i n t f ( #t e k s t ) to wywołanie d r u k u j ( a l a ma kota ) ; jest rozwijane w p r i n t f ( " a l a ma kota " ) ;

Makrorozwinięcia z parametrami II 3. Znaków ## można używać do sklejania parametrów formalnych. Makro #define s k l e j ( przod, t y l ) przod ## t y l wywołane s k l e j ( a, 1) zostanie rozwinięte jako a1

Makrorozwinięcia Prosty przykład #i f d e f DEBUG # include <s t d i o. h> # define w y p i s z ( x ) do { p r i n t f ( " Zmienna " # x \ " = %d\n", x ) ; } \ while ( 0 ) ; #e l s e # define w y p i s z ( x ) #e n d i f Użycie #define DEBUG... w y p i s z ( a ) ;

Odwoływanie makra Jeżeli jakaś definicja przestaje być potrzebna można ją zlikwidować za pomocą polecenia #undef Na przykład tak: #define DEBUG 1 / Wydruki d i a g n o s t y c z n e / /... / #i f d e f DEBUG /... / #endif /... / #undef DEBUG /... /

Makrorozwinięcia Przykład #i f d e f DEBUG # include <s t d i o. h> # define D( x ) do { p r i n t f ( "%s :%d (%s ) ",\ FILE, LINE, \ FUNCTION ) ; \ p r i n t f x ; \ f p u t c ( \n, s t d o u t ) ; \ f f l u s h ( s t d o u t ) ; } \ while ( 0 ) ; #e l s e # define D( x ) #endif

Użycie makra D D(("z= %d ", z)) Czemu tak?

Kompilacja warunkowa I Preprocesor został wyposażony w kilka poleceń pozwalających na sterowanie przetwarzaniem kodu źródłowego. Są to: #i f warunek /... / #endif #i f warunek /... / #e l s e /... / #endif

Kompilacja warunkowa II #i f warunek1 /... / #e l i f warunek2 /... / #e l i f warunek3 /... / #e l s e /... / #endif Dodatkowo sprawdzać można czy zostały zdefiniowane makra poleceniami

Kompilacja warunkowa III #i f d e f makro /... / #endif Oraz czy makro nie zostało zdefiniowane #i f n d e f makro /... / #endif

Kompilacja warunkowa Po co? 1. Warunkowe włączanie kodu na potrzeby uruchomienia (DEBUG). 2. Tworzenie kodu przenośnego w zależności od wersji systemu (kompilatora) standardowy zestaw makrodefinicji zawarty może być w plikach nagłówkowych. 3. Zakomentowanie dużego fragmentu kodu.

Zmienne preprocesora Wiele z tego zależy od implementacji, ale zazwyczaj zdefiniowane są następujące zmienne: LINE FILE DATE TIME cplusplus STDC 1. LINE i FILE oznaczają, odpowiednio, numer linii źródłowej kompilowanego pliku i jego nazwę.

Zmienne preprocesora Wiele z tego zależy od implementacji, ale zazwyczaj zdefiniowane są następujące zmienne: LINE FILE DATE TIME cplusplus STDC 1. LINE i FILE oznaczają, odpowiednio, numer linii źródłowej kompilowanego pliku i jego nazwę. 2. Zmienna DATE zawiera datę precyzyjniej datę kiedy dokonywana jest kompilacja.

Zmienne preprocesora Wiele z tego zależy od implementacji, ale zazwyczaj zdefiniowane są następujące zmienne: LINE FILE DATE TIME cplusplus STDC 1. LINE i FILE oznaczają, odpowiednio, numer linii źródłowej kompilowanego pliku i jego nazwę. 2. Zmienna DATE zawiera datę precyzyjniej datę kiedy dokonywana jest kompilacja. 3. Zmienna TIME zawiera czas precyzyjniej czas kiedy dokonywana jest kompilacja.

Zmienne preprocesora Wiele z tego zależy od implementacji, ale zazwyczaj zdefiniowane są następujące zmienne: LINE FILE DATE TIME cplusplus STDC 1. LINE i FILE oznaczają, odpowiednio, numer linii źródłowej kompilowanego pliku i jego nazwę. 2. Zmienna DATE zawiera datę precyzyjniej datę kiedy dokonywana jest kompilacja. 3. Zmienna TIME zawiera czas precyzyjniej czas kiedy dokonywana jest kompilacja. 4. Zmienna cplusplus zdefiniowana jest tylko wtedy, gdy kompilowany jest program w języku C++.

Zmienne preprocesora Wiele z tego zależy od implementacji, ale zazwyczaj zdefiniowane są następujące zmienne: LINE FILE DATE TIME cplusplus STDC 1. LINE i FILE oznaczają, odpowiednio, numer linii źródłowej kompilowanego pliku i jego nazwę. 2. Zmienna DATE zawiera datę precyzyjniej datę kiedy dokonywana jest kompilacja. 3. Zmienna TIME zawiera czas precyzyjniej czas kiedy dokonywana jest kompilacja. 4. Zmienna cplusplus zdefiniowana jest tylko wtedy, gdy kompilowany jest program w języku C++. 5. Zmienna STDC zdefiniowana jest wtedy, gdy kompilowany jest program w języku C.

Inne przydatne stałę _WIN32 Windows, wersja 32 bity, _WIN64 Windows, wersja 64 bity, APPLE Apple, linux Linux, unix inny Unix,... Pełniejsza lista definicji akceptowanych przez większość kompilatorów: https://sourceforge.net/p/predef/wiki/operatingsystems/ a lista definicji rozpoznawanych przez kompilator gcc tu: http://gcc.gnu.org/onlinedocs/cpp/predefined-macros.html.