FizWeb

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