From: Mark T. <mb...@do...> - 2003-03-03 12:22:51
|
On Sun, 2 Mar 2003, Stephen Torri wrote: > >How can this macro be modified so that it can print out the expression? >The reason that asserts were replaced is that there typically is no >explanation given beyond the assert expression as to why it failed. > Try this: #ifndef NDEBUG #define XINE_ASSERT(exp, desc, args...) \ do { \ if (!(exp)) { \ printf("%s:%s:%d: assertion `%s' failed. " desc "\n\n", \ __FILE__, __XINE_FUNCTION__, __LINE__, #exp , ##args); \ print_trace(); \ abort(); \ } \ } while(0) #else #define XINE_ASSERT(...) do { } while(0) #endif It handles the NDEBUG macro, expressions with % characters in, and I've verified it works (at least in principle) on gcc 2.95.3, gcc 3.2.2 and icc 7.0.065 (though this complains about `do {...} while(0)' wrappers... sigh). The spacing around the ``##args'' argument is important, as the gcc 2 preprocessor has parsing problems. Regards, Mark. Mark Thomas \ Computing Year 4 \ Imperial College / United Kingdom / Despite the high cost of living, it remains popular. |