5.3. Yeni Tip Tanımlama
Türetilmiş veri tipleri üzerindeki
tartışmamıza devam etmeden önce, gelin, dilin içindeki basit tipler gibi
görünen, ancak karmaşık tip olan yeni, yani kullanıcı tarafından tanımlanmış,
tiplere ve böyle tiplerin tanımlanması için kullanılan yönteme bakalım. Bu
amaçla, C dilinde, bir tipe bir tanıtıcı sözcük vererek yeni bir tip
tanımlamaya yarayan typedef bildirimi bulunmaktadır.
Bildirim, anlambilim açısından oldukça farklı
olmasına rağmen, sözdizimsel olarak bir değişken tanımıyla aynıdır. Sadece
başına typedef anahtar sözcüğü
getirilir. typedef anahtar
sözcüğünün bir bellek sınıfı belirteci olduğu kabul edilir. C dili
bir bildirimde en fazla bir tane bellek sınıfı belirtecine izin verdiği
için typedef’in arkasına (veya
önüne) auto, register,
static veya extern konulamaz.
Gelin birkaç örneğe bakalım:
typedef unsigned short int kisa;
typedef char *kdizisi, *kdfonk(char *, char *);
typedef struct { float ger, im; } kompleks;
typedef int vektor[6], matriks[8][6];
typedef enum { yanlis, dogru } mantiksal;
(kisa, kdizisi,
kdfonk, kompleks, vektor,
matriks ve mantiksal gibi) yeni tanımlanan
tanıtıcı sözcüklerin kendileri değişken veya fonksiyon değillerdir
(eğer typedef anahtar sözcükleri olmasaydı öyle
olacaklardı), ancak bu tür değişken veya fonksiyon tanımlamaya yarayacak
tiplerdir. Böyle tip isimleri kalıplarda ve
sizeof’un işlenenleri olarak
kullanılabilir. (sizeof bir sonraki kısımda
anlatılmaktadır.) Örneğin, aşağıdakiler birbirlerine eşdeğerdir:
| kisa i, j, k; | ile | unsigned short int i, j, k; |
| kdizisi s1, s2; | ile | char *s1, *s2; |
| kdfonk strcpy; | ile | char *strcpy(char *, char *); |
| kompleks z[5]; | ile | struct { float ger, im; } z[5]; |
| vektor a[8]; matriks a; |
veya ile |
int a[8][6]; |
| mantiksal m1, md=dogru, my=yanlis; |
ile | enum { yanlis, dogru } m1, md=dogru, my=yanlis; |
typedef kullanmanın temel nedeni uzun bildirimleri
kısaltmasıdır. Fakat, mantıksal olarak, programcı C dilinin sağladığı
tiplerin yanına sanki yeni bir tip ekliyormuş gibi düşünebilir.
Bu kolaylık programlama çabasını azaltır, programın okunaklılığını
geliştirir ve programlarımızı daha yapısal
hale getirir.
Ayrıca, önemli ve karmaşık tip bildirimleri programın belirli bir
yerinde toplandığında, programı belgelemek ve daha sonra onu anlayıp
değiştirmek daha kolay olacaktır.
typedef bildirimlerinin
etki alanı değişkenlerde olduğu gibidir. Bir blok içinde tanımlanmış bir tip
dış bloklara erişilebilir değildir, fakat bir dış blokta tanımlanmış bir tip,
tekrar tanımlanmadığı sürece, bir iç blokta kullanılabilir. Dışsal düzeyde
yapılmış bir typedef bildirimi kaynak dosyasının
sonuna kadar etkisini sürdürecektir, fakat ayrı derlenen dosyalarda değil.
struct, union ve sayım tipi
bildirimlerinin etki alanı da aynıdır.