我尝试了以下方法:
tstringstream s;
s << _T("test") << std::endl;
LPTSTR message = s.str().c_str();
Log(5, _T("Example", message);
其中日志的定义如下:
void Log(DWORD dwSeverity, LPTSTR szAppID, LPTSTR szMsgString, ...)
{
}
但是我得到以下错误:
Error: A value of type "const char *" cannot be used to initialize an entity of type "LPTSTR"
但是我不确定如何处理这种转换。在我的例子中,我正在使用msvc++编译器编译一个多字节字符集应用程序。在这些条件下,LPTSTR被定义为LPSTR,它被定义为CHAR *.
您正在点击const
-不兼容。由于某些原因,函数Log
接受一个指向可变数据的指针,这与c_str()
返回的指向const
数据的指针不兼容。
如果你有这个选项,改变Log
把它的参数作为const
(我假设它实际上没有修改传入的字符串):
void Log(DWORD dwSeverity, LPCTSTR szAppID, LPCTSTR szMsgString, ...)
同理,将message
声明为LPCTSTR
。
还要注意的是,你不能像现在这样初始化message
: str()
返回的字符串是临时的,所以你必须存储它:
tstring message = s.str();
Log(5, _T("Example", message.c_str());
如果Log
不在您的控制范围内,但您知道不会修改的参数,则可以使用const_cast
:
LPTSTR message = const_cast<LPTSTR>(message.c_str()); // `message` changed as above
如果你不能保证Log
在内部做什么,你必须创建一个可变缓冲区:
std::vector<TCHAR> buffer(message.begin(), message.end());
buffer.push_back(0);
Log(5, _T("Example", &buffer[0]);
我可以看到几个问题。
首先在这里:
LPTSTR message = s.str().c_str();
对s.str()
的调用返回一个临时对象,除非你保持它存活,否则它将被销毁。因此,调用c_str()
返回的地址无效。您需要一个临时的本地:
string str = s.str();
LPCTSTR message = str.c_str();
由于c_str()
返回一个const C字符串,你也需要声明message为一个const C字符串。
另一个问题是,你的Log
函数接收一个非const C字符串,但c_str()
返回一个const C字符串。假定Log
函数不需要修改消息,那么为什么要请求一个可修改的缓冲区呢?更改Log
以接收const C字符串:
void Log(..., LPCTSTR szMsgString, ...)
最后,既然这是c++,为什么要使用C字符串呢?最好使用c++字符串