用CString代替LPCTSTR安全吗?



函数参数需要一个LPCTSTR类型变量;如果我们传递一个CString类型的变量呢?这是安全的吗,还是我们在这个案子里需要注意什么?

例如:

Add(new CAToolbar, _T("Command Toolbar"), xtpBarTop);

这里我想用CString str;代替_T("Command Toolbar")(LPCTSTR型)。像这样:

Add(new CAToolbar, str , xtpBarTop);

安全吗?

在这种情况下是否安全,或者我们应该注意什么?

通常(见下面的注释),是的,它是安全的。CString类有一个operator LPCTSTR(),它返回字符串的内容作为c风格的,以空结束的charwchar_t数组(好吧,指向它的第一个元素的指针),这取决于当前编译器对"字符集"的设置。选项(即是否定义UNICODE和/或_UNICODE)。因此,返回的类型将(或应该)匹配函数参数所需的const char*vsconst wchar_t*指针类型。(注意,对于不符合const标准的函数参数,不是安全的)。

在"旧时代",我使用的一些编译器在执行此操作时会抱怨"隐式"转换,因此我使用CString::GetString()函数代替。然而,这些确实是。同样的道理。从"atlsimpstr. "标题:

template< typename BaseType , bool t_bMFCDLL = false>
class CSimpleStringT
{
//...
operator PCXSTR() const throw()
{
return( m_pszData );
}
//...
PCXSTR GetString() const throw()
{
return( m_pszData );
}
//...

重要提示:使用这种"隐式转换"的一种情况不是safe用于接受可变参数的函数,如printfCString本身的.Format()成员;在这种情况下,编译器将(正确地)抱怨类对象的不可移植使用。以以下代码为例:

#include <afx.h>
int main()
{
CString param = _T("param");
CString text;
text.Format(_T("Param is %s"), param);
return 0;
}

clang-cl编译器给出这个错误:

错误:不能传递非平凡类型的对象'CString'(即'CStringT<wchar_t,>>')通过variadic方法;调用将在运行时中止[-Wnon-pod-varargs]

甚至MSVC本身也给出了:

警告C4840:不可移植使用类"ATL:: CStringT在祝辞的作为可变函数

的参数

在这种情况下,您可以使用前面提到的.GetString()函数,或者使转换显式:

text.Format(_T("Param is %s"), param.operator LPCTSTR());
// or ...
text.Format(_T("Param is %s"), static_cast<LPCTSTR>(param));

CString包含LPCTSTR的隐式转换运算符。

这是一个事实,你传递的const字符串不能被修改,这使得它是安全的。

最新更新