Aracılığıyla paylaş


#if, #elif, #else ve #endif Yönergeleri (C/C++)

#if yönergesi, #elif, #else ve #endif yönergeleri ile birlikte bir kaynak dosyanın bölümlerinin derlenmesini denetler.Yazdığınız ifade (#if sonrasında) sıfır dışında bir değere sahipse, #if direktifinden hemen sonra gelen satır grubu çeviri biriminde korunur.

Dilbilgisi

  • koşullu :
    if-part elif-partsoptelse-partoptendif-line

  • if-part :
    if-line metni

  • if-line :
    #if sabit ifadesi

    #ifdef tanımlayıcı

    #ifndef tanımlayıcı

  • elif-parts :
    elif-line metni

    elif-parts elif-line metni

  • elif-line :
    #elif sabit ifadesi

  • else-part :
    else-line metni

  • else-line :
    #else

  • endif-line :
    #endif

Kaynak dosyasındaki her bir #if yönergesi, bir kapanış #endif yönergesiyle eşleştirilmelidir.#if ve #endif yönergeleri arasında herhangi bir sayıda #elif yönergesi görüntülenebilir, ancak en fazla bir #else yönergesine izin verilir.Varsa, #else yönergesi #endif öncesindeki son yönerge olmalıdır.

#if, #elif, #else ve #endif yönergeleri, diğer #if yönergelerinin metin bölümlerinde bulunabilir.Her iç içe #else, #elif veya #endif yönergesi kendisine en yakın önceki #if yönergeye aittir.

#if ve #ifdef gibi tüm koşullu derleme yönergelerinin, dosya sonu öncesinde kapanış #endif yönergeleri ile eşleştirilmesi gerekir; aksi halde, bir hata iletisi oluşturulur.Koşullu derleme yönergeleri dahil etme dosyalarında olduğu zaman aynı koşulları karşılaması gerekir: Dahil etme dosyasının sonunda eşleşmeyen koşullu derleme yönergesi kalmamalıdır.

Makro değişikliği #elif komutunu izleyen komut satırı bölümünde gerçekleştirilir böylece makro çağrısı sabit ifade içinde kullanılabilir.

Önişlemci daha fazla işlemek için verilen metin örneklerinden birini seçer.metin içinde belirtilen bir blok metin dizisi olabilir.Bu, birden fazla satırı kaplayabilir.Genelde metin, derleyici veya önişlemci için anlamlı olan program metnidir.

Önişlemci seçilen metni işler ve derleyiciye gönderir.Metin önişlemci direktifleri içeriyorsa önişlemci bu direktifleri yerine getirir.Yalnızca önişlemci tarafından seçilen metin blokları derlenir.

Önişlemci true (sıfır olmayan) bir sabit ifade bulana dek her #if veya #elif yönergesini izleyen sabit ifadeyi değerlendirerek tek bir metin seçer.Tüm metni (# ile başlayan diğer önişlemci yönergeleri dahil) ilgili #elif, #else veya #endif değerine kadar seçer.

Sabit ifadenin tüm tekrarlamaları yanlışsa veya herhangi bir #elif yönergesi görünmüyorsa önişlemci #else yan tümcesinden sonra metin bloğunu seçer.#else yan tümcesi atlanırsa ve #if bloğundaki sabit ifadenin tüm örnekleri false ise, bir metin bloğu seçilmez.

Sabit ifade şu ilave kısıtlatmalara tabi olacak şekilde bir tamsayı sabit ifadesidir:

  • İfadeler tamsayı türünde olmalıdır ve yalnızca tamsayı sabitlerini, karakter sabitlerini ve tanımlanan işleci içerebilir.

  • İfade sizeof ya da bir tür atama işleci kullanamaz.

  • Hedef ortamın tamsayıların tüm aralıklarını temsil etmesi mümkün olmayabilir.

  • Çeviri int türünü uzun türü ile ve unsigned int türünü unsigned long ile aynı şekilde temsil eder.

  • Çevirici karakter sabitlerini, hedef ortam kümesinden farklı bir kod değerleri kümesine çevirebilir.Hedef ortamın özelliklerini belirlemek için LIMITS.H makrolarını hedef ortam için oluşturulmuş bir uygulamada denetleyin.

  • İfade herhangi bir ortam sorgusu gerçekleştirmemelidir ve hedef bilgisayardaki uygulama ayrıntılarını karşı yalıtılmış olarak kalması gerekir.

