6.3. Koşullu Derleme
#if
, #ifdef
,
#ifndef
, #else
, #elif
ve
#endif
emirleri, bazı koşullara bağlı olarak derlemeyi
kontrol etmek için kullanılırlar.
#if değişmez_ifade
emri, eğer değişmez_ifadenin değeri doğru
(sıfırdan farklı) ise bir sonraki #endif
veya
#else
(veya #elif
) emrine
kadar olan satırların derlemeye dahil edilmesini sağlar. İlk durumda,
derleme #endif
’ten sonra,
normal olarak devam eder; ikinci durumda ise, #else
’den
sonra ilgili #endif
’e kadar olan satırlar
önişlemci tarafından atlanır (yani derleyiciye gönderilmez). Eğer
değişmez_ifadeni değeri yanlış (0L
) ise,
#if
ile #endif
veya #else
(hangisi önce geliyorsa) arasındaki metin atlanır. #if
emirlerinin içiçe yazılabildiğine dikkat edin, bunun için
hangi #else
’in hangi #if
’e
ait olduğunu bilmemiz gerekir: #else
bir
#endif
ile bağlantısı olmayan, yukarıdaki en yakın
#if
’e aittir.
Değişmez_ifade, önişlemcinin
önişlem zamanında
hesaplayabileceği herhangi bir C
ifadesidir; sizeof
ve kalıp işleçleriyle sayım
ve kayan noktalı sayı değişmezleri burada kullanılamazlar. Daha önce
önişlemciye tanımlanmış makrolar ise kullanılabilirler; ancak, tanımsız
isimlerin yerine 0L
konulur. Değişmez_ifade her
zaman long
duyarlıkta hesaplanır.
Bir emir satırında
defined tanıtıcı_sözcük
şeklindeki bir ifade, eğer tanıtıcı_sözcük
önişlemci tarafından biliniyorsa 1L
ile
değiştirilir, aksi takdirde 0L
konulur.
Bir örnek olarak, iki müşteri için hazırlanmış bir programı ele alalım. Program içinde belirli bir müşteri için gerekli bölümler olabilir. Derlemeyi kontrol etmek için, şu anki derlemenin hangi müşteri için yapıldığını gösteren bir tanıtıcı sözcük tanımlayabiliriz. Örneğin,
#define MUSTERI 1 /* diğer müşteri için başka bir değer */ … #if MUSTERI == 1 /* ilk müşteri için kod */ … #else /* ikinci müşteri için kod */ … #endif
Bu arada
#ifdef tanıtıcı_sözcük
ve
#ifndef tanıtıcı_sözcük
emirleri, sırasıyla, tanıtıcı_sözcük’ün
önişlemci tarafından #define
ile tanımlanmış
olup olmadığını test ederler. Bunlar, sırasıyla,
#if defined tanıtıcı_sözcük
ve
#if !defined tanıtıcı_sözcük
emirleriyle eşdeğerdirler.
#elif değişmez_ifade
emri
#else
#if değişmez_ifade
için bir kısaltma şeklinde düşünülebilir, ancak
#elif
kullanıldığında yeni bir #endif
’e
gerek kalmaz; önceki #if
’in #endif
’i
kullanılır.
Başka bir örnek olarak, hataların düzeltilmekte olduğu bir
program düşünün; böylece bu programda htkntrl
adlı bir fonksiyona bazı yerlerde çağrılar olmaktadır. (Bu fonksiyon,
örneğin, bazı değişkenlerin o anki değerlerini basıyor olabilir.)
Ancak, program geliştirilmesi sonunda programı normal
bir şekilde derlememiz gerekecektir. Bunu yapmanın kolay bir yolu da
şöyledir:
… #ifndef HATASIZ /* hata düzeltme yardımcı fonksiyonu */ /* içeren başlık dosyası */ # include "htkntrl.h" #else # define htkntrl(...) #endif …
Eğer HATASIZ
adlı tanıtıcı sözcük #define
ile
tanımlanmamışsa, o zaman #include
emri önişlemeye girecek ve
htkntrl
fonksiyonu da dahil, hata düzeltme yardımcı
programları içeren
dosyasının
içindekileri derlenecektir. Ancak, eğer htkntrl.h
HATASIZ
#define
ile tanımlanırsa, o zaman, boş bir değiştirme
dizisine sahip olan htkntrl
makrosu
#define
ile tanımlanmış olacaktır. Bu durumda,
htkntrl
’e yapılan tüm çağrılar,
önişlemci tarafından, boşlukla değiştirilecektir. Buna benzer
#if
emirleri programın başka bölümlerinde de konulabilir.
HATASIZ
tanıtıcı sözcüğü programın başında tanımlanabileceği gibi,
C (önişlemcisi ve) derleyicisinin çağrıldığı komut satırında belirtilebilir.
Komut satırı kullanımı ile ilgili daha detaylı bilgiler için eklere
bakınız.