Ono je to trošku jinak. Prototypy funkcí můžeš mít klidně v *.c souboru na začátku. Jenže pokud funkci používáš i v jiném *.c souboru, musel bys prototyp té funkce psát v každém souboru, kde ji používáš. Proto se prototypy definují v *.h souboru a ten se pomocí include vkládá do všech *.c souborů, kde ty funkce používáš. Napšeš program :
[code]void funkce1(void)
{
char a=funkce2();
}
char funkce2(void)
{
return 7;
}
[/code]
Při překladu Ti to na řádce char a=funkce2(); bude psát, že funkce2 není definována. Je to proto, že překladač jí ještě nepřeložil, tudíž o ní neví. Proto existují prototypy funkcí napsané buď na začátku *.c souboru (pokud funkce z tohoto souboru nepoužíváš v žádné jiné části programu) nebo *.h souboru a vloženém do *.c souboru pomocí include. Překladač na začátku dostane prototypy funkcí (dozví se, že někde se bude takováto funkce vytvářet) a při překladu pak už nezáleží na tom v jakém pořadí jsou kódy jednotlivých funkcí v souboru zapsány. Na druhou stranu pokud se spleteš a necháš v programu jenom prototypy funkcí (do projektu vložíš *.h soubory, ale zapomeneš na příslušný *.c nebo *.lib soubor), Ti sice program půjde přeložit, ale linker skončí chybou, že nenašel příslušné funkce.
Jednoduše řečeno, překladač překládá soubor tak, jak ho čte a neprohledává ho dopředu. Pokud bys napsal :
[code]char funkce2(void)
{
return 7;
}
void funkce1(void)
{
char a=funkce2();
}
[/code]
pak překlad projde v pohodě i bez funkčních prototypů.
Jenže když si píšeš třeba funkce pro ovládání LCD displeje, tak chceš, abys je příště jenom vzal, vložil do projektu a všechno fungovalo. Proto píšeš funkce do zvláštního *.c souboru a do *.h souboru napíšeš funkční prototypy, případně konfiguraci pinů, kam máš displej připojený a pokud jsi šikovný, tak i způsob, jakým s displejem komunikuješ (v *.c souboru musí být použitý podmíněný překlad podle nastavení z *.h souboru) atd.
Tudíž pro kolemjdoucího : *.h soubor právě obsahuje důležité informace pro překladač, aby věděl, že někde existuje určitá funkce s určitými parametry, aby při překladu volání této funkce přeložil správně její volání (předávání parametrů apod.) i když funkci samotnou ještě nepřekládal nebo překládal v jiném souboru.
Jinak slovíčko “extern” nemá v *.h souboru co dělat, pokud je funkce součástí překladu nebo vkládané knihovny.