2010-09-27 12 views

Odpowiedz

112

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).

+8

+1 dla wyraźnego wskazania, że ​​zdefiniowanie czegoś na zero wyłączy #if, ale nie #ifdef. – DevSolar

+0

Jeśli FOO zdefiniowane niezerowe niż kompilator kompiluje. Dlaczego? –

+1

@fahad: '# if' sprawdza wartość * symbolu, aby sprawdzić, czy jest niezerowy (true) lub zero (false). Następnie blok jest kompilowany, jeśli wynik jest prawdziwy. –

37
#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) 
+12

lub mój ulubiony #if 0 zamiast komentowania wielu linii. –

+0

'if (0)' pozwala na kompilowanie linii w trybie debugowania, dzięki czemu można przeskoczyć w bloku podczas debugowania ... – pascal

+1

@pascal: to brzmi bardzo kompilator/env specyficzne. C++ nawet nie definiuje trybu debugowania (chociaż NDEBUG ma znaczenie w kontekście assert). ;-P –

Powiązane problemy