Jaka jest różnica (jeśli występuje) między dwiema poniższymi instrukcjami sterowania preprocesorem.Różnice między dyrektywami preprocesora #if i #ifdef
#if
i
#ifdef
Jaka jest różnica (jeśli występuje) między dwiema poniższymi instrukcjami sterowania preprocesorem.Różnice między dyrektywami preprocesora #if i #ifdef
#if
i
#ifdef
Można wykazać różnicę wykonując:
#define FOO 0
#if FOO
// won't compile this
#endif
#ifdef FOO
// will compile this
#endif
#if
czeki o wartości symbolu , natomiast #ifdef
sprawdza istnienie symbolu (niezależnie od jego wartości).
+1 dla wyraźnego wskazania, że zdefiniowanie czegoś na zero wyłączy #if, ale nie #ifdef. – DevSolar
Jeśli FOO zdefiniowane niezerowe niż kompilator kompiluje. Dlaczego? –
@fahad: '# if' sprawdza wartość * symbolu, aby sprawdzić, czy jest niezerowy (true) lub zero (false). Następnie blok jest kompilowany, jeśli wynik jest prawdziwy. –
#ifdef FOO
jest skrótem dla:
#if defined(FOO)
#if
może być również stosowany do innych testów lub bardziej złożone warunki preprocesora.
#if defined(FOO) || defined(BAR)
lub mój ulubiony #if 0 zamiast komentowania wielu linii. –
'if (0)' pozwala na kompilowanie linii w trybie debugowania, dzięki czemu można przeskoczyć w bloku podczas debugowania ... – pascal
@pascal: to brzmi bardzo kompilator/env specyficzne. C++ nawet nie definiuje trybu debugowania (chociaż NDEBUG ma znaczenie w kontekście assert). ;-P –
Nie są to makra ani instrukcje sterujące. Ich nazwa to "dyrektywy preprocesora". – ybungalobill
Edytowany tytuł. Pozostawiono "instrukcje kontrolne" w tekście dla "nieostrych" wyszukiwań. – DevSolar