Asserts mit g++ 3.2



  • Hallo
    Ich habe einen eigenartigen Bug an meinem g++ entdeckt:

    // assertIt.cpp
    #include <cassert>
    int main()
    {
            std::assert(1 == 1);
    }
    

    prdouziert folgenden Fehler:

    assertIt.cpp: In function int main()': assertIt.cpp:5: error: parse error beforestatic_cast'

    wohingegen dieser Code:

    //assertIt.c
    #include <assert.h>
    int main()
    {
            assert(1 == 1);
            return 0;
    }
    

    fehlerfrei kompiliert.

    Dieser Fehler lässt sich auf 2 Gentoo GNU/ Linux Systemen mit gcc-3.3.2 respektive gcc-3.2.3-r2 reproduzieren.

    Woran könnte das liegen?

    edit: Der relevante Teil meiner /usr/include/assert.h sieht folgendermaßen aus:

    // schnipp
    #if defined __cplusplus && __GNUC_PREREQ (2,95)
    # define __ASSERT_VOID_CAST static_cast<void>
    #else
    # define __ASSERT_VOID_CAST (void)
    #endif
    // schnapp
    /* This prints an "Assertion failed" message and aborts.  */
    extern void __assert_fail (__const char *__assertion, __const char *__file,
                               unsigned int __line, __const char *__function)
         __THROW __attribute__ ((__noreturn__));
    // schnipp
    # define assert(expr) \
      (__ASSERT_VOID_CAST ((expr) ? 0 :                                           \
                           (__assert_fail (__STRING(expr), __FILE__, __LINE__,    \
                                           __ASSERT_FUNCTION), 0)))
    

    (Naja, vielleicht ist das nicht wirklich der wichtige Teil aber da blicke ich noch halbwegs durch 😉 )



  • Gegenfrage: Kennst du einen Compiler, der std::assert kann? IMHO muss assert, wenn wir mal Compilermagie ausschließen, als Makro implementiert werden. Und das bedeutet, dass es nicht in einen Namespace gepackt werden kann, selbst wenn es in <cassert> steht.



  • *lol*
    OK, alles klar! 🙂
    (Peinlich; ich poste hier zwar sogar das Makro aber die Lösung meines Problems erkenne ich nicht... )
    Danke, Bashar! 👍



  • Was hat denn dieser __ASSERT_VOID_CAST zu bedeuten? Wofür ist der gut?



  • Der sorgt dafür, dass der assert-Ausdruck den Typ void hat, wie vom Standard gefordert.



  • Und warum fordert der Standard diesen Typ? 🙄

    Will mir nicht so ganz einleuchten. 💡



  • Damit du das Ergebnis nicht weiterverwendest?


Anmelden zum Antworten