class MyString { public: MyString(const std::wstring& s2) { s = s2; } operator LPCWstr() const { return s.c_str(); } private: std::wstring s; }; int _tmain(int argc,_TCHAR* argv[]) { MyString s = L"MyString"; CStringW cstring = L"CString"; wprintf(L"%sn",(LPCWSTR)cstring); // Okay. Becase it has an operator LPCWstr() wprintf(L"%sn",cstring); // Okay,fine. But how? wprintf(L"%sn",(LPCWSTR)s); // Okay. fine. wprintf(L"%sn",s); // Doesn't work. Why? It prints gabage string like "?." return 0; }
如何将CString传递给格式string%s?
顺便说一句, MSDN说 (这很奇怪)
在variables参数函数中使用CString对象
将CString显式转换为LPCTSTRstring,如下所示:
CString kindOfFruit = "bananas"; int howmany = 25; printf( "You have %d %sn",howmany,(LPCTSTR)kindOfFruit );
Nginx为dynamic生成的文件设置错误的Content-Type头
我可以假设长整型的大小总是4个字节?
Windows窗体 – validationDataGridViewinput
“整型”是什么意思?
plain C:用fopen()打开一个目录
在Windows中识别文件types
我如何将BOOL转换为BOOL?
CString是专门设计的,它只包含一个指向缓冲区类中的字符串数据的指针。 它通过值传递给printf,然后在格式化字符串中看到“%s”时将其作为指针处理。
它最初只是碰巧和printf一起工作,但后来被保留为类接口的一部分。
wprintf(L"%sn",(LPCWSTR)cstring); // Okay. It's been cast to a const wchar_t*. wprintf(L"%sn",cstring); // UNDEFINED BEHAVIoUR wprintf(L"%sn",(LPCWSTR)s); // Okay,it's a const wchar_t*. wprintf(L"%sn",s); // UNDEFINED BEHAVIoUR
你可以传给这个函数的唯一的东西是const wchar_t* 。 任何其他的是未定义的行为。 传递CString只是恰好工作。
有一个原因是iostream是用C ++开发的,这是因为这些可变参数函数是非常不安全的,所以永远不会被使用。 哦,CString也是一个罪恶,因为很多原因,坚持std::wstring和cout / wcout无论你在哪里。
class CStringA { char* m_pString; };
虽然它不是char* (即使是ANSI CString),它也差不多是一样的。 当你将CString对象传给任何printf函数族(包括你的自定义实现,如果有的话),你传递的是CString对象(在堆栈上)。 %s解析导致它读取,就好像它是一个指针 – 在这种情况下(这是第一个字节的数据是m_pString ),这是一个有效的指针。
一般来说这是不确定的行为。 根据这篇文章, Visual C ++只是调用从CString到POD类型的转换来覆盖你 – 这是允许的未定义行为的实现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。