Header tiedostot

TribaKalle

Hei, olen pitkään tehnyt C ohjelmat siten että on main.cpp tiedosto ja sitten kaikki muut osa alueet jaettu xxxxx.cpp ja xxxxx.h tiedostoihin.

Mutta nyt törmäsin erään pelin lähdekoodiin jossa päätiedosto oli .cc päätteinen (ilmeisesti jotain C# tai vastaavaa tarkoittaa), tämän lisäksi muut osa-alueet olivan PELKÄSTÄÄN .h tiedostoissa, eli funktoiden määrittelyiden lisäksi myös itse funktiot samassa tiedostossa.

Tämä näyttää erittäin selkeältä ja nopealta tavalta mutta kun itse tekee tuolla tapaa ei kääntäjä osaa kääntää koodia, vaan valittaa että header tiedostoissa määritellyt funktiot eivät löydy mistään.

Onko tämä siis nykypäivinä edes mahdollista, minusta olisi vaan tavattoman selkeää lisätä koodit yhteen header tiedostoon sen sijasta että kirjoitat (melkein) samat asiat kahdesta .cpp ja .h tiedostoihin?

15

927

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Tarkoittaa sitä, että peli on koodattu päin helvettiä ja tuollainen on niin sanotusti ongelmien kerjäämistä. Onpas hauskaa jos (kun) tarvitsevat käyttää ristiin osia ja samoja tiedostoja liitetään includella niin käännösaika räjähtää helposti käsiin ja muuta hauskaa. Ei C:tä eikä C :aa ole niin tarkoitettu käytettäväksi. Sitä varten on muita kieliä kuten vaikka Java.

      • wizses125

        Paitsi että header tiedostoissa käytetään #ifndef #endif systeemiä niin niitä ei tarvitse kääntää moneen kertaan joten käännösaika ei muutu miksikään.


      • wizses125 kirjoitti:

        Paitsi että header tiedostoissa käytetään #ifndef #endif systeemiä niin niitä ei tarvitse kääntää moneen kertaan joten käännösaika ei muutu miksikään.

        Itseasiassa kyllä kasvaa ja paljon kun joutuu käymää kaikki läpi aina vähintään kerran.


      • Mee neuvoon sit

        Kirjastofunktio pitää ensinnäkin esitellä jossain ja toisaalta määritellä. Tästä on oiva esimerkki standardi-c:n kaikille vähänkin ohjelmoineille tuttu ja tuiki tarpeellinen ”math.h”. Nyt te ette ole kyllä yhtään jyvällä standardista(kaan) c: n syntaksista.


      • Mee neuvoon sit kirjoitti:

        Kirjastofunktio pitää ensinnäkin esitellä jossain ja toisaalta määritellä. Tästä on oiva esimerkki standardi-c:n kaikille vähänkin ohjelmoineille tuttu ja tuiki tarpeellinen ”math.h”. Nyt te ette ole kyllä yhtään jyvällä standardista(kaan) c: n syntaksista.

        Tietysti pitää. Sitä varten ne otsikkotiedostot ovat. Se koodi sitten pidetään siitä erillään.


      • On ja ei oo noin
        M-Kar kirjoitti:

        Tietysti pitää. Sitä varten ne otsikkotiedostot ovat. Se koodi sitten pidetään siitä erillään.

        Jossä teet siitä tuolla tavalla kirjaston, siitä ei tule mitään: vain atk-jumala voi tietää, missä määrittelysi ovat.


      • ICT-Piru
        On ja ei oo noin kirjoitti:

        Jossä teet siitä tuolla tavalla kirjaston, siitä ei tule mitään: vain atk-jumala voi tietää, missä määrittelysi ovat.

        Ei sitä sorsa-tiedostoa (eli 'määrittelyä') tarvitse olla edes koko koneella, riittää että on header ja linkitettävä binääri ko. kirjastosta. Ei taida sulla olla homma ihan hallussa.


      • ICT-Piru kirjoitti:

        Ei sitä sorsa-tiedostoa (eli 'määrittelyä') tarvitse olla edes koko koneella, riittää että on header ja linkitettävä binääri ko. kirjastosta. Ei taida sulla olla homma ihan hallussa.

        Aivan.


      • Näin se on
        M-Kar kirjoitti:

        Aivan.

        Senkin atk-pölkkypäät: avaja puhuu kirjastoista, joita hän on tuomassa koneelleen. Ei ole vielä mitään käännöksiä siitä eikä linkityksiäkään.


      • ICT-Piru
        Näin se on kirjoitti:

        Senkin atk-pölkkypäät: avaja puhuu kirjastoista, joita hän on tuomassa koneelleen. Ei ole vielä mitään käännöksiä siitä eikä linkityksiäkään.

        Sen verran sekavia ovat sepustukset, ettei oikein saa selvää mistä puhutaan.

        Mutta EI OLE sellaista sääntöä että kirjaston varsinainen toteutus eli lähdekoodi (.c, .cpp, .cc) PITÄÄ olla koneella. Header binääri riittää ja tämä on se ylivoimaisesti yleisin tapa tuoda kirjasto koneelle. Joskus toki kirjasto käännetään itse, kun valmis käännös puuttuu tai halutaan vaikkapa uudempi versio. Tällöin on tulisi olla mukana jonkin projektisysteemin tiedosto(t), jotta ne lähdekoodit löytyy käännöstä varten.

        Harvallapa esimerkiksi tuosta "math.h"-kirjastosta on koneella lähdekoodeja, eivätkä ole edes saatavilla kaikille kääntäjille.


      • Homma atk-hanskassa
        ICT-Piru kirjoitti:

        Sen verran sekavia ovat sepustukset, ettei oikein saa selvää mistä puhutaan.

        Mutta EI OLE sellaista sääntöä että kirjaston varsinainen toteutus eli lähdekoodi (.c, .cpp, .cc) PITÄÄ olla koneella. Header binääri riittää ja tämä on se ylivoimaisesti yleisin tapa tuoda kirjasto koneelle. Joskus toki kirjasto käännetään itse, kun valmis käännös puuttuu tai halutaan vaikkapa uudempi versio. Tällöin on tulisi olla mukana jonkin projektisysteemin tiedosto(t), jotta ne lähdekoodit löytyy käännöstä varten.

        Harvallapa esimerkiksi tuosta "math.h"-kirjastosta on koneella lähdekoodeja, eivätkä ole edes saatavilla kaikille kääntäjille.

        Avaaja tuo sorsia koneelle: pitää kertoa kääntäjälle, missä otsikkotiedostot (*.h, *.hpp) ja missä määrittelyt (*.c, *.cpp) ovat. Ensimmäisen käännöksen jälkeen kääntäjälle tarvitsee jokaisen käännöksen aikana kertoa, missä otsikkotiedostot (*.h, *.hpp), koska kääntäjä tietää, että ohjelmoijan määrittelyt (sorsat) ovat siinä ohjelmointieditorissa apposen auki eikä niitä tarvitse mistään etsiä, mutta tämä on vasta puoli atk-ruokaa. Kertokaas ohjelmoijat, miten homma siitä eteenpäin menee, jos aikoo jonkin tekkeleistään kääntymään ajokelpoiseksi sovelukseksi? Pidettäköön ajokelpoisena soveluksena sellaista, jonka voi resurssienhallinnasta tuplahiirenklikkauksella käynnistää, vaikka sen jälkeen tulisikin käsittämättömiä ajonaikaisia virheitä ja ylivuotoja ja tietokone käynnistyisi sen jäljestä itsestään vikasietotilassa.


    • jksadlkjdsaljasdlkas

      .cc-pääte tarkoittaa samaa kuin .cpp-pääte.

      Se #include "joku-tiedosto.h" lisää vain yksinkertaisesti kyseisen tiedoston sisällön siihen kohtaan koodia. Ei mitään tarkistuksia tai muuta monimutkaista. Ja siksipä siihen käy mikä vaan: #include "foo.cpp" #include "joku.txt".

      Siis on mahdollista työntää tiedostot kaikki includen avulla samaan läjään, jolloin käännöksestä tulee vain YKSI .o-tiedosto. Tämä on hölmöä, sillä pikku muutos yhteen tiedostoon ja kaikki joudutaan kääntämään (ison projektin kääntäminen kestää minuutteja). Ja static-määreellä ei enää merkitystä... Varmaan muitakin ongelmia.

      • Kyllähän tää 70-lukulainen kääntöjärjestelmä alkaa olla aikansa elänyt mutta valitettavasti sitä käyttävät kielet ei ole.

        Kuitenkin, ihan turhaa siitä on valittaa ja tehdä koodi päin persettä. Tuo koodin jakaminen erillisiin otsikko ja kooditiedostoihin on kuitenkin pieni vaiva siinä kaikessa mitä koodin tekemisessä tarvitsee tehdä. Ja jos se on olevinaan suuri vaiva niin sitten kannattaisi miettiä, että onkohan editori ihan varmasti hanskassa.


    • dx

      C :ssa on sellainen huono puoli, että jos käytät templateja (joka on C :n versio genericseistä), pitää kyseinen koodi pistää otsikkotiedostoon. Tämä johtuu siitä, että koodi pitää olla käännösyksikön tiedossa silloin kun sitä templatea lähdetään instantioimaan. Voisiko kirjastosta suurin osa olla jotain templateja?

      • FireOfFeenix

        Valitettavasti c on lähes kaikki mahdollista. Siksi kai syntyi java ja C#, jotka poistavat header tiedostojen käytön ja poistavat kaikki ne hyvät tai huonot ominaisuudet, joita C mihin tahansa melkein pystyvässä maailmassa on. Paitsi muuten, en saanut Visual Basicin syntaksia täydellisesti toimimaan c :lla, vaikka taiteilin macroilla vaikka mitä. Melkein kaikki muu onnistui paitsi if lauseet toimivat c :ssa Visual Basicin syntaksilla. Kokeilkaa joskus ja miettikää sen jälkeen, onko uusia lähdekoodeja ottaessa oikeasti muuta mahdollisuutta kuin tutustua koodiin, jos haluaa sen toimivan jatkossa omalla koneella. Kaikissa tuntemissani lähdekoodeissa on ollut aina jotain outoa ja kummallista - ja aina niissä on joutunut lyömään päätään seinään, ennen kuin on saanut ne toimimaan. Tuo yllä kuvattu esimerkki on arkipäivää.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. On tiedossa, että venäjämieliset diggaavat diktatuurista venäjää

      jossa ei esim. ole sanan- ja lehdistönvapautta. Mutta keitä nämä venäjän palvojat sitten ovat, ei heitä toki paljon ole
      Maailman menoa
      48
      2519
    2. Vihreiden, SDP:n ja Vasemmistoliiton kannattajista selvästi alle puolet on miehiä

      ja silti joku punafeministi valitti kokoomuksen naiskannattajien puutteesta, vaikka siellä on enemmän naisia kuin punavi
      Maailman menoa
      74
      2507
    3. Belfastissa käynnissä kunnon persuilu

      Joku random mamu tekee rikoksen, niin sikäläiset naamiopersut kostavat tuhoamalla kantaävestön omaisuutta. Liekö siellä
      Maailman menoa
      73
      2382
    4. Ensin Henry Novak ja nyt sitten se Irlannin tapaus

      jossa mustaihoinen afrikkalainen mieshenkilö puukottaa valkoihoista maassa makaavaa miestä useita kertoa pään alueelle.
      Maailman menoa
      61
      2175
    5. Islamovasemmistolaisuus - tälläista termiä käytetään

      Termi tarkoittaa alunperin äärivasemmiston ja muslimifundamentalistien liittoa, jonka ytimessä oli antisemitismi. Isl
      Maailman menoa
      32
      1887
    6. Persujen kannatusromahdus tekee kesästä 2026 nautinnollisen

      Satoi tai paistoi, niin Suomen kansalaisella on kuluvana kesänä syytä hymyyn. Niin upealta tuntuu persujen kannatusroma
      Maailman menoa
      103
      1739
    7. Martina Aitolehti läpäisi Erikoisjoukot - Tilittää umpirehellisenä kuvauksista

      Martina Aitolehti selvisi Erikoisjoukot koulutuksesta. Hän myös malttoi pääosin pitää mölyt mahassaan, vaikka saikin ko
      Kotimaiset julkkisjuorut
      23
      1185
    8. Riikka runnoo! sähkön hinta +25 %, bensan hina +16 %

      Euron bensa! Tuo legendaarinen persujen vaalilupaus. Sannan hallitus pudotti sähköenergan alv:n 10 prosenttiin, Riikka r
      Maailman menoa
      7
      1034
    9. Rakastan sinua hiljaisuudessa

      Rakastan sinua hiljaisuudessa. Olisit minun tai et, olen odottanut sinua vuosisatojen ajan. Ilman sinua sydämeni on yksi
      Rakkaus ja rakastaminen
      41
      1015
    10. Eläköön kuningas, kuningas on kuollut

      Heikki Nivala kaatui kuin mies. Kavaltaja käveli juuri edelliseen toukokuun kokoukseen hankkimansa puku päällä. Eläköön
      Kemijärvi
      56
      916
    Aihe