Dyrektywy preprocesora

14
Dyrektywy preprocesora Jeżeli plik źródłowy posiada rozszerzenie .F lub .FOR, może on zawierać dyrektywy dla preprocesora. Na podstawie tych dyrektyw preprocesor tworzy właściwy plik źródłowy do kompilacji. W większości implementacji dyrektywy procesora są wspólne dla języków FORTRAN, C i C++, natomiast inne dla PL/1, COBOLu oraz PASCALa. Uwaga! W przypadku niektórych implementacji FORTRANu, niezależnie lub zamiast dyrektyw preprocesora występują dyrektywy dla kompilatora. Postać dyrektywy preprocesora: #dyrektywa “#” musi być w pierwszej kolumnie Przy przetwarzaniu pliku źródłowego zawierającego dyrektywy preprocesora najpierw jest uruchamiany program cpp.

description

Dyrektywy preprocesora. - PowerPoint PPT Presentation

Transcript of Dyrektywy preprocesora

Page 1: Dyrektywy preprocesora

Dyrektywy preprocesora

Jeżeli plik źródłowy posiada rozszerzenie .F lub .FOR, może on zawierać dyrektywy dla preprocesora. Na podstawie tych dyrektyw preprocesor tworzy właściwy plik źródłowy do kompilacji. W większości implementacji dyrektywy procesora są wspólne dla języków FORTRAN, C i C++, natomiast inne dla PL/1, COBOLu oraz PASCALa.

Uwaga! W przypadku niektórych implementacji FORTRANu, niezależnie lub zamiast dyrektyw preprocesora występują dyrektywy dla kompilatora.

Postać dyrektywy preprocesora:

#dyrektywa

“#” musi być w pierwszej kolumnie

Przy przetwarzaniu pliku źródłowego zawierającego dyrektywy preprocesora najpierw jest uruchamiany program cpp.

Page 2: Dyrektywy preprocesora

Dyrektywa Argumenty Znaczenie

#define Łańcuch tekstowyDefiniowanie symbolu a w C i C++ również stałych.

#undef Łańcuch tekstowy Anulowanie #define

#include Nazwa plikuWłącznie pliku do tekstu źródłowego.

#if Wyrażenie logiczne

Kompilacja warunkowa. Operandami wyrażeń logicznych mają postać defined(tekst)

#elifŁańcuch tekstowy, wyrażenie logiczne

#ifdefŁańcuch tekstowy

#ifndef

#endif

Dyrektywy preprocesora użyteczne przy tworzeniu programów w FORTRANie

Page 3: Dyrektywy preprocesora

Dyrektywy #define, #undef i #include

#define tekst

Powoduje ustawienie przełącznika tekst; stosuje się do kompilacji warunkowej, np.

#define DEBUG powoduje ustawienie przełącznika DEBUG

Na ogół definicję wstawia się do linii polecenia kompilacji przy pomocy opcji -Dteskt

f77 -DDEBUG –o progr prog.F

Będzie miało taki sam efekt jak wstawienie #define DEBUG w pierwszej linii pliku program.F

#include “nazwa_pliku”#include <nazwa_pliku>

Działa podobnie jak fortranowska dyrektywa INCLUDE

Page 4: Dyrektywy preprocesora

Proste dyrektywy kompilacji warunkowej

#ifdef tekstkod fortranowski przy zdefiniowaniu tekst

#endif

#ifndef tekstkod fortranowski przy braku zdefiniowania tekst

#endif

Trochę bardziej złożona dyrektywa kompilacji warunkowej

#ifdef tekstkod fortranowski przy zdefiniowaniu tekst

#elsekod fortranowski przy braku zdefiniowania tekst

#endif

Dyrektywy kompilacji warunkowej

Page 5: Dyrektywy preprocesora

Pełna kaskada

#ifdef tekst1kod fortranowski przy zdefiniowaniu tekst1

#elif tekst2kod fortranowski przy zdefiniowaniu tekst2

.

.

.#else

kod fortranowski przy braku zdefiniowania tekst1, tekst2, …#endif

Page 6: Dyrektywy preprocesora

program przyklad#ifdef PIERWSZY

print *,"PIERWSZY"#elif DRUGI

print *,"DRUGI"#else

print *,”NIC”#endif

end

Przykład

etoh:~> f77 -DPIERWSZY -o przyklad przyklad.Fetoh:~> ./przyklad PIERWSZY

etoh:~> f77 -DDRUGI -o przyklad przyklad.Fetoh:~> ./przyklad DRUGI

etoh:~> f77 -o przyklad przyklad.Fetoh:~> ./przyklad NIC

Page 7: Dyrektywy preprocesora

etoh:~> f77 -P -E -DPIERWSZY przyklad.F program przyklad

print *,"PIERWSZY"

stop end

etoh:~> cpp -P -DPIERWSZY przyklad.F program przyklad

print *,"PIERWSZY"

stop end

Kończenie przetwarzania na etapie preprocessingu

Wynik przekierować do pliku z rozszerzeniem *.f. Brak opcji –P dla cpp lub –P –E dla f77 powoduje dołączenie nagłówka informującego o preprocessingu którego linie zaczynają się od “#”. To uniemożliwia kompilację otrzymanego kodu kompilatorem FORTRANu natomiast kompilacja kodu C lub C++ z takim nagłówkiem nie stanowi problemu.

Page 8: Dyrektywy preprocesora

Wykorzystanie słowa kluczowego defined

Zamiast łańcucha tekst można po #if oraz #elif umieścić wyrażenie logiczne zawierające operacje logiczne w których defined(tekst1), defined(tekst2),…, są operandami i każdy z nich ma wartość logiczną 0 jeżeli odpowiedni tekst nie został zdefiniowany lub 1 jeżeli został zdefiniowany.

Operatory są następujące:

&& - koniunkcja (operacja binarna)|| - alternatywa (operacja binarna)! - negacja (operacja unarna)

Przykład: #if defined(AIX) || defined (LINUX)

open(“plik”,status=“append”)#elif defined(IRIX)

