Dlaczego #if
spełniono warunek w następującym kodzie:
#include <iostream>
#define VALUE foo
int main() {
#if VALUE == bar
std::cout << "WORKS!" << std::endl;
#endif // VALUE
}
c++
c-preprocessor
michalt38
źródło
źródło
W
#if
instrukcji każdy identyfikator pozostały po podstawieniu makra (z wyjątkiemtrue
ifalse
) jest zastępowany stałą0
. Twoja dyrektywa staje sięco jest prawdą.
źródło
Wynika to z faktu, że ani
foo
niebar
podano żadnej definicji, ani wartości - więc są one takie same (tj. Zastąpione wartością „0”). Kompilatory wydadzą ostrzeżenia o tym.MSVC
Kompilator (Visual Studio 2019) podaje następujące elementy:Tak więc
VALUE
otrzymuje wartość „0” (domyślnie dlafoo
), abar
także ma „0”, więcVALUE == bar
ocenia się na „PRAWDA”.Podobnie
clang-cl
daje następujące:źródło
MSVC
iclang-cl
kompilatory, to ostrzeżenie może być wyłączona (albo specjalnie, albo przez ustawienie odpowiedniego ostrzeżenia „poziom”).Aby osiągnąć to, czego szukasz, spróbuj:
W takim przypadku możesz wyłączyć instrukcje debugowania, zmieniając „defin” na „undef”.
Może się okazać, że twój kompilator pozwala ci zdefiniować DEBUGĘ poza samym kodem, w którym to momencie możesz zredukować kod
Następnie uruchom kompilator z opcją taką jak -DDEBUG = 0
Sprawdź rozdział dotyczący programowania defensywnego w Steve McConnell, „Kod zakończony”.
źródło