Porkoláb Zoltán - C programozás 2017.09.25. előadás jegyzet
Porkoláb Zoltán
D.2-617
gsd.web.elte.hu
ajánlott irodalom:
Kernighan-Ritchie: The C Programming Language
[ANSI C]
1. előadás: Általános bevezető, a C nyelv története, fordítás, szerkesztés, futtatás.
2. előadás: A C programok szerkezete, alaptípusok, méretük, promóciók.
python: interpretált nyelv --> fejlesztés sebessége
C:
a.c (source)
|
V
a.o (object) ...
|_______________ _______________|
|
V
a.out
linkelés: std C library, mások által megírt dolgok
Hello world!
#include
int main(){
printf("Hello world!\n");
}
# (hashmark): preprocesszor direktíva --> megkeresi a header fájlt
return 0; //main fv végére
{}: blokk
printf() kiír a std outputra
\n spec karakter
escape sequences: \n, \t, \a, \b (backspace)
$ gcc hello.c //fordítás
$ gcc -E hello.c //kilistázza a keletkező formátumot (hosszú lista)
$ gcc -S hello.c //assembly kódot készít --> $more / $less
assembly: megfelel a gépi kódnak (becenevek) --> hardver, op.rendszertől függ
$ gcc -c hello.c //létrejön az object fájl (a hardver számára érthető az info)
//DE még nincs linkelés
$ ls
hello.o //(hello.obj windowsban)
$ gcc hello.o //a gcc felfedezi a .o-t --> nem kell fordítani, csak meghívja a linkert
$ ls
a.out
$ ./a.out //ez már lefut
//(qres directory: nem része a pathnak)
egyben:
$ gcc -o hello hello.c
hibák:
pl. nincs ; a sor végén --> köv. sornál észleli
printf helyett print --> lehetne ilyen függvény, csak a linkelésnél jön elő (feloldatlan ismeretlen referencia)
ha több forrásfájl: többféle print fv.: linker hiba ("ambiguous reference")
Ha tényleg megírom a print fv-t:
/* hello.c */
void print(char *);
int main()
{
print("Hello");
print("world");
return 0;
}
/* print.c */
#include
void print(char *par)
{
printf("%s\n", par);
}
///////////////////
printf("%s, %d", 3, "Hello");
%s format string
%d egész
%f float
%c egy karakter
a print fv-ről szólok a program elején: deklarálom (ezt csinálja a header is)
/* Nagy programokban hibajavításkor/módosításkor:
elég a külön megírt függvényt újrafordítani, a többi azt include-olja majd :)
*/
/////////////////
Fordítás:
$gcc hello.c print.c -o hello
--> ./hello futtatható fájl
--> a hello.o-t és print.o-t törli is
lépésekben:
$gcc -c hello.c // linkelés előtt megáll
$gcc -c print.c
$gcc hello.o print.o hello
//print.c változtatásakor elég az utóbbi két lépés
VAGY:
$gcc hello.o print.c hello
//C++ template --> nem lehet külön fordítási egységben (include-olni kell)
//////////////
hello.exe fájl tartalmaz mindent, másik gépen is lefut --> statikus szerkesztés
DINAMIKUS SZERKESZTÉS:
- ha pl. 100 kódban ugyanazok az include-ok szerepelnek
- csak akkor keresi meg a külső könyvtárakat, amikor futtatom (rövid kód)
- Unix: shared object: ".so" (statikus: ".o")
- windows: ".dll" (dinamikusan betölthető könyvtárak) (statikus: ".lib")
Ez nagyobb körültekintést igényel, most nem foglalkozunk vele. (kiderülhet h pl. nincs friss verzió...)
///////////
C-ben minden név egyedi!!!
--> nem lehet túlterhelni
--> pl. C++, Java... lehet, a fordító hozzárendeli a névhez a paramétereket is