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
İ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
Kullanım Anahtar Değer bir UİView'...
Böyle büyük mükafat "mac üzerinde...
Neden fonksiyonları üzerinde funktorla...
C "sanal" türetilmiş sınıf f...
Bir anahtar kelime üzerine fare ile üz...