SORU
13 Mayıs 2009, ÇARŞAMBA


C fonksiyonları üzerinde dış anahtar etkileri

C extern anahtar işlevi bildirimi önce kullanılan herhangi bir etkisi fark etmedi. İlk başta, tek bir dosya içinde extern int f(); tanımlarken düşündümzorlardosya kapsamı dışında bunu uygulamak için. Ancak her ikisi için de bunu buldum:

extern int f();
int f() {return 0;}

ve

extern int f() {return 0;}

gayet iyi, gcc hiçbir uyarı ile derleyin. gcc -Wall -ansi; // yorumlar kabul etmezdi kullandım.

extern kullanarak herhangi bir etkisi yokturfonksiyon tanımlar önce? Ya da bu işlevler için hiçbir yan etkisi ile sadece isteğe bağlı bir anahtar sözcük.

İkinci durumda neden Standart tasarımcılar çöp seçti gereksiz anahtar kelimelerle dilbilgisi yaptığını anlamıyorum.

DÜZENLEME:Açıklığa kavuşturmak için, değişkenleri extern kullanım olduğunu biliyorum, ama sadece extern yaklaşık olarak soruyorumfonksiyonlar.

CEVAP
13 Mayıs 2009, ÇARŞAMBA


İki dosya, foo var.c ve bar.c.

Burada foo.c

#include <stdio.h>

volatile unsigned int stop_now = 0;
extern void bar_function(void);

int main(void)
{
  while (1) {
     bar_function();
     stop_now = 1;
  }
  return 0;
}

Şimdi, burada bar.c

#include <stdio.h>

extern volatile unsigned int stop_now;

void bar_function(void)
{
   while (! stop_now) {
      printf("Hello, world!\n");
      sleep(30);
   }
}

Gördüğünüz gibi, foo arasında paylaşılan bir başlık var.c ve bar.c , ancak bar.c bir şey foo ilan ihtiyacı var.onun bağlantılı, ve foo c.c bardan bir işlev ihtiyacı var.c zaman bağlı.

Kullanarak 'dış' buldu (statik olmayan), bağlantı zaman olacak gibidir, daha sonra karşılaşılan olacağı için hiç yedek yok ne olursa olsun. bu derleyici söylüyorsun

Eğer modüller arasında bazı global paylaşmak istiyorsanız çok faydalı bir başlık başlatmak sokmak istemiyorum.

Teknik olarak, halka açık bir kütüphane başlığında her fonksiyonu 'dış', ancak böyle bir yararı yoktur, derleyici bağlı olarak çok küçük olarak etiketleme. Çoğu derleyici o kendi anlamaya olabilir. Gördüğünüz gibi, bu fonksiyonları aslında başka bir yerde tanımlanmıştır.

Yukarıdaki örnekte, () ana Merhaba Dünya yazdırma yalnızca bir kez, ama bar_function girmeye devam eder(). Ayrıca not, bar_function() bu örnek sadece basit bir örnek olduğu için () dönmek için gitmiyor. Sadece stop_now bir sinyal eğer bu pratik yeterli gelmiyor diye servise değiştirilmesini düşünün.

Externs sinyal işleyicileri, başlık ya da bir yapı koymak istemediğiniz bir dışlama, vb gibi şeyler için çok yararlıdır. Çoğu derleyici nesne tanımlandığı modülde saklı olacaklarını bildikleri için dış nesneler için bellek ayırmak, onların yok olmasını sağlamak için en iyi hale getirecektir. Ancak, yine, kamu fonksiyonları prototip modern Derleyiciler ile belirtme küçük bir nokta var.

Yardımcı olur :) umarım

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Angry Paintballer

    Angry Paintb

    8 Ocak 2012
  • esnathesinger

    esnathesinge

    6 NİSAN 2009
  • Tina Chen

    Tina Chen

    26 Mayıs 2012