函数参数需要一个LPCTSTR
类型变量;如果我们传递一个CString
类型的变量呢?这是安全的吗,还是我们在这个案子里需要注意什么?
例如:
Add(new CAToolbar, _T("Command Toolbar"), xtpBarTop);
这里我想用CString str;
代替_T("Command Toolbar")
(LPCTSTR
型)。像这样:
Add(new CAToolbar, str , xtpBarTop);
安全吗?
在这种情况下是否安全,或者我们应该注意什么?
通常(见下面的注释),是的,它是安全的。CString
类有一个operator LPCTSTR()
,它返回字符串的内容作为c风格的,以空结束的char
或wchar_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用于接受可变参数的函数,如printf
或CString
本身的.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
字符串不能被修改,这使得它是安全的。