Nauka C++ | dlaczego nie można wywołać funkcji, która jest niżej?

Pytania i problemy
velinozarus
velinozarus
#include 
 
void funkcja1() {
    std::cout << "funkcja 1";
    funkcja2();
}
 
void funkcja2() {
    std::cout << "funkcja2";
}
 
 
int main() {
    std::cout << "main" << '\n';
    funkcja1();
    return 0;
}

dlaczego nie można wywołać funkcja2 w funkcja1? przecież program wykonuje się linijka po linijce, a ja wywołałem funkcja1 w main, przecież wtedy funkcja2 już istniała.

znam rozwiązanie tego problemu, ale chodzi o to dlaczego tak się dzieje.

bopke
bopke Moderator forum.lvlup.pro

kompilator czyta plik od góry - pojawia się include, więc analizuje includowane pliki. Tam dowiaduje się on o istnieniu m.in. funkcji std::cout. Potem, gdy skończy analizować ten include, przechodzi do następnej linijki. trafia na początek funkcji funkcja1 - ok, ona już istnieje w analizie. Czyta dalej, trafia na std::cout - spoko, już znamy. I wtedy nagle wpada na jakieś tajemnicze wywołanie funkcja2 - łolaboga, ale czegoś takiego nie widziałem! STOOOP

Możesz temu zapobiec najpierw niejako zapowiadając funkcję, pisząc samą jej deklarację bez ciała, w Twoim wypadku wyglądałoby to tak

#include 
 
void funkcja2();
 
void funkcja1() {
    std::cout << "funkcja 1";
    funkcja2();
}
 
void funkcja2() {
    std::cout << "funkcja2";
}
 
 
int main() {
    std::cout << "main" << '\n';
    funkcja1();
    return 0;
}

W ten sposób mówisz kompilatorowi, że takie coś jak funkcja2 istnieje i może się tego spodziewać później :)

velinozarus
velinozarus

bopke:

Możesz temu zapobiec najpierw niejako zapowiadając funkcję, pisząc samą jej deklarację bez ciała

velinozarus:

znam rozwiązanie tego problemu, ale chodzi o to dlaczego tak się dzieje.

bopke:

przechodzi do następnej linijki. trafia na początek funkcji funkcja1 - ok, ona już istnieje w analizie.

a dlaczego funkcja1 nie widzi funkcja2? przecież funkcja2 też jest też odczytana przez kompilator.

bopke
bopke Moderator forum.lvlup.pro

funkcja2 jest niżej w tym pliku, kompilator nie zdążył do niej dotrzeć, a Ty juz wywołujesz tę funkcję. Z punktu widzenia kompilatora próbujesz wywołać jakieś tajemnicze funkcja2, które nie istnieje, jeszcze do niego nie dotarł. on nie idzie zgodnie z flow programu (znajdź main, znajdź pierwszą wywoływaną funkcje, znajdź drugą itd.) tylko po prostu po linijce aż trafi na coś czego nie widział nigdy, wtedy krzyczy

system
system

Ten temat został automatycznie zamknięty 32 dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe.