Ist das legales C++



  • Ist folgendes Makro legal?

    #define SFASSERT( expr, dscrp ) \
    #ifdef _WIN32 \
    { sfassert::assert( ( expr ), ( dscrp ), __LINE__, __FILE__ ); } \
    #else
    assert( ( ( expr ) && ( dscrp ) ) ) \
    #endif
    #endif
    

    Unter windows möcht ich ne MessageBox-Anzeige haben und unter anderen Systemen das ganz normale standard-assert.

    Wenn ich mit int 3h nen breakpoint an der Stelle setzen möchte, wie kann ich prüfen ob es sich um eine x86-Plattform handelt?
    Und wo sollte ich das int 3h hinsetzen? vor das assert oder nach dem assert?



  • Da ist ein endif zuviel. Das mit dem Breakpoint musst du auch über bedingte Kompilierung regeln.



  • DebugBreak (WinAPI)



  • Das letzte #endif gehört zum include-guard.

    Das mit DebugBreak ist ne gute Idee 🙂

    Werde es jetzt so machen, dass ich nen eigenen Dialog statt ner MessageBox nehme und man per Knopfdruck das Debuggen starten kann, je nachdem möchte man ja trotzdem weitermachen auch wenn nen assert gegriffen hat.



  • Legal ist nur das, wo ich eine Lizenz für besitze
    ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ ⚠ :



  • Also nicht für deine Interpretation der deutschen Sprache, oder ?
    ^^



  • Ich würde es mal folgendermassen korrigieren:

    #ifdef _WIN32
    #define SFASSERT( expr, dscrp ) \
      do { \
        sfassert::assert( ( expr ), ( dscrp ), __LINE__, __FILE__ ); } \
      while(false)
    #else
    #define SFASSERT( expr, dscrp ) \
      assert( ( ( expr ) && ( dscrp ) ) )
    #endif
    

    In einem #define-Makro sollte man keine weiteren Präprozessoranweisungen verwenden. Könnte sein, daß es einen Compiler gibt, der das versteht, aber die Regel ist das nicht.
    Ausserdem habe ich dieses sfassert-blah in ein do-while-Konstrukt gepackt. Dadurch ist es syntaktisch wie das assert zu behandeln. Betrachte mal folgendes:

    if (bedingung_b)
      SFASSERT(a==b, "blah")
    anweisung;
    

    Im Falle von _WIN32 (ohne meine Korrektur) ergibt das syntaksch korrekten Code. Ohne _WIN32 kommt ein Syntaxfehler heraus.

    Tommi



  • Statt der While-Schleife kann man glaub ich auch

    (static_cast<void>(0))

    am Ende hinzufügen um den Fehler mit dem fehlenden Semikolon zu vermeiden!



  • Hm entweder ich bin blind oder du hast nur bei der _WIN32 Variante etwas verändert 😕

    Und was genau ändert das do-while, die Anweisung unter dem SFASSERT steht doch je nach Debug oder Release Version in unterschiedlichen Codeblöcken, oder gibt es durch das do-while da ne Ausnahme? Und was hat es mit dem static_cast trick auf sich?



  • das erzwingt das semikolon. wenn du sowas nicht machst kann man code bauen wie tntnet ihn gepostet hat.



  • Achso jetzt versteh ich das (und auch erst eben bemerkt, dass beim do-while das semikolon fehlt) 🙂


Anmelden zum Antworten