'typedef' — yeni tür isimleri (takma adlar) oluşturmak için güçlü bir araçtır, bu da kodu daha kısa ve bakımını daha kolay hale getirir. Anahtar kelime, C'nin erken sürümlerinde ortaya çıkarak, büyük projelerde geliştiricilerin yaşamını kolaylaştırmıştır, çünkü uzun yapı ve işaretçi bildirimleri kodu okunmaz ve bakımı zor hale getiriyordu.
Başlangıçta yapılar ve birleşimler, struct, union, enum anahtar kelimeleri ile uzun bildirimler kullanarak tanımlanıyordu. Kodun büyümesi ile bu tür bildirimler aşırı hale geldi ve kullanım açısından rahatsız edici oldu, bu da typedef’in tanıtılmasına yol açtı — türlerin kısaltılması ve standartlaştırılması için.
Yaygın hatalar, takma adların yanlış anlaşılması, typedef'in yapı bildirimleri ile karıştırılması, isimsiz yapılar, işaretçi dizileri ile zorluklar ve belgelenmemiş isimlendirme sözleşmeleri ile ilgilidir.
'typedef' mevcut türlere — hem temel hem de bileşik — kısa isimler verme olanağı sağlar:
Kod örneği:
typedef struct Point { int x, y; } Point; Point p1; // yerine 'struct Point p1;' typedef unsigned char byte; byte buffer[8];
Anahtar özellikler:
1. typedef ile "yeni bir tür" oluşturulabilir mi, böylece temel türla (örneğin, int) uyumsuz olur mu?
Hayır. typedef sadece bir takma ad verir. Derleyici seviyesinde tür aynı kalır, hata olmadan dönüştürme mümkündür.
2. typedef struct {} name_t; tanımlandıktan sonra struct name_t var; olarak bildirilirse sonuç nedir?
Bu bir hatadır! typedef struct MyStruct { ... } Name; kullanıldıktan sonra, değişkenler için Name kullanılır, struct Name değil. struct Name derleyiciye bilinmemektedir — bu şekilde çalışmaz.
3. typedef int arr[10]; arr a,b; a ve b’nin tipi nedir?
a ve b — her ikisi de 10 uzunluğunda int dizileridir. Bunlar işaretçiler değildir! Hata — 'int* a, b' beklentisidir, eğer dizi ve işaretçilerin typedef ile ilişkili özelliklerini unutursanız.
Bir projede typedef struct User { ... } User; olarak tanımlanmış ama struct User my_user; kullanılmış — derleyici hata verir, kod taşınamaz.
Artılar:
Eksiler:
Tüm projede bir standart izleniyor: typedef struct {...} Name; kullanılıyor, yalnızca Name var; kullanıyorlar, struct olmadan.
Artılar:
Eksiler: