#wenn definiert (x) || (j) ; ist das gültig?

Lesezeit: 2 Minuten

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?

  • 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

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 #ifdefSie 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 xund 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"

1368700cookie-check#wenn definiert (x) || (j) ; ist das gültig?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy