struktura programu
dyrektywy preprocesora
C/C++ - struktura programu Struktura programu w języku C
1.
Dyrektywy preprocesora
2.
Deklaracje typów
3.
Deklaracje zmiennych globalnych
4.
Prototypy funkcji (zapowiedzi funkcji)
5.
Funkcja main()
6.
Definicje funkcji zapowiedzianych w p.4
#include <conio.h> // dyrektywy
#include <iostream.h>
int zmienna_globalna; // deklaracja zmiennej globalnej float suma(float a,float b); // prototyp funkcji suma int main() // funkcja main
{
float x,y;
cout<< "podaj 2 liczby\n"; cin>>x>>y;
cout<<"\nich suma jest równa "<<suma(x,y); getch();
return(0);
}
float suma(float a,float b) // definicja funkcji suma
{
return a+b;
}
C/C++ - dyrektywy preprocesora Dyrektywy preprocesora są instrukcjami dla kompilatora.
Dyrektywy nie są poleceniami języka.
Wszystkie dyrektywy rozpoczynają się od znaku # i każda musi znajdować się w oddzielnym wierszu.
Dyrektywy preprocesora zdefiniowane w ANSI C
#define
#if
#undef
#elif
#include
#else
#line
#endif
#error
#ifdef
#pragma
#ifndef
C/C++ - dyrektywy preprocesora
#define
Dyrektywa #define służy do definiowania tzw. makr (w tym makr funkcyjnych albo funkcjo-podobnych).
Składnia:
#define nazwa_makra ciąg_znaków
Dyrektywa definiuje identyfikator oraz ciąg znaków który będzie zamiast niego ws
w t
s awi
w any w
e
w ws
w z
s yst
s kich j
h ego w
go y
w st
s ąpieniach w
h
w pr
ogrami
m e. C
i
C ągiem
m z
naków
ków
może być np. stała (liczba, łańcuch) lub instrukcja.
Przykład 1.
#define MAKS 10
#define KOMUNIKAT_0 ”Wystąpił niezidentyfikowany błąd”
int wektor[MAKS];
...
if (err>34) cout<<KOMUNIKAT_0;
C/C++ - dyrektywy preprocesora Makro funkcyjne
Przykład 2.
#define even(x) (x)%2 ? 0 : 1 // o nawiasach!
#include<iostream.h>
main()
{
int a=45;
if (even(a))
cout<<a<<”jest parzyste”;
else
cout<<a<<”jest nieparzyste”; return 0;
}
przykład
C/C++ - dyrektywy preprocesora
#undef
Dyrektywa #undef anuluje definicję makra Składnia:
#undef nazwa_makra
Pr
P zykład 3.
d
#define MAKS 10
cout<<MAKS;
#undef MAKS
cout<<MAKS; //błąd – nie zadeklarowana zmienna przykład
C/C++ - dyrektywy preprocesora
#include
Dyrektywa #include zleca kompilatorowi włączenie w miejscu jej wystąpienia pliku źródłowego. Nazwa pliku musi znajdować się w cudzysłowie lub pomiędzy znakami < >.
Jeżeli nazwa pliku zawiera pełną ścieżkę to przeszukiwany jest tylko wskazany katalog.
W przeciwnym przypadku, jeśli nazwa pliku znajduje się w cudzysłowie, kompilator przeszukuje najpierw katalog bieżący, a jeśli nie znajdzie w nim pliku to katalog domyślny. Jeżeli włączany plik znajduje się w < > sprawdzany jest wyłącznie katalog domy
dom śl
ś ny.
ny
Składnia:
#include ”plik źródłowy”
#include <plik źródłowy>
przykład1
przykład2. losowanie
Przykład 4.
#include <math.h>
#include ”plik_wlasny”
C/C++ - dyrektywy preprocesora
#error
Dyrektywa #error zleca kompilatorowi zakończenie kompilowania programu w miejscu jej wystąpienia (jest stosowana na etapie usuwania błędów).
Składnia:
#error komunikat_o_błędzie
przykład
#line
Dyrektywa #line umożliwia zmianę zawartości predefiniowanych makr __LINE__ i __FILE__ (pierwsze zawiera numer wiersza, drugie – nazwę aktualnie kompilowanego pliku).
Składnia:
#line numer ” nazwa pliku”
przykład
C/C++ - dyrektywy preprocesora
#pragma
Dyrektywa #pragma umożliwia przekazanie kompilatorowi dodatkowych instrukcji (różniących się w różnych implementacjach). W pakiecie Borland C++
zdefiniowanych jest 14 poleceń z dyrektywą #pragma. Składnia:
#pragma nazwa
nazwa= argsused, anon_struct, codeseg, comment, exit, hdrfile, hdrstop, inline, i
ntrinsi
ns c, m
e
m ss
s a
s ge, option, s
e
s veregs,
gs s
t
s artup, w
a
w rn
Znaczenie przykładowych poleceń dyrektywy #pragma: argsused – użyta przed funkcją zapobiega wyświetlaniu komunikatu o tym, że jeden z argumentów funkcji jest niewykorzystywany; anon_struct – umożliwia definiowanie struktur bez nazw; exit – określa funkcję lub funkcje mające zostać wywoływane tuż przed zakończeniem działania programu;
startup – określa funkcję lub funkcje mające zostać wywoływane tuż po rozpoczęciu działania programu;
C/C++ - dyrektywy preprocesora Dyrektywy kompilacji warunkowej #if, #else, #elif, #endif Dyrektywy kompilacji warunkowej pozwalają wybiórczo kompilować fragmenty kodu źródłowego, pozwalają na tworzenie różnych wersji programu.
Ogólna postać dyrektyw #if, #endif:
#if wyrażenie
instrukcje
#endif
Jeżeli wartość wyrażenia jest równa true kompilowane są instrukcje do dyrektywy #endif. Z uwagi na to, że wartość wyrażenia obliczana jest na etapie kompilacji to elementami wyrażenia w dyrektywie #if mogą być jedynie wartości makr oraz stałe.
C/C++ - dyrektywy preprocesora Ogólna postać dyrektywy #if z #else i #endif:
#if wyrażenie
instrukcje1
# else
instrukcje2
#endif
Jeżeli wartość wyrażenia jest równa true kompilowane są instrukcje do dyrektywy #else w przeciwnym przypadku instrukcje znajdujące się pomiędzy dyrektywami #else i #endif.
C/C++ - dyrektywy preprocesora Ogólna postać dyrektywy #if z #elif, #else i #endif:
#if wyrażenie1
instrukcje1
# elif wyrażenie2
instrukcje2
#elif w
y
w ra
r ż
a e
ż nie3
instrukcje3
#else
instrukcje4
#endif
Powyższa sekwencja jest klasyczną implementacją stopniowania if-else-if i umożliwia kompilowanie jednej z wielu sekwencji instrukcji.
C/C++ - dyrektywy preprocesora Przykład 5. Dyrektywy kompilacji warunkowej. Deklaracja tablicy liczb typu integer o długości 2 bajtów bez względu rodzaj systemu przetwarzania (16, 32 bity).
#define N 10
#define M 20
#if sizeof(int) == 2
int tab[N][M];
#else
przykład
short int tab[N][M];
#endif
Użycie operatora sizeof w wyrażeniu nie we wszystkich kompilatorach jest dozwolone (Borland C++ - tak, Dev C++ - nie).
C/C++ - dyrektywy preprocesora Dyrektywy #ifdef i #ifndef
Dyrektywy #ifdef i #ifndef również umożliwiają realizację kompilacji warunkowej w zależności od tego czy zostało zdefiniowane (#ifdef) lub nie zostało zdefiniowane makro (#ifndef).
Zarówno dyrektywa #ifdef jak i #ifndef występuje w parze z dyrektywą
#endif, a także może występować dyrektywa #else. Nie jest dozwolone jednak stosowanie dyrektywy #elif.
#ifdef nazwa_makra
#ifndef nazwa_makra
instrukcje1
instrukcje1
#else
#else
instrukcje2
instrukcje2
#endif
#endif
C/C++ - dyrektywy preprocesora Przykład 6. Dyrektywa kompilacji warunkowej #ifdef. Dokonanie detekcji makra randomize uruchamiającego generator liczb pseudolosowych.
#ifdef randomize
randomize;
#else
cout<<"Ostrzeżenie - nie został uruchomiony"; cout<<" generator liczb pseudolosowych\n";
#endif
przykład