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 before
static_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?