![](/img/trans.png)
[英]Why do I get "argument of type "LPCSTR" is incompatible with parameter of type "LPCWSTR" error when code compiles fine?
[英]Argument of type “LPCWSTR” is incompatible of the parameter of type “LPCSTR”
有人可以告诉我为什么我会出错。 我一直试图弄清楚这一点。
LPCWSTR drive2[4] = { L"C:\\", L"D:\\", L"E:\\", L"F:\\" };
int i;
UINT test;
for (i = 0; i<12; i++)
{
test = GetDriveType(drive2[i]); //anything from here with "drive2[i]" is an error.
switch (test)
{
case 0: ::MessageBox(Handle, drive2[i], "0 cannot be determined", MB_OK);
break;
case 1: ::MessageBox(Handle, drive2[i], "1 invalid", MB_OK);
break;
case 2: ::MessageBox(Handle, drive2[i], "2 removable", MB_OK);
break;
case 3: ::MessageBox(Handle, drive2[i], "3 fixed", MB_OK);
break;
default: "Unknown value!\n";
谢谢!
LPCWSTR
是const wchar_t*
的别名。
您正在使用GetDriveType()
和MessageBox()
函数的TCHAR
版本。 如果UNICODE
在编译时定义,则TCHAR
映射到wchar_t
,否则映射到char
。
您的drive2
变量是一个wchar_t
指针数组,因此为了将drive2[i]
按原样传递给GetDriveType()
和MessageBox()
,您必须为 Unicode 编译您的项目(即,使UNICODE
有条件地在编译时定义-time),这将使GetDriveType()
map 到GetDriveTypeW()
和MessageBox()
map 到MessageBoxW()
以便它们只接受宽( wchar_t
) 字符串。 否则, GetDriveType()
将 map 到GetDriveTypeA()
和MessageBox()
将 map 到MessageBoxA()
所以它们只接受窄( char
)字符串。
您正在将窄字符串文字传递给MessageBox()
,这在为 Unicode 编译时将不起作用。 如果您不为 Unicode 编译,则不能将宽字符串传递给TCHAR
函数 - 这听起来像您的情况,因为错误消息抱怨将const wchar_t*
指针传递给const char*
参数。
在定义UNICODE
时,您需要使用TEXT()
宏来使字符串文字变宽,而不是变窄。
我还建议将TEXT()
用于您的drive2
数组中的字符串文字,以匹配您将数组元素传递给的TCHAR
函数。
此外,您的循环超出了drive2
数组的范围。
话虽如此,试试这个:
LPCTSTR drive2[4] = { TEXT("C:\\"), TEXT("D:\\"), TEXT("E:\\"), TEXT("F:\\") };
int i;
UINT test;
for (i = 0; i < 4; i++)
{
test = GetDriveType(drive2[i]);
switch (test)
{
case 0:
::MessageBox(Handle, drive2[i], TEXT("0 cannot be determined"), MB_OK);
break;
case 1:
::MessageBox(Handle, drive2[i], TEXT("1 invalid"), MB_OK);
break;
case 2:
::MessageBox(Handle, drive2[i], TEXT("2 removable"), MB_OK);
break;
case 3:
::MessageBox(Handle, drive2[i], TEXT("3 fixed"), MB_OK);
break;
default:
::MessageBox(Handle, drive2[i], TEXT("Unknown value!"), MB_OK);
break;
}
}
否则,如果你想专门处理wchar_t
(你应该这样做),那么直接使用基于 Unicode 的 function 定义,并且只使用宽字符串文字,根本不要处理TCHAR
:
LPCWSTR drive2[4] = { L"C:\\", L"D:\\", L"E:\\", L"F:\\" };
int i;
UINT test;
for (i = 0; i < 4; i++)
{
test = GetDriveTypeW(drive2[i]);
switch (test)
{
case 0:
::MessageBoxW(Handle, drive2[i], L"0 cannot be determined", MB_OK);
break;
case 1:
::MessageBoxW(Handle, drive2[i], L"1 invalid", MB_OK);
break;
case 2:
::MessageBoxW(Handle, drive2[i], L"2 removable", MB_OK);
break;
case 3:
::MessageBoxW(Handle, drive2[i], L"3 fixed", MB_OK);
break;
default:
::MessageBoxW(Handle, drive2[i], L"Unknown value!", MB_OK);
break;
}
}
LPCSTR
是const char*
,而LPCWSTR
是const wchar_t*
,它们不兼容。
C++ 中的宽字符串声明: LPCWSTR string = L"Wide string";
正则字符串: LPCSTR string = "Regular string";
如果你想使用宽字符串,你需要使用W
版本,在你的情况下,使用GetDriveTypeW
。
请注意, GetDriveType
不是 function,它是一个宏,如果您的代码以 ASCII 模式(默认)编译,则扩展为GetDriveTypeA
,但如果代码以 UNICODE 模式编译,则扩展为GetDriveTypeW
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.