extern ve Bağlama
Sembolleri dosyalar arasında paylaşın.
extern ve Bağlama, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.
Bağlantı Nedir?
Bağlantı, bir adın farklı kaynak dosyaları arasında paylaşılıp paylaşılamayacağını belirtir.
Dış bağlantıya sahip bir ad, programın tamamında aynı varlığa başvurur. İç bağlantıya sahip bir ad ise kendi dosyasına özeldir. Bağlantıyı anlamak, çok dosyalı programlar için temel öneme sahiptir.
Bir Değişkeni Paylaşma
İki dosyanın tek bir global sayaca erişmesi gerektiğini varsayalım. Sayacı iki dosyada da basitçe tanımlayamazsınız; bu, iki ayrı değişken oluşturur ve yinelenen sembol bağlantı hatasına yol açar.
Bunun yerine değişkeni bir kez tanımlar ve diğer tüm dosyalarda extern ile bildirirsiniz.
/* config.c */
int g_count = 0; /* the one definition */extern Anahtar Sözcüğü
extern, derleyiciye bir değişkenin programın başka bir yerinde var olduğunu bildirir; ancak burada onun için depolama alanı oluşturmaz.
Bu, yalnızca bir bildirimdir. Bağlayıcı daha sonra bunu başka bir dosyadaki tek tanıma çözümler.
/* other.c */
extern int g_count; /* declared, not defined */
void bump(void) {
g_count++;
}Başlık Dosyasında Bildirim
Temiz yaklaşım şudur: extern bildirimini bir başlık dosyasına, eşleşen tanımı ise tam olarak bir kaynak dosyasına koyun.
Başlık dosyasını içeren her dosya artık paylaşılan değişkeni kullanabilir.
/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
extern int g_count;
#endifBir Tanım, Birçok Bildirim
Bu, global değişkenler için Tek Tanım Kuralı'dır: bir değişken birçok dosyada extern ile bildirilebilir, ancak yalnızca bir dosyada tanımlanabilir.
Tek tanım ( extern olmadan) depolama alanını ayırır. Tüm extern bildirimleri yalnızca bu tanıma işaret eder.
/* config.h */ extern int g_count; /* declaration */
/* config.c */ int g_count = 0; /* definition */İşlevlerin de Dış Bağlantısı Vardır
İşlevler varsayılan olarak dış bağlantıya sahiptir; bu nedenle bir başlık dosyasındaki prototip, diğer dosyaların bu işlevleri çağırmasına olanak tanır.
Bir prototipin önüne extern yazabilirsiniz, ancak bu gereksizdir; aksi belirtilmedikçe işlevler dış bağlantılıdır.
/* both forms mean the same */
int add(int a, int b);
extern int add(int a, int b);static ile İç Bağlantı
static anahtar sözcüğünün dosya kapsamındaki kullanımı, bir ada iç bağlantı verir: ad yalnızca kendi kaynak dosyasının içinde görünür.
Bunu, bir modüle özel kalması gereken yardımcı işlevler ve global değişkenler için kullanın. Diğer dosyalar bunları göremez veya bunlarla çakışamaz.
/* parser.c */
static int line_no = 0; /* private to parser.c */
static void advance(void) { /* private helper */
line_no++;
}extern ve static Karşılaştırması
Bu iki anahtar sözcük bağlantının birbirine zıt uçlarında yer alır.
extern dış bağlantı ister: bu adı dosyalar arasında paylaşır. Dosya kapsamındaki static ise iç bağlantıyı zorunlu kılar: bu adı özel tutar. Doğru seçim yapmak, modülünüzün neyi dışarı sunduğunu denetler.
extern int shared_total; /* visible everywhere */
static int local_cache; /* only this file */Yaygın Bir Hata
Yeni başlayanlar bazen int g_count; gibi sıradan bir tanımı başlık dosyasına koyar.
Başlık dosyası birkaç dosyaya eklendiği için her dosya kendi tanımını alır ve bağlayıcı yinelenen sembol bildirir. Başlık dosyasında her zaman extern ile bildirim yapın, bir .c dosyasında ise bir kez tanımlayın.
/* WRONG in a header included twice */
int g_count; /* multiple definition */
/* RIGHT */
extern int g_count; /* declaration only */Hepsini Bir Araya Getirme
Bu üç dosyalı yapı, durumu paylaşmanın standart yoludur.
Başlık dosyası bildirimi yapar, bir kaynak dosyası tanımlar ve diğerleri başlık dosyasını ekledikten sonra değişkeni kullanır. Bağlayıcı, tüm başvuruları tek tanıma bağlar.
/* config.h */ extern int g_count;
/* config.c */ #include "config.h"
int g_count = 0;
/* main.c */ #include "config.h"
/* uses g_count */Başlatma Notu
İlk değeri yalnızca gerçek tanım vermelidir: int g_count = 0;.
Bir extern bildirimi başlatma yapmamalıdır; çünkü depolama alanı ayırmaz. extern int g_count = 0; yazmak bunu bir tanıma dönüştürür ve amacını boşa çıkarır.
extern int g_count; /* ok: declaration */
extern int g_count = 0; /* becomes a definition */Hızlı Kontrol
extern ve bağlantı konusundaki anlayışınızı kontrol edin.
Özet
Bağlantının dosyalar arası görünürlüğü denetlediğini öğrendiniz. extern, başka bir yerde tanımlanan bir adı bildirir; dosya kapsamındaki static ise bir adı özel tutar.
Global değişkenleri bir tanım ve birden çok extern bildirimiyle paylaşın. Sırada bu dosyaları bir program hâline getirip derleyecek ve bağlayacağız.
Sıkça Sorulan Sorular
“extern ve Bağlama” dersi ücretsiz mi?
Evet — “extern ve Bağlama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.
“extern ve Bağlama” dersinde ne öğreneceğim?
Sembolleri dosyalar arasında paylaşın. C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“extern ve Bağlama” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.