Keresés

Új hozzászólás Aktív témák

  • buherton

    őstag

    válasz borisz1994 #6057 üzenetére

    Nem egészen. Vagyis hát nem olyan triviális. Főleg a változóknál.

    A deklaráció a fordítónak szól, vagyis ez ahhoz kell, hogy a fordító értelmezni tudja a leírtakat, de nincs közvetlen hatása a processzoron futó kódra. Azaz meg lehet írni a programot ezek nélkül, csak olvashatatlan lesz. A definíció a processzornak szól és enélkül nem futna úgy a programunk, ahogy szeretnék.

    Kezdjük az egyszerűbbel a függvénnyel.

    Ezek deklarációk:
    extern void foo(void);
    static int foo(int);
    void foo(void);
    bar(); // ez most nem függvényhívás, és ez most nagyon gonosz dolog tőlem  
    A fordítónak ezekkel jelzed, hogy ha talál egy ilyen szignatúrájú függvényhívást, amihez még nem találta meg a definíciót, akkor ne hasaljon el és a keywordnek megfelelően járjon el.

    Ezek definíciók:
    void foo(void)
    {}
    static int foo(int)
    {
    return 0;
    }
    bar()
    {
    return 0;
    }
    Leírod, hogy mit csinál a függvény. Ezzel mondod meg, hogy mit csináljon a programod.

    Változók.

    Ez deklaráció (nem is tudok többet ennél):
    extern int;
    Ugyanaz, mint a függvénynél.

    Ezek definíciók:
    int foo;
    static char foo;
    Ugyanaz, mint a függvénynél.

    Egyébként igen, a deklaráció nem jár memóriafoglalással, a definíció jár. Viszont a deklaráció csak a láthatóságot növeli, semmi más plusz dolgot nem tud, nem befolyásolja a típust, élettartamot és a tárolási osztályt sem.

    Az int mérete architektúra függő és a limits.h-ban van meg a "mérete". Tipikusan 4 bájt. Ha jól emlékszem, akkor az AVR8 esetén 2 bájt méretűek.

    [ Szerkesztve ]

    tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!

  • dabadab

    titán

    válasz borisz1994 #6057 üzenetére

    Benkő Tiborné - Benkő László - Tóth Bertalan : Programozzunk C nyelven! könyvet

    Jézusmária :)
    Inkább keress egy jó, érthető könyvet. Szerintem a klasszikus Kernighan-Ritchie "A C programozási nyelv" az elég jó (még ha az apád is lehetne :DDD ), én annak idején abból tanultam.

    Egyébként alapvetően megéretetted: a definíció az egy valaminek (változónak, függvénynek) a pontos leírása és ennek hatására a fordító meg is csinálja az ahhoz tartozó dolgokat (memóriát foglal a változónak, lefordítja a függvény kódját).
    A deklaráció meg elmondja a fordítónak, hogy van itt ez az izé és ez tulajdonképpen ilyen típusú, de valahol máshol van leírva.

    Hogy mire jó?

    Azt talán már tudod, hogy a C erősen típusos nyelv, vagyis a fordító mindig megnézi, hogy az a függvény vagy változó, amire hivatkozol, milyen típusú, mennyi és milyen típusú paramétere van - ha pedig olyasmire hivatkozol, amiről még nem hallott, akkor hibát dob.

    Amíg az egész programod egy file-ban van, ez általában nem jelent áthidalhatatlan problémát, olyan sorrendbe rakod a definícókat, hogy ha B hivatkozik A-ra, akkor A előbb legyen a file-ban, mint B. De már itt is lehet komplikáció, hiszen mi van, ha az A függvény hívja a B-t a B meg az A-t? Ilyenkor jön jól a deklaráció, hogy az ember leírja a fordítónak, hogy "majd találsz egy B függvényt, ami így fog kinézni, hogy". Ettől a fordító megnyugszik és szépen lefordítja a dolgokat, ha az ellenőrzéseken amúgy átmegy (és majd a linker lesz az, aki kétségbeesik, ha a B definíciója nincs sehol :) )

    DRM is theft

  • kovisoft

    őstag

    válasz borisz1994 #6057 üzenetére

    A többiek már leírták, hogy alapvetően jól fogalmaztad meg a deklaráció és definíció közötti különbséget, de a változóval kapcsolatos következtetésed nem helyes.A példádban az
    int pelda=0;
    és az
    int pelda;
    egyaránt definíció, mindkettő lefoglal a változónak memóriát, a különbség köztük annyi, hogy az első ad is egy 0 kezdőértéket a változónak. Ennek a változónak a deklarációja ez lenne:
    extern int pelda;
    Ez nem foglal le memóriát a változónak, csak annyit mond, hogy valahol máshol van definiálva egy pelda nevű változó, aminek int a típusa. A deklaráció tehát ahhoz kell, hogy az adott helyen tudj használni egy változót vagy függvényt, de valahol máshol kell majd definiálnod is azt.

    [ Szerkesztve ]

Új hozzászólás Aktív témák