Hirdetés

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

  • buherton
    őstag

    Sziasztok. Nemrég kezdtem el olvasni a Benkő Tiborné - Benkő László - Tóth Bertalan : Programozzunk C nyelven! könyvet. A könyv az elején felhívja a figyelmet a deklaráció és a definíció közti különbségre és arra is hogy a kezdők könnyen összekeverik a kettőt (teljesen jogosan :) ) Sajnos nem tudtam teljesen megérteni. Ha jól sejtem a lényegi különbség a memóriafoglalásban van.
    Ha jól értem ez definíció:
    int pelda=0;
    Ez értelemszerűen lefoglal valamekkora (2 byte?) memóriát.
    Én a deklarációt úgy értelmeztem hogy ezzel adjuk meg egy név tulajdonságait (típus, láthatóság, tárolási osztály, élettartam) és nem jár memóriafoglalással.
    Így kellene kinézzen?
    int pelda;
    Kérem valaki világosítson fel hogy hol rontom el az értelmezést. Miért fontos a kettő közötti különbség?

    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.

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