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?
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?
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
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".
... lub oba. :) – phimuemue
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
.
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"
Zwróć uwagę, że używana tutaj składnia jest inna: "zdefiniowane x" zamiast "zdefiniowane (x)". oba dają taki sam wynik. – StarShine
* 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" –