如何将字符串流的内容传递给接受LPTSTR的方法?



我尝试了以下方法:

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++字符串

相关内容

最新更新