2013-06-14 3 views
1

Учитывая следующий фрагмент кода:_splitpath_s: неправильный тип аргумента?

#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... 
} 

Компилятор выдает следующее сообщение об ошибке:

error 2665: '_splitpath_s' none of the 2 overloads could convert all the argument types

Что происходит не так? Я использую VS 2010 SP1.

Большое спасибо.

+0

Декларация plox! –

+0

Является ли это сборкой UNICODE? Если это так, первым аргументом будет 'wchar_t', который даст такую ​​ошибку. Вы также пропустили все аргументы 'size_t'. –

+0

По крайней мере один из параметров, которые вы передаете _splitpath_s, является неправильным типом. –

ответ

2

Если _UNICODE определена, то _TCHAR является wchar_t, так argv[0] является wchar_t*, который не конвертируется в char const* (это тип первого параметра _splitpath_s.

Список ошибок в Visual Studio показывает только . в первой строке каждой ошибки, для краткости полная ошибка компилятора, который можно найти в окне Output, является более информативным:

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, широкие строки предпочтительнее)

+0

..открытый. И чтобы сделать его более полным для таких парней, как я [некоторые основные сведения] (http://www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc) – fiscblog

+0

Возможно, вам захочется чтобы добавить подсказку в окно «Вывод», чтобы увидеть полное сообщение об ошибке. Программисты часто не знают, чтобы посмотреть там, чтобы получить лучшее сообщение. –

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, если вы не используете _TCHAR для drive, dir и т. Д. Или вместо этого вы должны использовать _tsplitpath_s. Или конвертировать все из них в ANSI или UNICODE.

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); 
Смежные вопросы