_splitpath_s:错误的参数类型?

时间:2013-06-14 07:00:06

标签: c++ c visual-studio-2010

给出以下代码:

#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。

提前多多感谢。

3 个答案:

答案 0 :(得分:2)

如果_UNICODE已定义,则_TCHARwchar_t,因此argv[0]wchar_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上,最好使用宽字符串)

答案 1 :(得分: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);

如果使用C ++,如果您没有_tmain用于_TCHARdrive等,或者您应该使用dir,则没有任何理由使用_tsplitpath_s {1}}而是。或者将它们全部转换为ANSI或UNICODE。

答案 2 :(得分:0)

这对我有用:

$( "<span class='checkmark'></span>" ).insertAfter( ".layered_attrs[type='checkbox']" );