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é:
| 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:
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.
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:
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.