Hlavní navigace

GLib: Začínáme aneb základní datové typy

13. 3. 2000
Doba čtení: 4 minuty

Sdílet

GLib je knihovna funkcí pro jazyk C implementující jakési základní stavební kameny programu. Je užívaná mnoha solidními projekty (např. knihovnou Gtk, na které stojí mnoho aplikací pro X-Window). Naleznete zde nástroje pro komfortní práci s řetězci a poli proměnné velikosti, práci se seznamy, stromy, hashovacími tabulkami či poměrně komplikovanými metodami jako je použití vláken (threads), run-time zavádění modulů (plug-inů) a tak dále. Autoři se nespokojili jen s kvalitními algoritmy - rázně vykročili také k přenositelnosti zdrojáků nejen mezi Unixy, ale dokonce i na Windows.

Nejnovější verzi knihovny GLib si můžete stáhnout na ftp.gtk.org/pub/gtk/v1­.2/. Solidní anglická dokumentace je k dispozici na developer.gno­me.org/doc/API/glib/.

Knihovnu GLib v žádném případě nezaměňujte s funkcemi definovanými standardním Céčkem (glibc). GLib přináší mnohem složitější a komplexnější funkce, které glibc vhodně doplňují (popřípadě nahrazují).

Kompilace s knihovnou GLib

Každý zdrojový soubor využívající funkce knihovny GLib musí mít, jak je ostatně v jazyku C zvykem, na začátku uveden hlavičkový soubor:

#include <glib.h> 

Při kompilaci se používá utilitka glib-config, která ví vše potřebné, co je třeba zadat kompilátoru, aby našel příslušné hlavičkové soubory a knihovny. Spustíte-li ji s parametrem --cflags, vypíše argumenty kompilátoru určující umístění hlavičkových souborů; s parametrem --libs vrátí argumenty, které oznamují kompilátoru umístění knihovny.

Kompilaci modulu využívajícího knihovnu GLib proveďte například takto:

gcc `glib-config --cflags` modul.c -o modul.o 

Tím se vytvoří modul modul.o. Pro slinkování modulů dohromady pak zadejte například:

gcc modul.o modul1.o modul2.o `glib-config --libs` -o program 

…čímž se z modulů modul.o, modul1.o a modul2.o vytvoří spustitelný soubor  program.

Základní datové typy

Abychom se mohli bavit o zajímavějších funkcích knihovny GLib, musíme nejprve vyjmenovat základní datové typy, se kterými knihovna pracuje.

Nové typy, které nejsou součástí standardního céčka

Sem patří například typ gboolean, který je sice vnitřně ekvivalentem typu int, měl by však nabývat pouze hodnot TRUE (pravda) nebo FALSE (nepravda). TRUE a FALSE jsou makra.

gsize (gssize) 

Příklad:

/* test datoveho typu gboolean */

#include <glib.h>

int main(void) {
  gboolean b;

  b = (2 < 3);
  if (b) printf("b je TRUE!\n");
  else printf("b je FALSE!\n");

  b = FALSE;
  if (b) printf("b je TRUE!\n");
  else printf("b je FALSE!\n");

  return(0);
}

Integerové typy garantované velikosti

GLib definuje 8, 16, 32 a popř. i 64-bitové celočíselné (integer) typy, u nichž je garantováno, že na všech platformách budou zabírat stejné množství paměti. Řeší se tím problém různých délek typu int na různých platformách. Použitím proměnných těchto garantovaných typů budete mít jistotu, že na všech systémech, ve kterých program běží, mají stejnou velikost.

Tabulka č. 29
typ popis přípustné hodnoty
gint8 8-bitový signed integer  –128 … 127
guint8 8-bitový unsigned integer 0 … 255
gint16 16-bitový signed integer  –32 768 … 32 767
guint16 16-bitový unsigned integer 0 … 65 535
gint32 32-bitový signed integer  –2 147 483 648 … 2 147 483 647
guint32 32-bitový unsigned integer 0 … 4 294 967 295
gint64 64-bitový signed integer  –9 223 372 036 8­54 775 808 … 9 223 372 036 8­54 775 807
guint64 64-bitový unsigned integer 0 … 18 446 744 07­3 709 551 615

U posledních dvou jmenovaných ( gint64 a guint64) je však malý problém. To, jestli jsou k dispozici, udává makro G_HAVE_GINT64. Jestli je G_HAVE_GINT64 definováno, můžete 64-bitové integery použít, jinak ne. K zapsání 64-bitových konstant (k naplnění 64-bitové proměnné hodnotou) ve zdrojácích je vhodné použít makro  G_GINT64_CONSTANT(value).

Příklad:

/* test datovych typu garantovane velikosti */

#include <glib.h>

int main(void) {
  gint64 x;
  guint32 y;
  gint8 z;

  #ifdef G_HAVE_GINT64
    x = G_GINT64_CONSTANT(0x1d636b02300a7aa7);
    printf("64-bitovy integer je
    podporovan: x = %Lx\n", x);
  #else
    printf("64-bitovy integer NENI podporovan touto
    platformou!\n");
  #endif

  printf("x: %d, y: %d, z: %d\n", sizeof(x)*8,
  sizeof(y)*8, sizeof(z)*8);

  return(0);
}

Typy definované pro snazší použití

GLib definuje některé datové typy jako ekvivalenty typů ze standardního Céčka proto, aby jim dala kratší názvy:

Tabulka č. 30
typ popis
gpointer pointer na void
gconstpointer konstantní pointer na void (používá se ve funkčních prototypech k označení, že data nebudou ve funkci měněna)
guchar totéž co unsigned char
guint totéž co unsigned int
gushort totéž co unsigned short
gulong totéž co unsigned long

Ekvivalenty typů jazyka C

Následující typy jsou ekvivalentními s typy, jaké definuje standardní jazyk C. Do GLib jsou vloženy pouze pro úplnost:

Tabulka č. 31
typ popis
gchar totéž co char
gint totéž co int
gshort totéž co short
glong totéž co long
gfloat totéž co float
gdouble totéž co double

Limity základních datových typů

Limity základních datových typů, tj. maximální a minimální hodnotu, které do nich lze uložit, jsou definovány pomocí maker. Všechny shrnuje následující tabulka:

root_podpora

Tabulka č. 32
typ minimum maximum
gint G_MININT G_MAXINT
gshort G_MINSHORT G_MAXSHORT
glong G_MINLONG G_MAXLONG
gfloat G_MINFLOAT G_MAXFLOAT
gdouble G_MINDOUBLE G_MAXDOUBLE


Jak jste si asi všimli, všechno, co pochází z knihovny GLib, začíná písmenem g. Je to zvyk, který se důsledně dodržuje.

Asi nejnezáživnější část máme nyní úspěšně za sebou. Příště se podíváme na práci s řetězci.

Byl pro vás článek přínosný?

Autor článku

Michal Burda vystudoval informatiku a aplikovanou matematiku a nyní pracuje na Ostravské univerzitě jako odborný asistent. Zajímá se o data mining, Javu a Linux.