Hlavickove subory – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Hlavickove subory – C / C++ – Fórum – Programujte.comHlavickove subory – C / C++ – Fórum – Programujte.com

 

Tom@sQo0
Stálý člen
3. 1. 2008   #1
-
0
-

ahoj,
v hlave mi vrta jedna otazka:
NACO su prekladacu hlavickove subori? v com mu pomozu?ako sa potom vyuzivaju?
ked napr. pouzijem v programe riadok:



#include "subor.h"


tak ako kompilator program skompiluje? ved ma len hlavickovy subor k dispozicii, ktory je v podstate nanic...
podla neho potom hlada nieco ako subor.cpp, subor.c, alebo hocico take, aby nasiel zdrojovy kod? ked to tak funguje, tak preco sa rovno neinkluduje subor so zdrojovym kodom, ale "len" hlavickovy?

diky :)

Nahlásit jako SPAM
IP: 88.212.23.–
Tom@sQo
survik1
~ Moderátor
0
Posthunter
3. 1. 2008   #2
-
0
-

Kompilují se všechny cpp soubory připojené k projektu. Hlavičkové soubory urychlují kompilaci a ulehčují orientaci v kódu. Při kompilaci program zkopíruje obsah všech hlavičkových souborů do původního volaného (c,cpp), včetně souborů jako iostream.

Teoreticky si můžete zkopírovat obsah všech potřebných souborů sám, ale vznikne z toho jen bordel.

Nahlásit jako SPAM
IP: 89.102.163.–
Život je jen hra, která se nedá vyhrát.
_k_
Duch
3. 1. 2008   #3
-
0
-

To Tom@sQo : Hovori ti nieco oddeleny preklad ? Pravdaze mozes naincludovat aj *.c subor (drektiva #include funguje s hocijakym suborom (mozno ze aj s binarnym ale to som si neni isty, kedze uzitocnost includovat bin. subor je absolutne nulova ;) )
No ked naincludujes vsetky zdrojaky tak to asi moc oddelene neprelozis... A to nehovorim o definiciach vsetkych struktur, konstant a ja neviem coho...
A navyse, ako by si chcel includovat napr. zdrojak z dajakej kniznice ? Napr. WinAPI ? Ak sa ti to podari tak mi daj vedet ... ;)

Nahlásit jako SPAM
IP: 195.91.54.–
bukaj0
Věrný člen
3. 1. 2008   #4
-
0
-

Tom@sQo
<del>Jelikož překladač musíš znát</del> Jelikož by překladač měl znát definici funkce před jejím prvním použitím (aby ověřil typy atp.), a jelikož se každý serioznější projekt skládá z více oddělených souborů zdrojových kódů (aby se nemuselo po každé malé změně v jedné naprosto nedůležité funkci překládat všechno znovu), používají se hlavičkové soubory, které obsahují definice funkcí v jednotlivých souborech. Většinou, co jeden .c (resp. .cpp) soubor, to je jeden hlavičkový .h soubor.

Podívej se např. na http://www.linuxsoft.cz/article.php?id_article=704.

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
_k_
Duch
3. 1. 2008   #5
-
0
-

To bukaj : Pozor, na to aby si mohol vyuzivat dajaku funkciu nemusis ju mat deklarovanu. Compiler vacsinov vyhodi nejaky nechutny warning ale skompiluje to a ak to linker dokaze vyriesit tak je vsetko v poriadku. Skus skompilovat napr. toto:



int main()
{
printf("aaa\n");
return 0'
}

GCC povie nieco taketo: warning: incompatible implicit declaration of built-in function ‘printf’ ale program sa da skompilovat a pustit.
Deklaracie funkcii su "len" na to kontrolovanie parametrov. Praca prekladacu je nahradit "printf(x)" za "push x; call printf" ;)
(striktnejsie kompilery to mozno uplne zatrhnu, ale v prncipe by toto malo kompileru uplne satcit...)

Nahlásit jako SPAM
IP: 195.91.54.–
bukaj0
Věrný člen
3. 1. 2008   #6
-
0
-

_k_
Tím pádem u mě GCC ztrácí hodně bodů. Poopravím se tedy: Jelikož by překladač měl znát...

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Tom@sQo0
Stálý člen
3. 1. 2008   #7
-
0
-

noo po googleni som pochopil toto:

ked napr. mam kod:



#include <iostream> //obycajny hlavickovy subor obsahujici definicie funkcii a tried
int main(){
std::cout << "Hello World" << std::endl;
}

tak prekladac prelozi tento program ako jeden objektovy subor, v ktorom NIEJE prelozena trieda cout a osobitne je prelozeny subor iostream.cpp /*povedzme, ze taky je ;-) */ v ktorom su prelozene vsetky(uplne VSETKY veci, alebo len pouzite...mne z toho vyplyva, ze asi VSETKY aj nepotrebne ) veci z tohoto zdrojoveho suboru...tak vzniknu 2 objektove subory, ktore nejakym kuzlom linker spoji dohromady ;-) spravne?

a taktiez ma zaujima, ze ako zisti prekladac, ze ked inkludnem subor file.h, tak co ma osobitne prelozit? podla nazvu hlada nejaky podobny subor s inou priponou? lebo ak sa nemylim, tak v hlavickovom subore NIEJE uvedene, ze kde je subor so zdrojakom...

Nahlásit jako SPAM
IP: 88.212.23.–
Tom@sQo
yaqwsx+9
Posthunter
3. 1. 2008   #8
-
0
-

