#if, #elif, #else, dan Petunjuk #endif

Direktif pra-prosesor yang mengontrol kompilasi bagian file sumber.

#if ifCondition ...
[#elif elifCondition ...]
[#else ...]
#endif

Parameter

Item Deskripsi
ifCondition
Kondisi utama untuk dievaluasi. Jika parameter ini mengevaluasi ke nilai bukan nol, semua teks antara direktif #if ini dan instans berikutnya dari direktif #elif, #else, atau #endif dipertahankan dalam unit terjemahan; jika tidak, kode sumber berikutnya tidak dipertahankan.
Kondisi ini dapat menggunakan operator prapemroses yang ditentukan untuk menentukan apakah konstanta atau makro praprosesor tertentu ditentukan; penggunaan ini setara dengan penggunaan direktif #ifdef .
Lihat bagian Keterangan untuk pembatasan nilai parameter ifCondition .
elifCondition [opsional]
Kondisi lain untuk dievaluasi. Jika parameter ifCondition dan semua arahan #elif sebelumnya mengevaluasi ke nol, dan parameter ini mengevaluasi ke nilai bukan nol, semua teks antara direktif #elif ini dan instans berikutnya dari arahan #elif, #else, atau #endif dipertahankan dalam unit terjemahan; jika tidak, kode sumber berikutnya tidak dipertahankan.
Kondisi ini dapat menggunakan operator prapemroses yang ditentukan untuk menentukan apakah konstanta atau makro praprosesor tertentu ditentukan; penggunaan ini setara dengan penggunaan direktif #ifdef .
Lihat bagian Keterangan untuk pembatasan nilai parameter elifCondition .

Keterangan

Setiap arahan #if dalam file sumber harus dicocokkan dengan arahan #endif penutup. Sejumlah arahan #elif dapat muncul antara arahan #if dan #endif, tetapi paling banyak satu arahan #else diizinkan. Direktif #else, jika ada, harus menjadi arahan terakhir sebelum #endif. Direktif kompilasi bersyarkat yang terkandung dalam file sertakan harus memenuhi kondisi yang sama.

Arahan #if, #elif, #else, dan #endif dapat bersarang di bagian teks arahan #if lainnya. Setiap direktif #else, #elif, atau #endif berlapis milik direktif #if terdekat sebelumnya.

Jika tidak ada kondisi yang mengevaluasi ke nilai bukan nol, prapemroseksi memilih blok teks setelah direktif #else. Jika klausa #else dihilangkan dan tidak ada kondisi yang dievaluasi ke nilai bukan nol, tidak ada blok teks yang dipilih.

Parameter ifCondition dan elifCondition banyak memenuhi persyaratan berikut:

  • Ekspresi kompilasi bersyarat diperlakukan sebagai nilai panjang yang ditandatangani , dan ekspresi ini dievaluasi menggunakan aturan yang sama dengan ekspresi di C++.
  • Ekspresi harus memiliki jenis integral dan hanya dapat menyertakan konstanta bilangan bulat, konstanta karakter, dan operator yang ditentukan.
  • Ekspresi tidak dapat menggunakan sizeof atau operator type-cast.
  • Lingkungan target mungkin tidak dapat mewakili semua rentang bilangan bulat.
  • Terjemahan mewakili jenis int yang sama dengan panjang jenis, dan int yang tidak ditandatangani sama dengan panjang yang tidak ditandatangani.
  • Penerjemah dapat menerjemahkan konstanta karakter ke sekumpulan nilai kode yang berbeda dari yang ditetapkan untuk lingkungan target. Untuk menentukan properti lingkungan target, periksa nilai makro dari LIMITS. H dalam aplikasi yang dibangun untuk lingkungan target.
  • Ekspresi tidak boleh melakukan pertanyaan lingkungan apa pun dan harus tetap terisolasi dari detail implementasi pada komputer target.

Contoh

Bagian ini berisi contoh yang menunjukkan cara menggunakan arahan pra-prosesor kompilasi bersyariah.

Penggunaan operator yang ditentukan

Contoh berikut menunjukkan penggunaan operator yang ditentukan. Jika CREDIT pengidentifikasi ditentukan, panggilan ke fungsi kredit dikompilasi. Jika DEBIT pengidentifikasi ditentukan, panggilan ke fungsi debit dikompilasi. Jika tidak ada pengidentifikasi yang ditentukan, panggilan ke fungsi printerror dikompilasi. Perhatikan bahwa "KREDIT" dan "kredit" adalah pengidentifikasi yang berbeda di C dan C++ karena kasusnya berbeda.

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

Penggunaan direktif #if berlapis

Contoh berikut menunjukkan cara menumpuk arahan #if. Contoh ini mengasumsikan bahwa konstanta simbolis bernama DLEVEL telah ditentukan sebelumnya. Direktif #elif dan #else digunakan untuk membuat salah satu dari empat pilihan, berdasarkan nilai DLEVEL. STACK konstanta diatur ke 0, 100, atau 200, tergantung pada definisi DLEVEL. Jika DLEVEL lebih besar dari 5, maka STACK tidak ditentukan.

#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

Gunakan untuk menyertakan file header

Penggunaan umum untuk kompilasi bersyarkat adalah untuk mencegah beberapa penyertaan file header yang sama. Di C++, di mana kelas sering didefinisikan dalam file header, konstruksi kompilasi kondisional dapat digunakan untuk mencegah beberapa definisi. Contoh berikut menentukan apakah konstanta simbolis EXAMPLE_H ditentukan. Jika demikian, file telah disertakan dan tidak perlu diolah ulang; jika tidak, EXAMPLE_H konstanta didefinisikan untuk menunjukkan BAHWA CONTOH. H telah diproses.

#if !defined( EXAMPLE_H )
#define EXAMPLE_H

class Example
{
...
};

#endif // !defined( EXAMPLE_H )

Lihat juga

Direktif Preprocessor (DirectX HLSL)