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 foove bar0 ile değiştirilir.
Bir #ififadede, makro ikamesinden sonra ( trueve 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 foode bardeğ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 barayrıca '0' vardır, bu nedenle VALUE == bar"TRUE" olarak değerlendirilir.
Benzer şekilde, clang-claşağıdakileri verir:
uyarı: 'foo' tanımlanmamış, 0 olarak değerlendirilir [-Wundef]
uyarı: 'bar' tanımlanmamış, 0 olarak değerlendirilir [-Wundef]
MSVCVe clang-clderleyicileriyle 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.