Mengapa #if
kondisi dalam kode berikut terpenuhi:
#include <iostream>
#define VALUE foo
int main() {
#if VALUE == bar
std::cout << "WORKS!" << std::endl;
#endif // VALUE
}
c++
c-preprocessor
michalt38
sumber
sumber
Dalam sebuah
#if
pernyataan, setiap pengidentifikasi yang tetap setelah substitusi makro (kecuali untuktrue
danfalse
) diganti dengan konstanta0
. Jadi arahan Anda menjadiyang mana yang benar.
sumber
Ini karena keduanya belum
foo
jugabar
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:Jadi
VALUE
diberi nilai '0' (default untukfoo
) danbar
juga memiliki '0', jadiVALUE == bar
dievaluasi menjadi "BENAR."Demikian pula,
clang-cl
berikan yang berikut:sumber
MSVC
danclang-cl
penyusun, peringatan ini dapat dinonaktifkan (baik secara khusus, atau dengan menetapkan 'level' peringatan yang sesuai).Untuk mencapai apa yang Anda kejar, coba ini:
Dalam hal ini Anda dapat mematikan pernyataan debugging dengan mengubah "define" menjadi "undef".
Anda mungkin menemukan bahwa kompiler Anda memungkinkan Anda untuk mendefinisikan DEBUG di luar kode itu sendiri, di mana Anda dapat mengurangi kode tersebut
Dan kemudian memanggil kompiler dengan opsi seperti -DDEBUG = 0
Lihatlah bab tentang Pemrograman Defensif di Steve McConnell, "Kode Lengkap."
sumber