defined önişlemci işleci aşağıdaki sözdiziminde gösterildiği gibi özel sabit ifadelerde kullanılabilir:

tanımlı( identifier )

Tanımlı identifier

Bu sabit ifade tanımlayıcı tanımlı olduğunda true (nonzero) olarak kabul edilir, aksi halde koşul false (0) değerine sahiptir.Boş metin olarak tanımlanan bir tanımlayıcı, tanımlanmış kabul edilir.Tanımlanan yönerge bir #if ve #elif yönergesinde kullanılabilir fakat başka bir yerde kullanılamaz.

Aşağıdaki örnekte, #if ve #endif yönergeleri üç işlev çağrısından birinin derlemesini denetler:

#if defined(CREDIT)
    credit();
#elif defined(DEBIT)
    debit();
#else
    printerror();
#endif

CREDIT tanımlayıcısı tanımlanmışsa, credit için yapılan işlev çağrısı derlenir.DEBIT tanıtıcısı tanımlanırsa debit işlev çağrısı derlenir.Hiçbir tanımlayıcı tanımlanmadıysa printerror çağrısı derlenir.Büyük/küçük harf kullanımları farklı olduğundan CREDIT ve credit tanımlayıcılarının C ve C++ içindeki farklı tanımlayıcılar olduğunu unutmayın.

Aşağıdaki örnekte bulunan koşullu derleme deyimleri, DLEVEL adlı önceden tanımlanmış bir sembolik sabiti varsayarlar.

#if DLEVEL > 5
    #define SIGNAL  1
    #if STACKUSE == 1
        #define STACK   200
    #else
        #define STACK   100
    #endif
#else
    #define SIGNAL  0
    #if STACKUSE == 1
        #define STACK   100
    #else
        #define STACK   50
    #endif
#endif
#if DLEVEL == 0
    #define STACK 0
#elif DLEVEL == 1
    #define STACK 100
#elif DLEVEL > 5
    display( debugptr );
#else
    #define STACK 200
#endif

İlk #if bloğu #if, #else ve #endif yönergelerinin iç içe iki kümesini gösterir.İlk yönergeler kümesi yalnızca DLEVEL > 5 doğru olduğunda işlenir.Aksi halde, #else ardından gelen ifadeler işlenir.

İkinci örnekteki #elif ve #else yönergeleri, DLEVEL değerini temel alarak dört seçimden birini yapmak için kullanılır.STACK sabiti DLEVEL tanımına bağlı olarak 0, 100 veya 200 olarak ayarlanmıştır.DLEVEL 5'ten büyükse, deyim

#elif DLEVEL > 5
display(debugptr);

derlenir ve STACK tanımlı değil.

Koşullu derleme, aynı üstbilgi dosyasına birden çok ekleme yapılmasının engellenmesi için yaygın olarak kullanılır.C++ dilinde sınıflar genelde üstbilgi dosyalarında tanımlanır, aşağıdaki gibi yapıları birden çok tanımı önlemek için kullanılabilir:

/*  EXAMPLE.H - Example header file  */
#if !defined( EXAMPLE_H )
#define EXAMPLE_H

class Example
{
...
};

#endif // !defined( EXAMPLE_H )

Yukarıdaki kod EXAMPLE_H sembolik sabitinin tanımlanıp tanımlanmadığını denetler.Bu durumda, dosya zaten eklenmiştir ve yeniden işlenmez.Aksi halde, EXAMPLE_H sabiti EXAMPLE.H öğesini işlendi olarak işaretlemek üzere tanımlanır.

Ayrıca bkz.

Başvuru

Ön işlemci Yönergeleri