Peran #ifdef dan #ifndef

100
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");

Dalam hal ini apa peran #ifdefdan #ifndef, dan apa hasilnya?

alka pandey
sumber

Jawaban:

131

Teks di dalam ifdef/endifatau ifndef/endif pasangan akan ditinggalkan atau dihapus oleh pra-prosesor tergantung pada kondisinya. ifdefberarti "jika yang berikut ini didefinisikan" sedangkan ifndefberarti "jika yang berikut ini tidak ditentukan".

Begitu:

#define one 0
#ifdef one
    printf("one is defined ");
#endif
#ifndef one
    printf("one is not defined ");
#endif

setara dengan:

printf("one is defined ");

sejak onedidefinisikan jadi yang ifdefbenar dan yang ifndefsalah. Tidak peduli apa yang didefinisikan sebagai . Sepotong kode yang serupa (lebih baik menurut saya) adalah:

#define one 0
#ifdef one
    printf("one is defined ");
#else
    printf("one is not defined ");
#endif

karena itu menentukan maksud dengan lebih jelas dalam situasi khusus ini.

Dalam kasus khusus Anda, teks setelah ifdeftidak dihapus sejak oneditentukan. Teks setelah ifndef ini dihapus karena alasan yang sama. Harus ada dua endifgaris penutup di beberapa titik dan yang pertama akan menyebabkan garis mulai dimasukkan lagi, sebagai berikut:

     #define one 0
+--- #ifdef one
|    printf("one is defined ");     // Everything in here is included.
| +- #ifndef one
| |  printf("one is not defined "); // Everything in here is excluded.
| |  :
| +- #endif
|    :                              // Everything in here is included again.
+--- #endif
paxdiablo
sumber
68

Seseorang harus menyebutkan bahwa dalam pertanyaan itu ada sedikit jebakan. #ifdefhanya akan memeriksa apakah simbol berikut telah ditentukan melalui #defineatau dengan baris perintah, tetapi nilainya (sebenarnya substitusinya) tidak relevan. Anda bahkan bisa menulis

#define one

precompiler menerima itu. Tetapi jika Anda menggunakannya, #ifitu hal lain.

#define one 0
#if one
    printf("one evaluates to a truth ");
#endif
#if !one
    printf("one does not evaluate to truth ");
#endif

akan memberi one does not evaluate to truth. Kata kunci definedmemungkinkan untuk mendapatkan perilaku yang diinginkan.

#if defined(one) 

oleh karena itu setara dengan #ifdef

Keuntungan dari #ifkonstruksi ini adalah untuk memungkinkan penanganan jalur kode yang lebih baik, coba lakukan hal seperti itu dengan #ifdef/ #ifndefpair yang lama .

#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
Patrick Schlüter
sumber
0

"#if one" berarti jika "#define one" telah ditulis, "# if one" dijalankan, sebaliknya "#ifndef one" dijalankan.

Ini hanyalah Petunjuk Pra-Prosesor C (CPP) yang setara dengan pernyataan cabang if, then, else dalam bahasa C.

yaitu jika {#define one} lalu printf ("satu mengevaluasi ke kebenaran"); else printf ("satu tidak ditentukan"); jadi jika tidak ada #define one statement maka cabang lain dari pernyataan itu akan dieksekusi.

Rodders
sumber
4
Saya tidak yakin apa yang ditambahkan ini yang belum tercakup dalam jawaban lain, dan contoh Anda bukan C atau C ++.
SirGuy
-2

Kode terlihat aneh karena printf tidak ada di blok fungsi mana pun.

hwx
sumber
1
seluruh blok bisa berada di dalam fungsi itu sendiri. Dan selamat datang di stackoverflow. Harap baca stackoverflow.com/help/how-to-answer .
rajashekar