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.