Jawaban:
The halaman di cppreference.com negara:
Setelah semua ekspansi makro dan evaluasi ekspresi yang didefinisikan dan __has_include (karena C ++ 17), pengidentifikasi apa pun yang bukan boolean literal diganti dengan angka 0 (ini termasuk pengidentifikasi yang merupakan kata kunci leksikal, tetapi bukan token alternatif seperti dan ).
Jadi keduanya foo
dan bar
diganti dengan 0.
Dalam sebuah #if
pernyataan, setiap pengidentifikasi yang tetap setelah substitusi makro (kecuali untuk true
dan false
) diganti dengan konstanta 0
. Jadi arahan Anda menjadi
#if 0 == 0
yang mana yang benar.
Ini karena keduanya belum foo
juga bar
diberikan definisi atau nilai - sehingga keduanya sama (yaitu diganti dengan nilai "0"). Compiler akan memberi peringatan tentang hal ini.
The MSVC
compiler (Visual Studio 2019) memberikan berikut:
peringatan C4668: 'foo' tidak didefinisikan sebagai makro preprosesor, diganti dengan '0' untuk '# if / # elif'
peringatan C4668: 'bar' tidak didefinisikan sebagai makro praprosesor, diganti dengan '0' untuk '#jika / # elif '
Jadi VALUE
diberi nilai '0' (default untuk foo
) dan bar
juga memiliki '0', jadi VALUE == bar
dievaluasi menjadi "BENAR."
Demikian pula, clang-cl
berikan yang berikut:
peringatan: 'foo' tidak didefinisikan, mengevaluasi ke 0 [-Wundef]
peringatan: 'bar' tidak didefinisikan, mengevaluasi ke 0 [-Wundef]
MSVC
dan clang-cl
penyusun, peringatan ini dapat dinonaktifkan (baik secara khusus, atau dengan menetapkan 'level' peringatan yang sesuai).
Untuk mencapai apa yang Anda kejar, coba ini:
#include <iostream>
#define DEBUG
int main() {
#ifdef DEBUG
std::cout << "WORKS!" << std::endl;
#endif
}
Dalam hal ini Anda dapat mematikan pernyataan debugging dengan mengubah "define" menjadi "undef".
#include <iostream>
#undef DEBUG
int main() {
#ifdef DEBUG
std::cout << "WORKS!" << std::endl;
#endif
}
Anda mungkin menemukan bahwa kompiler Anda memungkinkan Anda untuk mendefinisikan DEBUG di luar kode itu sendiri, di mana Anda dapat mengurangi kode tersebut
#include <iostream>
int main() {
#ifdef DEBUG
std::cout << "WORKS!" << std::endl;
#endif
}
Dan kemudian memanggil kompiler dengan opsi seperti -DDEBUG = 0
Lihatlah bab tentang Pemrograman Defensif di Steve McConnell, "Kode Lengkap."