otazky Flashcards
(172 cards)
Proč se programy v C rozdělují do hlavičkových souborů (.h) a zdrojových souborů (.c)?
- kvůli přehlednosti - nemusím v každém souboru .c definovat jednu funkci stále znovu, stačí její deklaraci uvést v inkludovaném souboru .h
- kvůli kompilátoru (je třeba dopředu znát deklarace funkcí a jejich návratovou hodnotu)
Jaký význam má hlavičkový soubor zdrojových souborů programu v C?
- jsou v něm popisy funkcí, funkce samotné a také proměnné, které se sdílejí napříč soubory
- hlavičkový soubor je includovaný v mainu (je třeba znát pouze použití, ne jejich přímou implementaci)
Jak probíhá překlad a linkování (sestavení) programu v C?
- preprocesor (dosazuje kusy kódu za includy, # makra, vyhazuje komentáře, spojuje řádky dohromady když tam je /). Pokud chceme spustit pouze fázi preprocessingu, přidáme přepínač -E do kompilace.
- kompilace (kompiluje – převede programátorem napsaný zdrojový kód do spustitelné .o (binární) podoby. To jsou soubory, které již obsahují binární kód. Tento kód ale není spustitelný, protože nemá vyřešené závislosti na jiné části programu (například volání funkce, která je v jiném .c souboru). Je třeba znát deklarace, vkládá jen relativní adresy.
- linkování (vkládají se absolutní hodnoty adres – proměnné a funkce, výsledkem je spustitelný program). Při kompilování do objektových souborů kompilátor neví, zda volaná funkce existuje a kde je. Použití správných adres v paměti řeší linker.
Vysvětlete rozdíl mezi překladem zdrojových souborů a linkováním programu?
- překlad vkládá jen relativní adresy, kdežto linkování vkládá již absolutní adresy
Co je to preprocesor a jaká je jeho funkce při překladu zdrojového souboru v jazyce C?
- počítačový program, který zpracovává vstupní data
- dosazuje kusy kódu a hlídá, jestli nebyl nějaký kus dosazen dvakrát (to
nelze)
Jaké znáte překladače jazyka C?
gcc, clang, tcc, icc
Jak zajistíme, že se hlavičkový soubor programu v C nevloží při překladu vícekrát?
- pomocí tzv. head guard (hlavičkového strážce)
#ifndef PRG #define PRG ...kod #endif
Popište proces vytvoření spustitelného programu ze zdrojových souborů jazyka C.
viz 3.
Jak zajistíte možnost ovlivnit výslednou podobu programu při překladu? Např. Velikost bufferu definovanou symbolickou konstantou?
- přidat přepínač -Dbufsize=1234 ( obecne : -D name=definition ) + v kódu mít něco jako #ifndef bufsize #define bufsize 4321 //vychozi hodnota #endif
Jak při překladu programu kompilátorem GCC nebo Clang rozšíříme seznam prohledávaných adresářů s hlavičkovými soubory?
- I
- gcc -Idir [options ..]
- gcc -Iproj/src myfile.c -o myfile
Záleží u kompilace programu kompilátorem GCC nebo Clang při specifikaci adresářů s hlavičkovými soubory na jejich pořadí?
- ano, např. kdybychom linkovali více knihoven.
Co způsobí definování makra preprocesoru NDEBUG v souvislosti s používáním funkce assert?
- dojde k tomu, že si přestane všímat funkce assert, tudíž program nespadne v pripade nesplneni podminky ve výrazu assert(condition)
Jaký tvar má hlavní funkce programu v C, která se spustí při spuštění programu prostředí s operačním systémem?
int main(){}
int main(int argc, char *argv[]){}
main ( int argc, char **argv ) { // code return 0; // Indicates that everything went well. }
Jakou návratovou hodnotou programu v C indikujete úspěšné vykonání a ukončení programu? Proč zvolíte právě tuto hodnotu?
- return 0;
- nula je jen jedna a také protože to značí 0 chyb
- Je taky možné použít EXIT_SUCCESS a EXIT_FAILURE ktere jsou
definované v stdlib.h
Jak předáváme parametry programu implementovanému v jazyce C?
- argumenty
- pomocí příkazové řádky (zvýší se hodnota argc a zapíše se to do argv pole)
Existuje nějaká jiná možnost jak předat uživatelské parametry programu jinak než jako argument programu?
- ano, například načíst ze standardního vstupu pomocí příkazu scanf (nebo podobných)
Jaký je rozdíl mezi staticky a dynamicky linkovaným programem implementovaným v jazyce C?
- staticky – každá část se zkompiluje samostatně a pak se spojí do jednoho
- dynamicky – operační systém si je zavolá až v momentě, kde je bude potřebovat v tom souboru, nejsou přímo zakompilované v binárce
- staticky linked program = lépe přenosný
Linkují ve výchozím nastavení překladače GCC nebo Clang statické nebo dynamické binární spustitelné soubory?
- standardní knihovny se linkují dynamicky a mé vlastní knihovny staticky
Jak vkládáme do zdrojového souboru programu v C hlavičkové soubory jiných modulů nebo knihoven?
#include (pro standardní knihovny) #include “...” (nejčastěji se používá pro vlastni knihovny)
Jaký rozdíl mezi použitím #include a #include “soubor.h”?
#include #include “hledá jak ve standardních knihovnách, tak u mě ve složce ”
Popište rozdíl mezi deklarací a definicí funkce v jazyce C?
- deklarací pouze řekneme, že zde tato funkce bude (zadáme spolu s parametry) ; Musíme určit jméno funkce, vstupní parametry a návratovou hodnotu.
– definice už je přímo celá funkce – {}
Jak jsou předávány parametry funkci v jazyce C?
- hodnota či reference se zkopíruje na stack (reference – hodnota pointeru) 2 možnosti : Pass by Value a Pass by Reference = neexistuje v cecku, pouze pass by value (pointer = integer s adresou)
Co je to literál a co tímto pojmem označujeme?
int a = 5 –> 5 je literál
Jak lze v jazyce C realizovat předání parametru funkci odkazem?
- ccko je striktně pass by value, takže nijak
- pass by reference jen emulováno pomocí ukazatelů
- Obecně: Ukazatele jsou proměnné, které uchovávají adresu ukazující do paměti počítače, kde je uložená konkretní proměnná.