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_ijest 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_inieważ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.)