Standart C Programlama Dili


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.