Standart C Programlama Dili


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 htkntrl.h dosyasının içindekileri derlenecektir. Ancak, eğer 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.