Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
#elif, #else ve #endif yönergeleriyle #if yönergesi, kaynak dosyanın bölümlerinin derlenmesini denetler. Yazdığınız ifadenin (#if sonra) sıfır olmayan bir değeri varsa, #if yönergesini izleyen satır grubu çeviri ünitesinde tutulur.
Dilbilgisi
koşullu :
if-part elif-partsopt else-partopt endif-line
if-part :
if-line text
if-line :
sabit ifadeyi #if
#ifdef tanımlayıcısı
#ifndef tanımlayıcısı
elif-parts :
elif satırı metni
elif-parts elif-line text
elif-line :
sabit ifade #elif
else-part :
else-line metni
else-line :
#else
endif-line :
#endif
Açıklamalar
Bir kaynak dosyadaki her #if yönergesi, kapanış #endif yönergesi ile eşleşmelidir. #if ve #endif yönergeleri arasında herhangi bir sayıda #elif yönergesi görünebilir, ancak en fazla bir #else yönergesine izin verilir. varsa, #else yönergesi #endif önce son yönerge olmalıdır.
#if, #elif, #else ve #endif yönergeleri diğer #if yönergelerinin metin bölümlerine iç içe olabilir. İç içe yerleştirilmiş her #else, #elif veya #endif yönergesi, önceki en yakın #if yönergesine aittir.
#if ve #ifdef gibi tüm koşullu derleme yönergeleri, dosyanın sonundan önce bir kapanış #endif yönergesi ile eşleşmelidir. Aksi takdirde bir hata iletisi oluşturulur. Koşullu derleme yönergeleri ekleme dosyalarında yer alıyorsa, aynı koşulları karşılamaları gerekir: Ekleme dosyasının sonunda eşleşmeyen koşullu derleme yönergeleri olmamalıdır.
Makro değiştirme, satırın bir #elif komutunu izleyen bölümünde yapılır, böylece sabit ifadede bir makro çağrısı kullanılabilir.
Önişlemci, daha fazla işlem için metnin belirli oluşumlarından birini seçer. Metinde belirtilen bir blok herhangi bir metin dizisi olabilir. Birden fazla satır kaplayabilir. Metin genellikle derleyici veya önişlemci için anlamı olan program metnidir.
Önişlemci seçilen metni işler ve derleyiciye geçirir. Metin ön işlemci yönergeleri içeriyorsa, önişlemci bu yönergeleri yürütür. Yalnızca ön işlemci tarafından seçilen metin blokları derlenir.
Önişlemci, her #if izleyen sabit ifadeyi değerlendirerek tek bir metin öğesi seçer veya doğru (sıfır olmayan) bir sabit ifade bulana kadar yönergeyi #elif. İlişkili #elif, #else veya #endif kadar tüm metinleri (ile #başlayan diğer ön işlemci yönergeleri dahil) seçer.
Sabit ifadenin tüm oluşumları false ise veya hiçbir #elif yönergesi görünmüyorsa, önişlemci #else yan tümcesinin ardından metin bloğunu seçer. #else yan tümcesi olmadığında ve #if bloğundaki tüm sabit ifade örnekleri yanlış olduğunda, metin bloğu seçilmez.
Sabit-ifade, şu ek kısıtlamalara sahip bir tamsayı sabit ifadesidir:
İfadeler tamsayı türüne sahip olmalıdır ve yalnızca tamsayı sabitleri, karakter sabitleri ve tanımlı işleci içerebilir.
İfade veya tür atama işlecini kullanamaz
sizeof
.Hedef ortam tüm tamsayı aralıklarını gösteremeyebilir.
Çeviri türüyle
int
aynılong
türü veunsigned int
ile aynı şekildeunsigned long
temsil eder.Çevirici, karakter sabitlerini hedef ortamın kümesinden farklı bir kod değerleri kümesine çevirebilir. Hedef ortamın özelliklerini belirlemek için, SıNıRLAR'ın değerlerini denetlemek üzere bu ortam için oluşturulmuş bir uygulama kullanın. H makroları.
İfadenin ortamı sorgulamaması ve hedef bilgisayarda uygulama ayrıntılarından yalıtılmış olarak kalması gerekir.
Ön işlemci işleçleri
tanımlı
Tanımlanan önişlemci işleci, aşağıdaki söz diziminde gösterildiği gibi özel sabit ifadelerde kullanılabilir:
defined( tanımlayıcı )
tanımlı tanımlayıcı
Tanımlayıcı şu anda tanımlanmışsa bu sabit ifade true (sıfır olmayan) olarak kabul edilir. Aksi takdirde koşul false (0) şeklindedir. Boş metin olarak tanımlanan bir tanımlayıcının tanımlandığı kabul edilir. Tanımlanan işleç bir #if ve #elif yönergesinde kullanılabilir, ancak başka hiçbir yerde kullanılamaz.
Aşağıdaki örnekte, #if ve #endif yönergeleri üç işlev çağrısından birinin derlenmesini denetler:
#if defined(CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif
tanımlayıcı CREDIT
tanımlanmışsa işlevi credit
çağrısı derlenmiş olur. Tanımlayıcı DEBIT
tanımlanmışsa, işlevi debit
çağrısı derlenmiş olur. Tanımlayıcı tanımlanmadıysa çağrısı printerror
derlenmiş olur. Hem hem credit
de CREDIT
C ve C++ içinde farklı tanımlayıcılardır çünkü durumları farklıdır.
Aşağıdaki örnekteki koşullu derleme deyimleri, adlı DLEVEL
önceden tanımlanmış bir sembolik sabit olduğunu varsayar.
#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 iki iç içe #if kümesi, #else ve #endif yönergelerini gösterir. İlk yönerge kümesi yalnızca true olduğunda DLEVEL > 5
işlenir. Aksi takdirde, #else sonra deyimleri işlenir.
İkinci örnekteki #elif ve #else yönergeleri, değerine DLEVEL
göre dört seçimden birini yapmak için kullanılır. sabiti STACK
, tanımına DLEVEL
bağlı olarak 0, 100 veya 200 olarak ayarlanır. 5'ten büyükse DLEVEL
deyimi
#elif DLEVEL > 5
display(debugptr);
derlenmiş ve STACK
tanımlanmamıştır.
Koşullu derlemenin yaygın kullanımlarından biri, aynı üst bilgi dosyasının birden çok eklenmesini önlemektir. Sınıfların genellikle üst bilgi dosyalarında tanımlandığı C++'da, bunun 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, sembolik sabitin EXAMPLE_H
tanımlandığını denetler. Bu durumda, dosya zaten eklenmiş ve yeniden işlemeye gerek yoktur. Aksi takdirde, sabit EXAMPLE_H
ÖRNEK olarak işaretlenmek üzere tanımlanır. H zaten işlendiği gibi.
__has_include
Visual Studio 2017 sürüm 15.3 ve üzeri: Bir kitaplık üst bilgisinin eklenip eklenemeyeceğini belirler:
#ifdef __has_include
# if __has_include(<filesystem>)
# include <filesystem>
# define have_filesystem 1
# elif __has_include(<experimental/filesystem>)
# include <experimental/filesystem>
# define have_filesystem 1
# define experimental_filesystem
# else
# define have_filesystem 0
# endif
#endif