1

给定以下代码:

#include <stdlib.h>
int _tmain(int argc, _TCHAR* argv[])
{
    char drive[_MAX_DRIVE];
    char dir[_MAX_DIR];
    char fname[_MAX_FNAME];
    char ext[_MAT_EXT];
    _splitpath_s( argv[0], drive, dir, fname, ext);
    // ...some more code...
}

编译器抛出以下错误:

错误 2665:'_splitpath_s' 2 个重载都不能转换所有参数类型

出了什么问题?我正在使用 VS 2010 SP1。

提前非常感谢。

4

3 回答 3

2

如果_UNICODE已定义,_TCHAR则为wchar_targv[0]awchar_t*也是,不可转换为char const*(这是_splitpath_s.

为简洁起见,Visual Studio 中的错误列表仅显示每个错误的第一行。您可以在“输出”窗口中找到来自编译器的完整错误信息,其中包含更多信息:

error C2665: '_splitpath_s' : none of the 2 overloads could convert all the argument types
    [...]\stdlib.h(797): could be 'errno_t _splitpath_s<3,256,256,256>(const char *,char (&)[3],char (&)[256],char (&)[256],char (&)[256]) throw()'
    while trying to match the argument list '(_TCHAR *, char [3], char [256], char [256], char [256])'

在完整的错误中,很明显唯一类型可能不匹配的参数是第一个参数,因为其他参数显然匹配。

如果您要使用_TCHAR,请在任何地方使用它和它的朋友。你的数组应该是数组,_TCHAR你应该使用_tsplitpath_s. 或者,根本不要使用_TCHAR,只在整个项目中使用窄字符串或宽字符串(在 Windows 上,最好使用宽字符串)

于 2013-06-14T07:10:58.250 回答
1

如果您使用的是 C,那么

/* _splitpath(path_buffer, drive, dir, fname, ext); */
_splitpath_s(path_buffer, drive, _MAX_DRIVE, dir, 
             _MAX_DIR, fname, _MAX_FNAME, ext, _MAX_EXT);

_tmain如果使用 C++,那么如果您不使用_TCHARfor drivedir等或者您应该使用,则没有任何理由使用_tsplitpath_s。或者将它们全部转换为 ANSI 或 UNICODE。

于 2013-06-14T07:18:58.713 回答
0

这对我有用:

wchar_t dir[_MAX_DIR] = {0};
wchar_t drive[_MAX_DRIVE] = {0};
wchar_t fname[_MAX_FNAME] = {0};
wchar_t ext[_MAX_EXT] = {0};
errno_t err;

std::wstring path = L"c:\\this\\is\\a\\test.exe";

err = _wsplitpath_s(path.c_str(),&drive[0],_MAX_DRIVE,&dir[0],_MAX_DIR,&fname[0],_MAX_FNAME,&ext[0],_MAX_EXT);
于 2018-01-18T22:38:35.933 回答