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.