Melyek a header fájlokat, hogy miért nem tud írni anélkül, hogy őket verem túlcsordulás orosz
Minden Google egy kis szünetet, nem tudom megérteni. És Wikipedia olvasni, és általában semmit olvasni. Tényleg nem értem.
Mi akadályozza, hogy csatlakoztassa a .cpp fájlokat?
Nos akasztott rá kétszer, nos, a fordító csak egyszer, és összeköti mindenkor ő az egyik fene minden egy fájlba, mintha minden összetapadnak, így az első kapcsolatot, hogy a többi felett, és látni fogjuk őket az alján. Hagyja ideje figyelte a változásokat, és újrafordítani csak megváltozott. Hagyja automatikusan generálja, és csatolja a fejléc fájlokat az interfész leírása az előre lefordított bináris. itp
Éppen ezért a házimunka generálásának fejléc fájlokat, nem automatizált, és rendelt a fejlesztő? Végtére is, mellette a fordító lefordított bináris könnyen generálhat maga leírják az interfészeket fájlt (amit kapott szkennelés cpp fájl).
Akkor áll elő olyan helyzet, amelyben van egy probléma használata nélkül header fájlokat? Ez a legjobb magyarázat.
megállapított január 30 at 05:03
A probléma abban rejlik, hogy a visszafelé kompatibilitás.
Nézd, minden új programozási nyelv - igen, még Pascal, nem is beszélve a Java vagy C # - nem kell header fájlokat. Kétségtelen, hogy a C ++ is lehetett volna nélkülük. Mi a helyzet?
Gyors előre fél évszázaddal ezelőtt, 1972-ben. Képzeljünk el egy fordítóprogram C.
Tegyük fel, hogy szeretne írni egy fordító design. Nem tudjuk összeállítani az egész program egy időben, már csak nincs elég memória. Számítógépek akkor kicsik voltak, és lassú. Azt akarjuk, hogy állítson össze egy programot apránként, néhány olyan időpontban funkciókat.
Azonnal felveti azt a problémát, hogyan állítsák össze az f függvény. amely utal a másik funkció g. Szükségünk van egy külön leírást a többi funkció. Tudtuk, persze, olvassa el az összes forrás fájlokat először határozza meg, hogy milyen funkciók van, majd olvassa el a második alkalommal, és összeállítja egyesével. De nem volt túl nehéz és lassú, szükséges volt elemezni a meghatározása a funkciók kétszer, egyszer kidobni az eredményt! Ez elfogadhatatlan fogyasztás CPU idő! Plusz, ha szem előtt tartani a meghatározása minden funkció ismét nem volt elég memória.
Dennis úgy döntött, akire bízza a komplex probléma a feladatok szétválasztása leírja annak végrehajtását, és csak az a szükséges definíciók összeállításakor ezt a funkciót? Us, a programozók. Úgy döntött, hogy meg kell tennie, hogy segítsen a fordítóprogram és skopipastit függvénydefiníciókat egy külön fájlban, és a fordító is, amely fájlokat kell definíciók. (Azaz, az első válogatás lépés rendelt minket.)
Ez radikálisan egyszerűsíteni a fordító, de vezetett viszont a problémákat. Mi történik, ha már elfelejtette, hogy csatlakoztassa a megfelelő header fájlt? Válasz: a fordítási hibát. Mi történik, ha a szöveg értelme a header file függően változik minden makrót? V: A fordítóprogram „buta”, és nem próbálja meg felismerni ezt a problémát, mert eltolja a felelősséget ránk.
Abban az időben a nyelvi fejlődés ez volt a helyes döntés. A fordítóprogram lesz praktikus, gyors, és a programozók nem idegenkedtek, hogy segítsen összeállítani. Nos, ha valaki hibázott, ő volt a hibás.
Rewind az órát 1983-ban. Bjarne teremt a C ++. Úgy döntött, hogy vegye le a hullám népszerűsége a C nyelv, és elfogadta a C modell összeállítás néhány fordítási unit'ami és a kapcsolódó kérdésekről közvetlenül C. Ugyanakkor az első változata a C ++ egyszerűen preprotsesoorom C nyelven! Ezért külön fordítási problémákat költözött C C ++. Rosszabb, adtunk új problémákat. Például osztály sablonok jelennek osztályba, de nem termelnek a tárgykód saját maguk által, így kell menni a trükköket, és ne a hiányosságokat külön összeállítás (például azáltal, hogy a végrehajtás fejléc és trükkök linker) rendszer.
Van azonban egy moduláris felépítés C ++, ami segítségével a programozók megszabadulni a fél évszázados örökségét. Egyelőre nem valósították meg, és benne van a komplexitás a tervezési szinten (pl header'e definiáltuk makrók, hogy ez lesz látható, ha haladunk a header'ov a modulok?) Remélem, hogy a jövőben a nyelvi fejlesztők továbbra is képes legyőzni az inverz probléma kompatibilitás.
1), akkor adjon meg egy sor fordító cpp fájl 2) csatlakoztassa egymáshoz rögzítve #include „file.cpp” 3), ha a fájl duplikált kapcsolatban ő nem csatlakozik a második alkalommal 4) Ha összeállítására külön, majd együtt otkompiirovannym binárisok automatikusan létrehozott header fájlt, amely tartalmazza a leírás a felületet, hogy kitépi a cpp fájl a kódot. 5) Ezért a fordító döntéshozók még nem tette meg? Miért kényszeríti a kezét, hogy létrehoz fejlécek? - Maxmaxmaximus január 30 at 05:45
Éppen ezért a házimunka generálásának fejléc fájlokat, nem automatizált, és rendelt a fejlesztő? Végtére is, mellette a fordító lefordított bináris könnyen generálhat maga leírják az interfészeket fájlt (amit kapott szkennelés cpp fájl) - Maxmaxmaximus január 30 at 05:48
Ismét olvasott a fordítási egység. Amikor össze cpp fájl, a fordító nem tud semmit a többi cpp fájl (már összeállított ha volt). Ami a „házimunka generálásának header fájlok”. Általában, ha írásban programok, először gondolni a felület (.h write), majd írd csak a végrehajtás (.cpp) - Krepver január 30 at 05:55
Mi akadályozza, hogy csatlakoztassa a .cpp fájlokat?
Az információk hiánya a fajta, kívülről hozzáférhető.
A fordító alakítja forrásfájlok (.c és .cpp) a tárgy fájlok (.obj bevarrottan az összekötő egyetlen .exe vagy .dll fájlt.) - „félkész” - „fekete doboz”, importáló és exportáló szimbólumok.
A szimbólum, viszont - egy sor „függvény neve / változó - az eltolás a kezdetektől az objektum fájlt.” Importálása - ez a függés az objektum fájlt (ez nem számít, ha azok végrehajtása, csak a nevét a véletlen szükséges); export -, hogy ez a fájl végrehajtását.
Így az objektum fájlok nem tartalmaznak adattípusok, és más absztrakciók, amelyek csak a képzelet a fordító. Csak a gépi kód és az adatok meglévő valós térben elkülönített RAM, és a kulcsszó címkéket.
Sajnos csak a tudás neve nem elegendő a kialakulását import (függőség). A fordító tudnia kell a szerkezet bonyolultabb típusok generálni a megfelelő ellentételezés a verem, helyezze további hívások a konstruktőrök / destruktor végre implicit típusátalakítások, ellenőrizze a helyességét a hívást, és így tovább. D.
Miért van az típusainak leírása nincs beágyazva megvalósításának célja a fájlt? Egy és ugyanaz az adat típusát lehet használni bármilyen helyek száma, hanem azért, mert az ilyen behelyezés megsérti a definíció szabályt. E szabály értelmében, minden egység csak akkor egyetlen forrása (az objektum fájl), úgy, hogy az elrendezés nem volt a bizonytalanság összehasonlításakor import és export.
Nos, a fordító csak egyszer, és összeköti mindenkor ő az egyik fene minden egy fájlba, mintha minden összetapadnak, így az első kapcsolatot, hogy a többi felett, és látni fogjuk őket az alján.
összeszerelés program C és C ++ történik két szakaszban történik.
A fordító átalakítja minden forrás fájlt (.c és .cpp), hogy az objektum fájl (.obj). Ezen kívül minden forrás akta, függetlenül attól, hogy az egyik az univerzumban, és senki rajta kívül nem létezik többé. Ebben a szakaszban a fordító nem lát más objektum fájlok. de kénytelen volt, hogy a végső gépi kódot. Ezt a megközelítést választott nyelven fejlesztők számára, hogy képes legyen a párhu- összeállítása.
A linker veszi a kérdéses objektum fájlok (nem számít, hogy hogyan és mikor érkeztek) kötődik az import és export, és integrálja egy végrehajtható (.exe vagy .dll fájl).
Éppen ezért a házimunka generálásának fejléc fájlokat, nem automatizált, és rendelt a fejlesztő? Végtére is, mellette a fordító lefordított bináris könnyen generálhat maga leírják az interfészeket fájlt (amit kapott szkennelés cpp fájl).
Itt egy .cpp fájlt (bevonása nélkül nem szabványos fejlécek akarták):
A fordító jeleníti meg ezt a Logger osztály szerkezetét. Nevezetesen: milyen területeken kell az osztályban, és mi a hozzáférési módosítót? Miután a végrehajtás egy osztály lehet elosztva több fájlt, pontosan úgy, ahogy egy fájl az eljárások megvalósítása több osztály.
Valószínűleg azt mondják, „leírni az osztály Logger; Itt, hogy létrehozásra került .hpp ». És mi a különbség, ha vesszük a leírását, és így a header fájlban?
Akkor áll elő olyan helyzet, amelyben van egy probléma használata nélkül header fájlokat?
és így tovább minden fájlt Foo.
Most képzeljük el, hogy minden változás osztályleírások szükség tömeges csere sok helyen. Felejtsd el, hogy rögzítse - a fordító nem mond semmit, hogy elhibázott a végleges program fog esni.
Nos akasztott rá kétszer, nos, a fordító csak egyszer, és összeköti az összes
És ha nem akarok egy időben?
Azaz tegyük fel, én keletkezik, mivel a makro halom hasonló feladatokat lát el, kisebb a viselkedésbeli különbségek határozzák meg más makrók. Így. helyett kódgenerálást tudom megváltoztatni az értékeket az állandók és csatlakoztassa az azonos cpp-fájlt egy másik cpp-fájlt. És azt akarja, hogy megtagadja ezt a lehetőséget?
A választ a január 30-án 10:13
És azt akarja, hogy megtagadja ezt a lehetőséget? - Nem, nem akarom, hogy a fájl, ha ezt tagadják vozmorzhnosti, miután a folyosón a fordító preprocessor néz változott-e vagy sem, ha változott, ez Ragasztás másodszor. - Maxmaxmaximus január 30 at 00:50
@Maxmaxmaximus, egy érdekes lehetőség. De úgy tűnik, elég drága - Függőségi fa és fészkelő mélység nagyon nagy lehet - ez indokolatlan többszörös ellenőrzését fájlokat. Valószínűleg. - Qwertiy január 30 at 14:20
@Qwertiy kap indokolatlan többszörös ellenőrzését fájlokat. - Nem, mert most más nyelvek és azt nanoszekundum működését. MAP egyszerűen egy olyan fájlt, amely akkor keletkezik, ha az első teljes összeállítása, amely leírja az összes változat az iratok és azok betartását egymást és a jazz. És) a fordító nem kell fizikailag fut végig a fájlokat és a szkennelés csak betölti a MEP fájlt a RAM és onnan a régi tanul. Nos, ez egy olyan dolog, mint egy egyszerű időben könnyen cache, és az, hogy a felmentés az összeállítói más nyelveken. - Maxmaxmaximus január 31 at 00:54
@Maxmaxmaximus, a fenti kódot a válasz ugyanaz a fájl tartalmazza háromszor (sőt, egyszer csak maga a fájl, majd duplán #include __FILE__). Ő soha nem változik, de az összes 3-szor egy összeállítás a különböző eredményeket. Mit jelent mindez a legutóbbi módosításokat? - Qwertiy január 31 at 09:07