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

velinozarus | 2021-02-17 10:25:42 UTC | #1

#include <iostream>

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 | 2019-08-14 23:18:19 UTC | #2

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 <iostream>

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 | 2019-08-14 23:25:56 UTC | #3

[quote=”bopke, post:2, topic:11916”]
Możesz temu zapobiec najpierw niejako zapowiadając funkcję, pisząc samą jej deklarację bez ciała
[/quote]

[quote=”velinozarus, post:1, topic:11916”]
znam rozwiązanie tego problemu, ale chodzi o to dlaczego tak się dzieje.
[/quote]

[quote=”bopke, post:2, topic:11916”]
przechodzi do następnej linijki. trafia na początek funkcji funkcja1 - ok, ona już istnieje w analizie.
[/quote]

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


bopke | 2019-08-14 23:31:02 UTC | #4

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 | 2021-02-17 10:25:49 UTC | #5

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