Yanıtlar:
Cppreference.com sayfa devletler:
Tanımlanmış ve __has_include (C ++ 17'den beri) ifadelerinin tüm makro genişlemesi ve değerlendirmelerinden sonra, boole değişmezi olmayan herhangi bir tanımlayıcı 0 sayısıyla değiştirilir (bu, sözcük olarak anahtar kelimeler olan, ancak ).
Yani her ikisi de foo
ve bar
0 ile değiştirilir.
Bir #if
ifadede, makro ikamesinden sonra ( true
ve hariç false
) kalan tüm tanımlayıcılar sabit ile değiştirilir 0
. Böylece direktifiniz
#if 0 == 0
hangisi doğru.
Bunun nedeni, ne tanım ne foo
de bar
değer verilmemiş olmasıdır - bu yüzden aynıdırlar (yani "0" değeriyle değiştirilmiştir). Derleyiciler bu konuda uyarı verecektir.
MSVC
(2019 Studio Görsel) derleyici aşağıdaki verir:
uyarı C4668: 'foo' bir önişlemci makrosu olarak tanımlanmadı, '# if / # elif' için '0' ile değiştirildi
uyarı C4668: 'bar', '#if' yerine '0' ile değiştirildi / # elif'
Bu yüzden VALUE
'0' değeri verilir (varsayılan değer foo
) ve bar
ayrıca '0' vardır, bu nedenle VALUE == bar
"TRUE" olarak değerlendirilir.
Benzer şekilde, clang-cl
aşağıdakileri verir:
uyarı: 'foo' tanımlanmamış, 0 olarak değerlendirilir [-Wundef]
uyarı: 'bar' tanımlanmamış, 0 olarak değerlendirilir [-Wundef]
MSVC
Ve clang-cl
derleyicileriyle bile , bu uyarı devre dışı bırakılabilir (özel olarak veya uygun bir uyarı 'seviye' ayarlanarak).
Neyin peşinde olduğunuzu gerçekleştirmek için şunu deneyin:
#include <iostream>
#define DEBUG
int main() {
#ifdef DEBUG
std::cout << "WORKS!" << std::endl;
#endif
}
Bu durumda, "define" ifadesini "undef" olarak değiştirerek hata ayıklama deyimlerini kapatabilirsiniz.
#include <iostream>
#undef DEBUG
int main() {
#ifdef DEBUG
std::cout << "WORKS!" << std::endl;
#endif
}
Derleyicinizin DEBUG'u kodun dışında tanımlamanıza izin verdiğini görebilirsiniz, bu noktada kodu
#include <iostream>
int main() {
#ifdef DEBUG
std::cout << "WORKS!" << std::endl;
#endif
}
Ve sonra derleyiciyi -DDEBUG = 0 gibi bir seçenekle çağırır.
Steve Code, "Kod Tamamlandı" bölümündeki Savunma Programcılığı bölümüne bakın.