这是我的断言函数(它不会编译“错误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);
}
}
有关如何修复的想法吗?
答案 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".");
答案 1 :(得分:0)
"ERROR! Assert "
是一个以null结尾的C风格字符串。您无法在其上执行operator+
。
答案 2 :(得分:0)
编译错误很明显;您正在尝试将+运算符应用于字符串文字。解决这个问题的一种快速方法是将第一个字符串文字括在std::string()
。
正如@James McNellis指出的那样,请注意 FILE 和 LINE 将指向断言函数声明的文件和行。
答案 3 :(得分:0)
你不能使用+运算符来连接两个char*
;你需要printf
或某种东西。
答案 4 :(得分:0)
一些问题:
尝试以下几点:
#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
处理它们