Hlavní strana -> Programování v C -> Moduly

Moduly

V naprosté většině případů nebývají programy tak krátké, abychom jejich zdrojový kód měli napsaný v jediném souboru. Jaké jsou důvody? Při rozdělení programu do několika souborů nám to dovolí si celý projekt lépe logicky rozdělit. Můžeme pak mít třeba jeden soubor, ve kterém budou funkce obsahující práci s grafikou, v jiném zase práci se zvukem, práci s výpisem textů a podobně. Dále pokud je projekt hezky logicky rozdělený, není takový problém rychle dohledat tu část kódu, kterou chceme odebrat / vylepšit. Zkrátka lépe se v takové struktuře lépe orientuje a projekt se seskládá dohromady jako stavebnice. Stačí vědět jak na to. A to je účelem tohoto článku.

Již několikrát jsem v ukázkových zdrojových kódech použil direktivu preprocesoru #include. (pozn. Projekt se builduje tak, že nejdříve nastoupí preprocesor, což nemá se samotným překladem ještě moc společného. Ten provádí úpravy na úrovni zdrojového kódu. Například rozvíjí makra, přidává deklarace z hlavičkových souborů atd. Poté jde na řadu kompilátor, ten převádí zdrojový kód do jakéhosi "mezikódu", ve kterém jsou ještě relativní adresy na funkce. Potom se spustí linker a ten to všechno dá dohromady do spustitelné podoby. Poněkud zjednodušeně řečeno.) Include slouží pro vložení obsahu hlavičkového souboru (.h). Tyto soubory obsahují pouze deklarace funkcí a proměnných. Informují o tom, že nějaké funkce existují a jak mají vypadat. Do hlavičkových souborů proto patří prototypy funkcí. Ne jejich těla. Samotné definice (tedy skutečný výkonný kód funkce) se dávají do souborů (.c), ve kterém je třeba includovat také příslušný (.h). V hlavičkovém souboru ještě použijeme další možnosti preprocesoru a tou je podmíněný překlad. Dovolí nám překládat ty části kódu, které potřebujeme. Nejlepší vidět to na příkladu, na kterém to vysvětlím.

Soubor main.c :

#include <stdio.h>
#include "vypocty.h"

int main(void)
{
	int x, y;

	x = 5;
	y = 8;

	printf("%d + %d = %d\n", x, y, soucet(x, y));
	printf("%d - %d = %d\n", x, y, rozdil(x, y));

	return 0;
}

Soubor vypocty.h :

#ifndef _VYPOCTY_H
#define _VYPOCTY_H

int soucet(int a, int b);
int rozdil(int a, int b);

#endif

Soubor vypocty.c :

#include "vypocty.h"

int soucet(int a, int b)
{
	return a+b;
}

int rozdil(int a, int b)
{
	return a-b;
}

Příkaz preprocesoru #ifndef se zeptá, jestli není definován _VYPOCTY_H. Pokud je to pravda (definován skutečně není), nadefinuje jej, všechny deklarace funkcí budou viditelné a #ifndef je ukončen #endif. Celý kód je takto zabalen z toho důvodu, aby nebyl inkludován několikrát nebo dokonce v nekonečné smyčce. Přeloženo do češtiny to znamená: Pokud ještě tenhle soubor inkludován není, inkluduj jej. O příkazu preprocesoru #define se rozepíšu v jiném díle. Zatím jej berte, že takto se dá využít. Rozdíl, jestli v #include napsat jméno souboru do lomených závorek, nebo do uvozovek je v tom, kde jej má překladač hledat. Pokud je soubor v uvozovkách, znamená to, že se bude hledat v aktuálním adresáři projektu. Pokud v lomených závorkách, říkáme tím překladači, že je soubor na jedné ze standardních cest. Ve Visual C++ 2005 Express Edition cesty můžem nastavit pod nabídkou Tools - Options - Projects and Solutions - VC++ Directories - Show directories for:

Všechny soubory se zdrojovým kódem musí být do projektu vloženy nebo v něm přímo vytvořeny v nabídce Project - Add New Item / Add Existing Item.

Výše popsaným způsobem se dá sestavovat program, pokud všechny jeho části píšem sami nebo máme kompletní zdrojové kódy. V mnoha případech jsou ale programy skládány z našich vlastních kódů a s použitím cizích, již zkompilovaných knihoven. K tomu potřebujeme příslušnou knihovnu (.lib) a její hlavičkové soubory. Hlavičkové soubory se nainkludují standardním způsobem a knihovny je třeba ve VC++ připojit buď s pomocí:

#pragma comment(lib, "knihovna.lib")

na začátku zdrojáku nebo v nastavení projektu Project - Projekt Properties - Configuration Properties - Linker - Command Line, kde se vepíšou příslušná jména knihoven. Měly by k nim být stejně jako v předešlém případě nastaveny cesty přes VC++ Directories. V ostatních vývojových prostředích (IDE) je nastavení podobné.

Doufám, že to pro vysvětlení takto stačilo. Jdu psát jinou část...

Zpět

Programování v C | CZ 175/477 | Mapa stránek
Bc. Petr Klimánek, student Ostravské univerzity v Ostravě