open(“plik”,position=“append”#endif

Przykład źródła FORTRANOwskiego zawierającego różne dyrektywy preprocesora.

Page 9: Dyrektywy preprocesora

Program make i jego pliki opisowe

Program make służy do automatycznego wykonywania sekwencji zaspecyfikowanych zadań, a ogół “zrobienia” czegoś ze składników. Wygląda to jak duplikowanie skryptów csh, sh, itp., ale są dwie istotne różnice:

1. Zadanie z sekwencji jest realizowane jeżeli przynajmniej jeden z jego składników jest nowszy, niż plik będący wynikiem jego realizacji.

2. Automatycznie sprawdzane są i wykonywane w razie potrzeby wszystkie zadania, których pliki wynikowe są składnikami danego zadania.

Składnia polecenia:

make [-f plik_opisowy] [opcje] [definicje] [zadanie]

Standardowymi plikami opisowymi są Makefile lub makefile; jeden z nich musi być w aktualnym katalogu, jeżeli nie podajemy explicite pliku opisowego opcją –f.

Page 10: Dyrektywy preprocesora

Struktura pliku opisowego# Komentarze jak w skryptach unixowych; może być w dowolnym miejscu.## Najpierw definiujemy zmienne, jeżeli ich potrzebujemy. Do zdefiniowanych # zmiennych odwołujemy się jak w unixie przez ${zmienna} lub $(zmienna)#zmienna1=wartość1…zmiennaN=wartośćN

# Teraz definiujemy zadania do wykonania. Uwaga! (TAB) oznacza znak tabulacji.#zadanie1:lista_składników_zadania (dependencies)(TAB) instrukcja1…(TAB) instrukcjaN1…zadanieM:lista_składników_zadania(TAB) sposób wykonania…(TAB) instrukcjaNM

# Każda linia może być kontynuowana w następnej; w takim przypadku musi się ona # kończyć znakiem “\” a linia kontynuacji musi się rozpoczynać znakiem tabulacji.

Page 11: Dyrektywy preprocesora

Przykład użycia make do tworzenia programu titr obliczającego krzywą miareczkowania mocnego kwasu mocną zasadą

Źródła FORTRANowskie

titr.f czyt_dane.f oblicz_krzywa.f oblicz_ph.f pisz_wyniki.f

Dane

krzywa_dane

Wyniki

krzywa_wyniki

Plik Makefile w wersji najprostszej

Page 12: Dyrektywy preprocesora

Działanie programu make

Stan przed uruchomieniem make

lrwxrwxrwx 1 adam users 25 Dec 14 11:55 Makefile ->Makefiles/Makefile_simpledrwxr-xr-x 2 adam users 4096 Dec 14 11:55 Makefiles-rw-r--r-- 1 adam users 472 Jan 18 1999 czyt_dane.f-rw-r--r-- 1 adam users 176 Dec 14 11:57 krzywa.dane-rw-r--r-- 1 adam users 114 Jan 18 1999 krzywa.wyniki-rw-r--r-- 1 adam users 471 Jan 18 1999 oblicz_krzywa.f-rw-r--r-- 1 adam users 499 Jan 18 1999 oblicz_ph.f-rw-r--r-- 1 adam users 440 Jan 18 1999 pisz_wyniki.f-rw-r--r-- 1 adam users 551 Jan 18 1999 titr.f

Page 13: Dyrektywy preprocesora

etoh:~/FORTRAN/MAKE> makef77 -c titr.ff77 -c czyt_dane.ff77 -c oblicz_krzywa.ff77 -c oblicz_ph.ff77 -c pisz_wyniki.ff77 -o titr titr.o czyt_dane.o \oblicz_krzywa.o oblicz_ph.o \pisz_wyniki.o

lrwxrwxrwx 1 adam users 25 Dec 14 11:55 Makefile -> Makefiles/Makefile_simpledrwxr-xr-x 2 adam users 4096 Dec 14 11:55 Makefiles-rw-r--r-- 1 adam users 472 Jan 18 1999 czyt_dane.f-rw-r--r-- 1 adam users 1764 Dec 14 12:08 czyt_dane.o-rw-r--r-- 1 adam users 176 Dec 14 11:57 krzywa.dane-rw-r--r-- 1 adam users 114 Jan 18 1999 krzywa.wyniki-rw-r--r-- 1 adam users 471 Jan 18 1999 oblicz_krzywa.f-rw-r--r-- 1 adam users 912 Dec 14 12:08 oblicz_krzywa.o-rw-r--r-- 1 adam users 499 Jan 18 1999 oblicz_ph.f-rw-r--r-- 1 adam users 1056 Dec 14 12:08 oblicz_ph.o-rw-r--r-- 1 adam users 440 Jan 18 1999 pisz_wyniki.f-rw-r--r-- 1 adam users 1872 Dec 14 12:08 pisz_wyniki.o-rwxr-xr-x 1 adam users 15651 Dec 14 12:08 titr-rw-r--r-- 1 adam users 551 Jan 18 1999 titr.f-rw-r--r-- 1 adam users 1132 Dec 14 12:08 titr.o

Page 14: Dyrektywy preprocesora

Jeżeli zmienimy tylko niektóre pliki źródłowe lub skasujemy niektóre pliki *.o to make spowoduje kompilacje tylko plików zmienionych.

W poniższym przykładzie “modyfikujemy” plik poleceniem touch (zmienia tylko czas I datę utworzenia plku).

etoh:~/FORTRAN/MAKE> touch titr.fetoh:~/FORTRAN/MAKE> makef77 -c titr.ff77 -o titr titr.o czyt_dane.o \oblicz_krzywa.o oblicz_ph.o \pisz_wyniki.o

Przykłady bardziej złożonych plików Makefile do tworzenia programu titr

Makefile zawierający definicję kompilatora oraz objectów poprzez zmienne

Makefile zawierający ogólne polecenia kompilacji dla plików o określonym rozszerzeniu poprzez reguły przyrostkowe (suffix rules).