SORU
17 EKİM 2013, PERŞEMBE


Nasıl main() C çalışma yöntemi?

Ana yöntem yazmak için iki farklı imza var biliyorum

int main()
{
   //Code
}

veya komut satırı bağımsız değişkeni işlemek için, o yazmış olduk

int main(int argc, char * argv[])
{
   //code
}

C yöntemi aşırı yükleme yapabiliriz biliyorum ama C derleyici main fonksiyon bu iki farklı imzalar ele?

CEVAP
17 EKİM 2013, PERŞEMBE


C dilinin bazı özellikleri ile iş başına gelen kesmek olarak başladı.

Temel olarak değişken uzunlukta argüman listeleri için birden çok imza o özelliklerinden biridir.

Programcılar bir işlev için ek argümanlar geçer fark ettim, ve hiçbir şey kötü veya kendilerine verilen bir derleyici ile olur.

Bu ise arama kuralları böyle ise böyledir:

  1. Çağıran işlev bağımsız değişkenleri temizler.
  2. En soldaki tartışmalar sahte argümanları ele geçersiz kılmaz, böylece çerçeve yığının tabanına yığının üstüne, ya da daha yakın.

Bu kuralı hangi kuralları çağıran bir dizi yığın tabanlı parametre arayan babalık sayede geçen argümanlar ve sola doğru itti:

 ;; pseudo-assembly-language
 ;; main(argc, argv, envp); call

 push envp  ;; rightmost argument
 push argv  ;; 
 push argc  ;; leftmost argument ends up on top of stack

 call main

 pop        ;; caller cleans up   
 pop
 pop

Çağırma bu tür bir durumda derleyici, özel bir şey yapılması ** 12 veya başka türlü bile iki tür destek gerekiyor. main Bu durumda yığına itilmiş öğeleri bihaber olduğunu tartışmıyoruz, bir sonucu olabilir. Eğer iki değişken bir fonksiyonu ise, o zaman iki üstteki gibi argc argv öğeler yığını bulur. Eğer bir platforma özel üç bağımsız değişken ile bir ortam işaretçisi (ortak uzantısı), ise yarar da: olur bulmak bu üçüncü değişken olarak üçüncü öğeden üste yığın.

Ve bu yüzden sabit bir telefon tüm durumlarda, start-up sabit tek bir modül programı ile bağlantılı olduğu için izin çalışır. Bu modül C, fonksiyon olarak benzeyen: yazılmış olabilir

/* I'm adding envp to show that even a popular platform-specific variant
   can be handled. */
extern int main(int argc, char **argv, char **envp);

void __start(void)
{
  /* This is the real startup function for the executable.
     It performs a bunch of library initialization. */

  /* ... */

  /* And then: */
  exit(main(argc_from_somewhere, argv_from_somewhere, envp_from_somewhere));
}

Diğer bir deyişle, bu başlangıç modülü sadece üç bağımsız değişken bir ana, her zaman arar. Eğer ana tartışma yok, ya da sadece int, char **, sürerse eğer herhangi bir argüman, arama kuralları nedeniyle alırsa iyi olduğu için iş başına gelir.

Eğer programınızda böyle bir şey yapmak olsaydı, ve ISO C tarafından tanımsız davranış nonportable düşünülebilir: bir şekilde, ve başka bir tanımlama. bir işlev bildirmek arıyorum Ama bir derleyici başlangıç hile taşınabilir olması gerekmez; taşınabilir programlar için kurallar tarafından yönlendirilir.

Ama arama kuralları iş böyle olamaz, böyle olduğunu varsayalım. Bu durumda, derleyici main özel olarak tedavi etmek için vardır. main işlevi derleme olduğunu fark ettiğinde, ki, üç bağımsız değişken bir çağrı ile uyumlu olan kod üretebilir.

Yani, bu şöyle olur:

int main(void)
{
   /* ... */
}

Ama derleyici bunu gördüğünde, derler işlevi bu gibi görünüyor ki aslında bir kod dönüşüm gerçekleştirir:

int main(int __argc_ignore, char **__argv_ignore, char **__envp_ignore)
{
   /* ... */
}

isimleri dışında __argc_ignore tam anlamıyla yok. Böyle bir isim kapsamı içine tanıtıldı ve kullanılmayan değişkenleri hakkında herhangi bir uyarı daha olmayacak. Kod dönüşümü derleyici üç bağımsız temizlemek zorunda olduğunu biliyor, doğru bağlantı ile kod çıkarmasına neden olur.

Başka bir uygulama stratejisi derleyici ya da belki linker için-oluşturmak özel __start işlev (ya da adı her neyse), ya da en azından önceden derlenmiş çeşitli alternatifler arasından birini seçmektir. Bilgi kullanılan nesne hakkında dosyada depolanmış olabilir. Linker bu Bilgi bak, ve programın tanımı ile uyumlu olan 25 ** bir çağrı içeren start-up modül doğru sürümünü seçin. C uygulamaları genellikle bu yaklaşım mantıklıdır main desteklenen formlar sadece küçük bir numarası vardır.

Derleyiciler için C99 dil her zaman için tedavi main özel olarak, belli ölçüde, destek kesmek eğer işlevi sona erer olmadan bir return deyim, davranış gibi return 0 idam edildi. Bu, yine, bir kod dönüşümü ile tedavi edilebilir. Bir fonksiyon main adlı derleyici bildirimleri derleniyor. Vücudun sonunda potansiyel olarak erişilebilir olup olmadığını denetler. Eğer öyleyse, bu bir return 0; ekler

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bryan Adams

    Bryan Adams

    30 Mart 2006
  • ehowhome

    ehowhome

    22 NİSAN 2009
  • FF Radioo

    FF Radioo

    14 ŞUBAT 2007