Zdrojový kód v jazyce C je nutné přeložit. V tomto článku si předvedem překlad jednoduchého programu pomocí překladače GCC a zmíníme editor.

Editor

Pro vývoj programů v jazyce C lze použít libovolný textový editor nebo některé z pokročilejších vývojových prostředí. Na Linuxu můžeme používat mcedit (součást mc), vim, kate (velmi pěkný a mocný editor), helix, sublime, VSCode …​. je to jedno, editorů jsou tuny.

Překlad

Předpokládejme, že máme vytvořen program hello.c, který byl popsán v sekci První program. Program před vlastním překladem uložíme, abychom překládali aktuální podobu zdrojového kódu. V konzoli přejdeme do adresáře s programem (příkaz cd pro změnu adresáře, příkaz pwd pro vypsání aktuálního umístění, příkaz ls pro vypsání adresáře). Překlad lze provést jednoduchým zapsáním příkazu

gcc hello.c

Vypíšeme-li si obsah adresáře, najdeme v něm nový soubor a.out. To je náš přeložený program. Takto zvláštně překladač náš výsledný program pojmenoval, protože jsme mu neurčili žádné vlastní jméno.

Program lze spustit voláním

./a.out

Výstupem programu pak bude

Hello world!

Parametry překladače GCC

GCC poskytuje skrze parametry příkazové řádky nesmírně rozsáhlé možnosti konfigurace. My zde uvedeme jen parametry pro nás zajímavé:

Tabulka 1. Zajímavé parametry GCC
parametr význam

-o <jméno>

Nastaví jméno výstupního programu. Např. -o hello pojmenuje výsledný spustitelný soubor hello.

-O<0|1|2|3|s>

Nastaví úroveň optimalizace. 0 je žádná optimalizace, 3 je nejvyšší úroveň optimalizace, s je optimalizace pro co nejmenší velikost. Základní nastavení je 0.

-Wall

Zapne všechna varování

-pedantic

Zapne striktní mód podle normy C.

-g

Do výsledného programu přidá ladící informace. Nutné pro ladění pomocí gdb a ostatních programů

-l<knihovna>

Použije při spojování uvedenou dynamickou knihovnu. Název je uváděn bez úvodního lib, tedy připojení matematické knihovny libm provedeme zápisem -lm.

Pokud bychom tedy chtěli přeložit náš program s optimalizací první úrovně, se zapnutými varováními a názvem programu hello, zavoláme

gcc hello.c -o hello -O1 -Wall

Chyby v překladu

V případě, že máme vše v pořádku a program se přeloží, nevypíše překladač žádnou zprávu. V případě chyby nám překladač sdělí, na které řádce zdrojového kódu je něco špatně a co se mu nelíbí. Poznat z výpisu příčinu chyby je mnohdy náročné a vyžaduje to dobrou znalost jazyka C.

Chyby mohou nastat ve všech třech částech překladu programu. Chyby preprocesoru jsou typicky omezeny na nenalezení připojovaného souboru:

bity.c
1
2
3
4
5
6
7
8
9
#include <sstdio.h> (1)

int main (int argc, char **argv)
{
  int a = 3;
  int b = 5;
  printf("a je %d, b je %d\n", a, b);
  return 0;
}
1 Překlep, hlavičkový soubor se jmenuje stdio.h
bity.c:1:20: fatal error: sstdio.h: No such file or directory
compilation terminated.

V tomto případě je nutné zkontrolovat jméno připojovaného souboru a opravit překlep. Hlavičkový soubor se jmenuje stdio.h, nikoliv sstdio.h. Pokud připojujeme vlastní zdrojové soubory, měli bychom se ujistit, že je překladač dokáže najít. Pro přidání vlastní cesty slouží přepínač -I.

Chyby při překladu jsou asi nejčastější. Každá taková chyba říká, že je náš program syntakticky nesprávně, a že překladač nerozumí kódu, který mu předkládáme. Chybových výpisů existuje nepřeberné množství a někdy mohou být zavádějící. Obecně je dobré zkontrolovat řádku, na které má být chyba, a též jednu řádku nad označeným místem. V následujícím kódu je syntaktická chyba na řádce šest, ale překladač označí až řádku sedm.

bity.c
1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main (int argc, char **argv)
{
  int a = 3;
  int b = 5	(1)
  printf("a je %d, b je %d\n", a, b);
  return 0;
}
1 Tady nám chybí středník

Na řádce šest nám totiž chybí středník, na což překladač přijde, až když se pokusí najít pokračování příkazu z řádky šest na řádce sedm. Proto označí za místo chyby až řádek sedm.

bity.c: In function 'main':
bity.c:7:3: error: expected ',' or ';' before 'printf'

Posledním typem chyb jsou chyby při spojování (linkování). Poznat z takové chyby příčinu je mnohdy problém, protože překladač nám neoznačí žádné speciální místo v kódu. V nejvíce případech chyba nastane, když používáme některou z knihoven a zapomeneme ji připojit k programu. Kupříkladu následující kód:

matematika.c
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <math.h>
int main(int argc, char **argv)
{
  int a = 3.0; (1)
  double D = sqrt(a);  (2) (3)
  printf ("%f\n", D);
  return 0;
}
1 Tady by mělo být double a ne int.
2 Tady dojde k implicitní konverzi z int na double
3 Knihovní funkce sqrt, která počítá druhou odmocninu z reálného čísla, očekává parametr typu double. Deklaraci funkce lze nalézt v hlavičkovém souboru math.h

se přeloží, ale nespojí (neslinkuje). Překladač nám jen stroze oznámí, že nemůže najít odkaz na sqrt:

/tmp/ccrYY7Mk.o: In function `main':
main.c:(.text+0x2d): undefined reference to `sqrt'
collect2: ld returned 1 exit status

Řešením v tomto případě je připojení matematické knihovny pomocí parametru -lm. Tento parametr je potřeba dát nakonec.

cc -o matematika  matematika.c -lm

Pokud se stanete programátorem, celá vaše kariéra bude zápasem s chybami. Bohužel se tomu nelze vyhnout. Čím více budete pečliví a pozorní, tím bude chyb méně.

Lepší online C kompilátor w3schools C kompilátor — hlásí chyby.