Aşağıdaki "C" kodunu göz önünde bulundurun:
#include<stdio.h>
main()
{
printf("func:%d",Func_i());
}
Func_i()
{
int i=3;
return i;
}
Func_i()
kaynak kodun sonunda tanımlanır ve kullanılmadan önce hiçbir bildirim yapılmaz main()
. Derleyicinin gördüğü Func_i()
anda main()
, çıkar main()
ve bulur Func_i()
. Derleyici bir şekilde döndürülen değeri bulur Func_i()
ve verir printf()
. Ben de derleyici bulamıyorum biliyorum dönüş türü arasında Func_i()
. Bu, varsayılan (tahmin?) Alır dönüş türü arasında Func_i()
olmak int
. Eğer kod o float Func_i()
zaman derleyici hata verirdi: Çakışan türleri içinFunc_i()
.
Yukarıdaki tartışmadan şunu görüyoruz:
Derleyici döndürülen değeri bulabilir
Func_i()
.- Derleyici , kaynak koddan
Func_i()
çıkıpmain()
kaynak kodunu arayarak döndürülen değeri bulabilirse, neden açıkça belirtilen Func_i () türünü bulamıyor ?
- Derleyici , kaynak koddan
Derleyici
Func_i()
float türü olduğunu bilmelidir - bu yüzden çakışan türlerde hata verir.
- Derleyici bunun
Func_i
float türünde olduğunu biliyorsa, neden halaFunc_i()
int türünde olduğunu varsayıyor ve çakışan türlerde hata veriyor? Neden zorlaFunc_i()
yüzer tip yapmak için yapmıyoruz .
Değişken beyanında da aynı şüphe var . Aşağıdaki "C" kodunu göz önünde bulundurun:
#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;
Derleyici şu hatayı verir: 'Data_i' bildirilmemiş (bu işlevde ilk kullanım).
- Derleyici gördüğünde
Func_i()
, Func_ () tarafından döndürülen değeri bulmak için kaynak koduna iner. Derleyici Data_i değişkeni için neden aynısını yapamıyor?
Düzenle:
Derleyicinin, montajcının, işlemcinin vb. İç işleyişinin ayrıntılarını bilmiyorum. Sorumun temel fikri, kullanımdan sonra, kaynak koddaki işlevin dönüş değerini söylersem (yazar) "C" dili bilgisayarın bu değeri herhangi bir hata vermeden bulmasını sağlar. Şimdi neden bilgisayar türü bulamıyor? Veri_i türü neden Func_i () 'nin dönüş değeri bulunamadığı için bulunamadı. İfadeyi kullansam bile extern data-type identifier;
, bu tanımlayıcı (işlev / değişken) tarafından döndürülecek değeri söylemiyorum. Bilgisayar bu değeri bulabilirse, neden türü bulamıyor? Neden ileri bildirime ihtiyacımız var?
Teşekkür ederim.
Func_i
geçersiz beyanını yapmıştır . Tanımlanmamış değişkenleri dolaylı olarak bildirmek için hiçbir kural yoktu, bu nedenle ikinci parça her zaman hatalı biçimlendirildi. (Evet, derleyiciler ilk örneği kabul eder, çünkü özensiz ise, C89 / C90 altında geçerlidir.)