Search code examples
c++loggingdebuggingassert

Adding message to assert


I'm looking for a way to add custom messages to assert statements. I found this questions Add custom messages in assert? but the message is static there. I want to do something like this:

assert((0 < x) && (x < 10), std::string("x was ") + myToString(x));

When the assertion fails I want the normal output plus for example "x was 100".


Solution

  • You are out of luck here. The best way is to define your own assert macro.

    Basically, it can look like this:

    #ifndef NDEBUG
    #   define ASSERT(condition, message) \
        do { \
            if (! (condition)) { \
                std::cerr << "Assertion `" #condition "` failed in " << __FILE__ \
                          << " line " << __LINE__ << ": " << message << std::endl; \
                std::terminate(); \
            } \
        } while (false)
    #else
    #   define ASSERT(condition, message) do { } while (false)
    #endif
    

    This will define the ASSERT macro only if the no-debug macro NDEBUG isn’t defined.

    Then you’d use it like this:

    ASSERT((0 < x) && (x < 10), "x was " << x);
    

    Which is a bit simpler than your usage since you don’t need to stringify "x was " and x explicitly, this is done implicitly by the macro.