C++ 如何从std::wstring _TCHAR[]转换?
我正在使用一个库并从它的一个函数向我发送C++ 如何从std::wstring _TCHAR[]转换?,c++,windows,visual-c++,tchar,C++,Windows,Visual C++,Tchar,我正在使用一个库并从它的一个函数向我发送std::wstring,另一个库需要向它发送\u TCHAR[]。如何转换它?假设您使用的是Unicode构建,std::wstring.c_str()就是您所需要的。注意,c_str()保证它返回的字符串以null结尾 e、 g 如果您使用的是非Unicode构建,则需要通过将Unicode字符串转换为非Unicode字符串。正如@Zach Saw所说,如果您仅为Unicode构建,则可以使用std::wstring.c_str(),但从上下文角度来看
std::wstring
,另一个库需要向它发送\u TCHAR[]
。如何转换它?假设您使用的是Unicode构建,std::wstring.c_str()就是您所需要的。注意,c_str()保证它返回的字符串以null结尾
e、 g
如果您使用的是非Unicode构建,则需要通过将Unicode字符串转换为非Unicode字符串。正如@Zach Saw所说,如果您仅为Unicode构建,则可以使用std::wstring.c_str()
,但从上下文角度来看,最好定义tstring
(对于std::basic_string
,使用typedef
)因此,您可以安全地将这种字符串完美地用于所有需要TCHAR
s1的窗口和库函数
另外,您还应该为
TCHAR*
,因为TCHAR
s在编译时被解析为char
s或wchar\u t
s,但是您已经知道了\u UNICODE
还是在ANSI模式下编译,此功能都有效
即使不使用MFC,也可以使用这些宏。仅包括本例中显示的两个ATL头:
#include <string>
#include <Windows.h>
#include <AtlBase.h>
#include <AtlConv.h>
int main()
{
std::wstring myString = L"Hello, World!";
// Here is an ATL string conversion macro:
CW2T pszT(myString.c_str());
// pszT is now an object which can be used anywhere a `const TCHAR*`
// is required. For example:
::MessageBox(NULL, pszT, _T("Test MessageBox"), MB_OK);
return 0;
}
#包括
#包括
#包括
#包括
int main()
{
std::wstring myString=L“你好,世界!”;
//以下是ATL字符串转换宏:
CW2T pszT(myString.c_str());
//pszT现在是一个可以在任何地方使用的对象*`
//是必需的。例如:
::MessageBox(NULL,pszT,_T(“测试MessageBox”),MB_OK);
返回0;
}
另一个库是否接受常量?即,它是否打算更改数据?如果是的话,它可能会延长数据吗?是的,常数[]是可以的。它不打算更改数据。什么是_TCHAR在Unicode版本中定义为wchar,但在非Unicode版本中定义为char。我想wchar是因为我使用的是wstring?仅仅因为您使用的是std::wstring并不意味着TCHAR是wchar。查找你的构建定义。C++库可以期待<代码> TCHAR *<代码>。毕竟,C++在参数类型上有过载。这将是一个不寻常的构建,但MSVC的名字mangling可以处理它。大多数Win32 DLL还期望一个TCHAR,尽管名称的“MULLGLE”是通过“A/W”后缀宏建立起来的。编译的C++库不能真正地期望<代码> TCHAR *<代码>,它将有两个独立的(超载)函数,一个接受“代码> char */CODE”,一个接受“代码> WCARGYT*<代码>,否则,它无法处理使用\u UNICODE
宏的不同设置编译的项目。这正是我写便条的初衷。
#include <string>
#include <Windows.h>
#include <AtlBase.h>
#include <AtlConv.h>
int main()
{
std::wstring myString = L"Hello, World!";
// Here is an ATL string conversion macro:
CW2T pszT(myString.c_str());
// pszT is now an object which can be used anywhere a `const TCHAR*`
// is required. For example:
::MessageBox(NULL, pszT, _T("Test MessageBox"), MB_OK);
return 0;
}