Tiago Costa
Tiago Costa

Reputation: 4251

Trouble creating assert function

This is my assert function (it wont compile "error C2110: '+' : cannot add two pointers"):

#define CHAR(x) #x

template<typename T>
inline void ASSERT(T x)
{
    if(!x)
    {
        std::string s("ERROR! Assert " + CHAR(x) + " failed. In file " + __FILE__ +
                      " at line " + __LINE__ + ".");
            std::wstring temp(s.length(), L' ');
            std::copy(s.begin(), s.end(), temp.begin());
            getLogger().Write(temp);
        }
    }

Any idea of how to fix it?

Upvotes: 1

Views: 224

Answers (5)

NuSkooler
NuSkooler

Reputation: 5525

A few issues:

  1. Generally an assert should break into the debugger or dump if one is not attached. This will not.
  2. As already mentioned, your LINE and FILE require use in a macro
  3. You need a couple "helper" macros to get the strings working properly

Try something along these lines:

#define ASSERT_QUOTE_(x) #x
#define ASSERT_QUOTE_(x) ASSERT_QUOTE_(x)

#define MY_ASSERT(cond) \
  if(cond) {} else { \
    std::stringstream ss; \
    ss << "ERROR! Assert " << ASSERT_QUOTE(cond) << " failed. In file " << __FILE__ << " at line " << __LINE__ << "."; \
    getLogger().Write(ss.str()); \
  }

Be careful trying to use STL here however. I suggest you have your logger's Write() function take variable arguments and process them with printf() or perhaps boost::format

Upvotes: 0

Mooing Duck
Mooing Duck

Reputation: 66981

String Literals are easily reduced to char pointers, which cannot be added as you try to do with "ERROR! Assert " + CHAR(x) + " failed. In file ".... However, C++ has the handy feature of doing this automatically before compilation! (the preprocessor does this). Even better, it has a handy tool for making wide strings at compile time. So, you want:

#define _T(x) L ## x
#define CHAR(x) #x
#define CHAR2(x) CHAR(x)
#define ASSERT(x) ASSERT2(x, CHAR(x), __FILE__, CHAR2(__LINE__))
#define ASSERT2(x, t, f, l) \
if(!x) \
    getLogger().Write(L"ERROR! Assert " _T(t) L" failed. In file " _T(f) L" at line " _T(l) L".");

http://ideone.com/0ibcj

Upvotes: 2

Igor
Igor

Reputation: 27268

"ERROR! Assert " is a null-terminated, C-style string. You can't execute operator+ on it.

Upvotes: 0

JRL
JRL

Reputation: 78033

You cannot use the + operator to concatenate two char*s; you need printf or some sort of thing for that.

Upvotes: 0

K-ballo
K-ballo

Reputation: 81409

The compiler error is quite clear; you are trying to apply the + operator to string literals. A quick way to fix it is enclosing the first string literal in std::string().

As @James McNellis pointed out, note that FILE and LINE will point to the file and line of the assert function declaration.

Upvotes: 0

Related Questions