Keresés

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

  • buherton

    őstag

    válasz emvy #4817 üzenetére

    Oké :) .

    a[i] = i++;

    Mit eredményez?

    char foo[3] = "bar";

    Mi lesz a tömbben?

    char *string = "foo bar";

    Miért nem módosítható pl. az első elem? Egyáltalán lefordul? Ha igen/nem miért?

    typedef struct foo *BAR;

    struct x
    {
    char c;
    BAR ptr;
    };

    Lefordul?

    struct x
    {
    char c;
    int i;
    } foo bar;

    Lefordul? Ha igen/nem miért?

    Az enum teljesen mértékben portábilis?

    Az elsőről már hallottam, de még soha nem használtam (nem kellett még). Bevallom derekasan a középsőről nem hallottam még. Az object (.o) fájl (és mellé kerülnek egyéb fájlok, mint pl. a nagyon hasznos .lst is) a következő lépcső a preprocesszált fájl után, ami gyakorlati értelembe vett fordtási szakasz. A header fájlok alapján kívülről elérhetők az egyesek függvények, tömbök, változók, és egyéb szimbólumok, amit majd később a linket fog összekötözgetni. A linker már teljesen független a nyelvtől. Szimbólumokat kötözgeti össze és közben persze figyelembe veszi az egyéb fordítónak szóló utasításokat, amivel mondjuk linkelés során tovább lehet optimalizálni, függvényeket elhelyezni a memóriatérben, összecsomagolja pl. a struktúrákat (__attribute__(packed)) stb... Kimenete a bináris/hex (Intel, Motorola, stb...), .map (memória térkép, meg lehet nézni hogy az egyes függvények és társaik hol találhatók), .elf (debuggoláshoz kell). Azt tudni kell, hogy a forítás során utasítani lehet hogy az egyes program blokkokat egy egységként kezelje, aminek az eredménye, hogy a szorosan összetartozó object fájlokat már a fordítás során összelinkelni .a-fájlá. Az optimalizálás hatékonyabb, hogy ha két körösen fordítunk, ahol az első körben csak kielemzi az optimalizálási lehetőséget, majd második körben további optimalizációs lehetőségeket keres, majd fordít. Bár a tudásom megkopott, mert jó ideje nem kellett ezzel foglalkoznom.

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

Hirdetés