无法创建断言功能

时间:2011-09-15 22:48:07

标签: c++

这是我的断言函数(它不会编译“错误C2110:'+':不能添加两个指针”):

#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);
        }
    }

有关如何修复的想法吗?

5 个答案:

答案 0 :(得分:2)

字符串文字很容易简化为char指针,当您尝试使用"ERROR! Assert " + CHAR(x) + " failed. In file "...时,无法添加这些指针。但是,C ++具有在编译之前自动执行 的便利功能! (预处理器执行此操作)。更好的是,它有一个方便的工具,可以在编译时创建宽字符串。所以,你想要:

#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

答案 1 :(得分:0)

"ERROR! Assert "是一个以null结尾的C风格字符串。您无法在其上执行operator+

答案 2 :(得分:0)

编译错误很明显;您正在尝试将+运算符应用于字符串文字。解决这个问题的一种快速方法是将第一个字符串文字括在std::string()

正如@James McNellis指出的那样,请注意 FILE LINE 将指向断言函数声明的文件和行。

答案 3 :(得分:0)

你不能使用+运算符来连接两个char*;你需要printf或某种东西。

答案 4 :(得分:0)

一些问题:

  1. 通常,如果没有连接,断言应该进入调试器或转储。这不会。
  2. 如前所述,您的 LINE FILE 需要在宏中使用
  3. 您需要一对“帮助”宏才能使字符串正常工作
  4. 尝试以下几点:

    #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()); \
      }
    

    但是,请谨慎使用STL。我建议您让记录器的Write()函数接受变量参数并使用printf()或boost::format

    处理它们