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.3

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 wstawiany we wszystkich jego wystąpieniach w programie. Ciągiem znakó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

Przykład 3.

#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 cudzysłowie sprawdzany jest wyłącznie katalog domyślny.

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, intrinsic, message, option, severegs, startup, warn 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 wyraŜ enie3

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