Bei einer Überprüfung bin ich auf einen Code wie den folgenden gestoßen:
#if defined(x) || y
Was bedeutet die obige Aussage? Wird die Bedingung ordnungsgemäß ausgeführt?
Bei einer Überprüfung bin ich auf einen Code wie den folgenden gestoßen:
#if defined(x) || y
Was bedeutet die obige Aussage? Wird die Bedingung ordnungsgemäß ausgeführt?
Ja, es ist gültig.
Hier ist, was der Standard (C99) in 6.10p1 sagt:
if-group:
# if constant-expression new-line groupopt
# ifdef identifier new-line groupopt
# ifndef identifier new-line groupopt
das defined
operator wird als unärer Operatorteil eines konstanten Ausdrucks angesehen (6.10.1p1).
In Ihrem Beispiel wird die Bedingung als wahr ausgewertet, wenn das Makro x
definiert ist ODER wenn y
ist definiert und anders als 0
Die Begründung dafür ist zweifach.
Anstelle von a #ifdef
Sie verwenden die defined
Operator, damit Sie logische Operatoren verwenden können (&&
, ||
usw.), damit Sie Ihren Code nicht duplizieren müssen, damit er richtig eingefügt wird, wenn es mehrere Kriterien für das gibt, was Sie definieren müssen.
Ebenfalls, meiner Meinung nachIch finde es viel einfacher zu lesen als #if defined(x)
als #ifdef x
und Sie könnten Folgendes tun #if defined(x) && defined(y)
während das mit nicht möglich ist #ifdef
.
Ja, seit defined(x)
ist ein boolescher Wert und gibt wahr oder falsch zurück.
Die obige Aussage bedeutet “entweder x ist definiert oder y ist wahr”.
es ist richtig, aber es ist eine schlechte Praxis. Warum zwei verschiedene Auswertungen (‘y’ und ‘defined(x)’) in einer Bedingung verwenden? Es könnte für andere verwirrend sein. Das folgende Beispiel zeigt eine häufigere Verwendung von || und && Operatoren gegen #definierte Makros:
#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
Wenn der obige Code ausgeführt wurde, erhielt der Benutzer diese Meldungen auf dem Bildschirm:
#warning "A or B"
#warning "A and B"
Aber wenn der Code so wäre (AA war undefiniert):
#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
dann erhält der Benutzer diese Nachricht:
#warning "A or B"
Ausführen ist nicht das richtige Wort. Dieser Code wird zur Kompilierzeit vorverarbeitet. Ich bin mir nicht sicher über die Richtigkeit der Syntax, aber es könnte höchstens werden ausgewertet aber normalerweise ist die richtige Syntax von “#if defined(x)” “#IFDEF x”
– usr-local-ΕΨΗΕΛΩΝ
30. März 2012 um 15:37 Uhr