To Tom@sQo : Ano, pochopil jsi to celkem dobre

Prekladac to pozna podle toho, ze se v nem nachazi definice f-ce.A prohledava soubory co jsou v projektu a ty ktere ma prilinkove(napr. standartni knihovna, std...)

Nahlásit jako SPAM
IP: 85.160.69.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
tmi0
Věrný člen
3. 1. 2008   #9
-
0
-

To _k_ a bukaj :
jde o to ze C podle Kernighana a Richieho predbezne deklarace funcki vubec nevyzadovalo (stejne jako existovala take treba implicita navratoveho typu = int). nevim presne jak se to zmenilo s prislima standardama (predpokladam ze C99 uz to specifikovane je, ale jiste to nevim - zkus to prelozit s parametrem "-pedantic", rekl bych ze ti to nevezme) ale v C++ uz rozhodne predbezne deklarace byt musi.

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
_k_
Duch
3. 1. 2008   #10
-
0
-

To tmi : Je mi jasne ze podla standartov to na 99% neprejde, ja som len chcel poznamenat ze z technickej stranky moze byt deklaracia funkcie compileru viac-menej ukradnuta...

To Tom@sQo : Kniznice, ako napr. iostream, su vo vsetkych modernych os vacsinov linkovane dynamicky, t.z. v pamati sa tato kniznica nachadz iba raz aj ked ju vyuziva 20 programov. To ze je v nej vela tried funkcii a ja neviem coho ktore nevyuzivas ta trapit nemusi, lebo tvoj vysledny program obshuje len odkaz na tuto kniznicu a ty ked zavolas nejaku metodu napr. objektu cout, tak sa len zisti kde dana kniznica je a metoda sa zavola stade...

Da sa donutit aby to bolo vsetko napchcate v tom tvojom programe, to sa vola staticke linkovanie.

A na koniec: kompiler prelozi len to co mu povies a linker zlinkuje len to co mu povies (+ nejake std kniznice, ale da sa donutit aby ani to). Napriklad mas funkciu xyz() v subore xyz.c a pouzivas ju v abc.c. Subor abc.c v pohode prelozis ale ak vysledny objektovy kod budes chcet zlinkovat a nepovies linkeru nech sa pozre aj do (uz skompilovaneho) xyz.c tak ta posle do ... s hlaskou "undefined reference" alebo nieco take, co znamena v podstate ze nevie co ma na tom mieste v programe zavolat...

Nahlásit jako SPAM
IP: 195.91.54.–
tmi0
Věrný člen
3. 1. 2008   #11
-
0
-

To _k_ : z technickej strany by mel kompiler aspon kontrolovat typy - ovsem to muze byt spis proti preklepum, protoze pres (void*) se narve cokoli kamkoli:). ovsem zajimalo by me jak je to s pretizenejma funkcema> co treba v pripade ze jsou nejake dve funkce nerozlisitlne (ambiguous, coz nastava v pripade ze maji navzajem pretypovatelne parametry (pres stejny pocet stupnu, klidne ale s jinou narocnosti)) - vyhodi error? jestli nema prototypy tak nevim, treba vybere tu prvni dostupnou - coz tebe jako programatora muze docela stvat

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
_k_
Duch
3. 1. 2008   #12
-
0
-

To tmi : g++ pri nerozlisitelnych hadze pokial viem error (lebo oni aj ked su pretazene sa po prelozeni nevolaju rovnako a treba zistit co sa ma zavolat...)
A ked nema prototyp? No neviem, c++ kompilator to zatrhne hned a v C-cku som pretazene funkcie este nevidel. Ale ak to myslis tak ze su dostupne 2 rozne prototypy tak sa pouzije posledny pokial viem...

Nahlásit jako SPAM
IP: 195.91.54.–
tmi0
Věrný člen
3. 1. 2008   #13
-
0
-

jak je to v c++ vim, me slo o C. a ani sem nevedel (nebo sem to uz zapomel) ze v C pretizene funkce nejsou... no pak moje otazka pozbyva smyslu...

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
Tom@sQo0
Stálý člen
3. 1. 2008   #14
-
0
-

_k_:


Kniznice, ako napr. iostream, su vo vsetkych modernych os vacsinov linkovane dynamicky, t.z. v pamati sa tato kniznica nachadz iba raz aj ked ju vyuziva 20 programov. To ze je v nej vela tried funkcii a ja neviem coho ktore nevyuzivas ta trapit nemusi, lebo tvoj vysledny program obshuje len odkaz na tuto kniznicu a ty ked zavolas nejaku metodu napr. objektu cout, tak sa len zisti kde dana kniznica je a metoda sa zavola stade...


potom mi prosit ta vysvetli jednu vec: ja ked pouzivat iostream, a skompilujem program, tak mi vznikne objektovy subor, ktory sa vsak NEZLINKUJE s touto kniznicou a vytvori akoby "spustitelny subor", ktory vsak NEbude mat v sebe tuto kniznicu, ale bude spoliehat na to, ze tato kniznica je uz v pamati... spravne?

Nahlásit jako SPAM
IP: 88.212.23.–
Tom@sQo
_k_
Duch
3. 1. 2008   #15
-
0
-

On s tou kniznicou _je_ zlinkovany ale dynamicky... Ak sa tvoj program nahra do pamate, nieco , co sa vola dynamicky linker, skontroluje, ci su vsetky kniznice, ktore program potrebuje, v pamati... ak nie su tak sa nahraju.

Nahlásit jako SPAM
IP: 195.91.54.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 147 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý