Rozważ następujący kod „C”:
#include<stdio.h>
main()
{
printf("func:%d",Func_i());
}
Func_i()
{
int i=3;
return i;
}
Func_i()
jest zdefiniowany na końcu kodu źródłowego i nie jest dostarczana żadna deklaracja przed użyciem w main()
. Na samym czasie, gdy kompilator widzi Func_i()
się main()
, że wychodzi z main()
i dowie Func_i()
. Kompilator w jakiś sposób znajduje wartość zwróconą przez Func_i()
i podaje ją printf()
. Wiem też, że kompilator nie może znaleźć typ zwracany z Func_i()
. To, domyślnie przyjmuje (domysły?) Ten typ zwracany z Func_i()
być int
. To znaczy, jeśli kod miałby float Func_i()
to kompilator dałby błąd: Konflikt typów dlaFunc_i()
.
Z powyższej dyskusji wynika, że:
Kompilator może znaleźć wartość zwracaną przez
Func_i()
.- Jeśli kompilator może znaleźć wartość zwróconą przez
Func_i()
wyjście zmain()
i przeszukanie kodu źródłowego, to dlaczego nie może znaleźć typu Func_i (), który jest wyraźnie wymieniony.
- Jeśli kompilator może znaleźć wartość zwróconą przez
Kompilator musi wiedzieć, że
Func_i()
jest typu float - dlatego podaje błąd typów sprzecznych.
- Jeśli kompilator wie, że
Func_i
jest typu float, to dlaczego nadal zakłada,Func_i()
że jest typu int, i podaje błąd typów sprzecznych? Dlaczego nie zmusza sięFunc_i()
do tego, aby być typu float.
Mam te same wątpliwości co do deklaracji zmiennej . Rozważ następujący kod „C”:
#include<stdio.h>
main()
{
/* [extern int Data_i;]--omitted the declaration */
printf("func:%d and Var:%d",Func_i(),Data_i);
}
Func_i()
{
int i=3;
return i;
}
int Data_i=4;
Kompilator podaje błąd: „Data_i” nie zadeklarowany (pierwsze użycie w tej funkcji).
- Gdy kompilator zobaczy
Func_i()
, przechodzi do kodu źródłowego, aby znaleźć wartość zwróconą przez Func_ (). Dlaczego kompilator nie może zrobić tego samego dla zmiennej Data_i?
Edytować:
Nie znam szczegółów wewnętrznego działania kompilatora, asemblera, procesora itp. Podstawową ideą mojego pytania jest to, że jeśli powiem (napiszę) wartość zwrotną funkcji w kodzie źródłowym w końcu, po użyciu tej funkcji, wówczas język „C” pozwala komputerowi znaleźć tę wartość bez żadnego błędu. Dlaczego komputer nie może znaleźć tego typu w podobny sposób. Dlaczego nie można znaleźć typu Data_i, ponieważ znaleziono wartość zwracaną przez Func_i (). Nawet jeśli używam extern data-type identifier;
instrukcji, nie mówię, że wartość ma być zwracana przez ten identyfikator (funkcja / zmienna). Jeśli komputer może znaleźć tę wartość, to dlaczego nie może znaleźć tego typu. Dlaczego w ogóle potrzebujemy deklaracji terminowej?
Dziękuję Ci.
Func_i
nieważności. Nigdy nie istniała reguła, aby pośrednio deklarować niezdefiniowane zmienne, więc drugi fragment zawsze był zniekształcony. (Tak, kompilatory nadal akceptują pierwszą próbkę, ponieważ była poprawna, jeśli była niechlujna, pod C89 / C90.)