C/C++

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

C/C++ - struktura programu

#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