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

Pytania i problemy
velinozarus
velinozarus
7 lat temu
#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
7 lat temu

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
7 lat temu

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
7 lat temu

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
6 lat temu

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