#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
Dalam hal ini apa peran #ifdef
dan #ifndef
, dan apa hasilnya?
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
Dalam hal ini apa peran #ifdef
dan #ifndef
, dan apa hasilnya?
Jawaban:
Teks di dalam ifdef/endif
atau ifndef/endif
pasangan akan ditinggalkan atau dihapus oleh pra-prosesor tergantung pada kondisinya. ifdef
berarti "jika yang berikut ini didefinisikan" sedangkan ifndef
berarti "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 one
didefinisikan jadi yang ifdef
benar dan yang ifndef
salah. 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 ifdef
tidak dihapus sejak one
ditentukan. Teks setelah ifndef
ini dihapus karena alasan yang sama. Harus ada dua endif
garis 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
Seseorang harus menyebutkan bahwa dalam pertanyaan itu ada sedikit jebakan. #ifdef
hanya akan memeriksa apakah simbol berikut telah ditentukan melalui #define
atau dengan baris perintah, tetapi nilainya (sebenarnya substitusinya) tidak relevan. Anda bahkan bisa menulis
#define one
precompiler menerima itu. Tetapi jika Anda menggunakannya, #if
itu 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 defined
memungkinkan untuk mendapatkan perilaku yang diinginkan.
#if defined(one)
oleh karena itu setara dengan #ifdef
Keuntungan dari #if
konstruksi ini adalah untuk memungkinkan penanganan jalur kode yang lebih baik, coba lakukan hal seperti itu dengan #ifdef
/ #ifndef
pair yang lama .
#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
"#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.
Kode terlihat aneh karena printf tidak ada di blok fungsi mana pun.