2012-03-30 15 views
16

Podczas jednej z opinii natknąłem się na fragment kodu tak:#if defined (x) || (y); czy to jest ważne?

#if defined(x) || y 

Czego Powyższe stwierdzenie oznacza? Czy warunek zostanie poprawnie wykonany?

+0

* Execute * nie jest właściwym słowem. Ten kod jest wstępnie przetwarzany w czasie kompilacji. Nie jestem pewien co do poprawności składni, ale może ona najwyżej zostać * oceniona *, ale zazwyczaj właściwą składnią "#if defined (x)" jest "#IFDEF x" –

Odpowiedz

20

Tak, jest ważny.

Oto co Standard (C99) mówi w 6.10p1:

if-group: 
# if constant-expression new-line groupopt 
# ifdef identifier new-line groupopt 
# ifndef identifier new-line groupopt 

operator defined jest postrzegana jako jednoargumentowego strony operatora o stałej ekspresji (6.10.1p1).

W przykładzie stan oceniany jest jako prawdziwy, jeśli makro x jest zdefiniowana lub jeśli y jest określona i różni się od 0

3

Tak, ponieważ defined(x) jest wartością logiczną i zwraca wartość true lub false.

Powyższe wyrażenie oznacza "albo jest zdefiniowane x, albo y jest prawdziwe".

+5

... lub oba. :) – phimuemue

10

Rozumowanie tego jest dwojaki.

Zamiast korzystać z #ifdef, należy użyć operatora defined, dzięki czemu można używać operatorów logicznych na nim (&&, ||, etc.), tak że nie trzeba powielać swój kod tak, że jest prawidłowo włączone jeśli istnieje wiele kryteriów określających to, co należy zdefiniować.

Również moim zdaniem, uważam, że znacznie łatwiej odczytać jako #if defined(x) niż #ifdef x, i można wykonać następujące czynności #if defined(x) && defined(y), podczas gdy nie jest to możliwe z #ifdef.

1

To jest poprawne, ale jest to zła praktyka. Po co używać dwóch różnych ocen ("y" i "zdefiniowany (x)") w jednym warunkowym. Może to być mylące dla innych. Poniższy przykład pokazuje bardziej powszechne użycie || i & & operatiors przeciwko #defined makr:

#define AA 1 
#define BB 2 
#if (defined AA) || (defined BB) 
    #warning "A or B" 
#endif 
#if (defined AA) && (defined BB) 
    #warning "A and B" 
#endif 

Kiedy powyższy kod został uruchomiony użytkownik dostanie te komunikaty na ekranie:

#warning "A or B" 
#warning "A and B" 

Ale jeśli kod był tak (AA było nieokreślone):

#undefine AA 
#define BB 2 
#if (defined AA) || (defined BB) 
    #warning "A or B" 
#endif 
#if (defined AA) && (defined BB) 
    #warning "A and B" 
#endif 

następnie użytkownik otrzyma komunikat:

#warning "A or B" 
+0

Zwróć uwagę, że używana tutaj składnia jest inna: "zdefiniowane x" zamiast "zdefiniowane (x)". oba dają taki sam wynik. – StarShine

Powiązane problemy