为什么不能将TCHAR *转换为char *

时间:2010-02-18 10:33:49

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

错误C2664:'strcpy':无法将参数1从'TCHAR *'转换为'char *' 代码:

LPCTSTR name, DWORD value
strcpy (&this->valueName[0], name);

错误C2664:'strlen':无法将参数1从'LPCTSTR'转换为'const char *'

LPCTSTR name; 
strlen (name)     

上面的代码在另一个项目中工作正常的类,我找不到它在MS VS2010项目中不起作用的原因。

4 个答案:

答案 0 :(得分:13)

定义_UNICODE时,需要使用wcstombs等函数。或者只是在TCHAR字符串上使用_tcslen(在 Generic-Text Routine Mappings 下查看),编译器会将它传输到strlen或wcslen,具体取决于您是否使用unicode。

答案 1 :(得分:7)

可能是因为TCHAR在你的一个项目中被定义为char,但在VS2010中可能不是wchar_t。

如果您的项目定义了UNICODE / _UNICODE,这与在项目设置中将其指定为Unicode构建相同,则TCHAR将为wchar_t。

你基本上需要决定是否使用Unicode,如果你这样做,你需要将对strncpy等的常规调用更改为宽字符等效或使用改变与TCHAR相同方式的t变体。查看strncpy或其他函数的帮助,以查看调用宽变量或t变量的内容。

您还可以查看MSDN以获取strcpy等调用,您可以在其中看到宽字符版本称为wcscpy,而t版本称为_tcscpy。如果你打算在不同项目中使用UNICODE或不使用UNICODE的代码,或者做出明智的决定你将使用哪一个然后坚持下去,我建议你坚持使用t版本。哪个更好取决于我会说的情景,并可能会引用一些“宗教”意见......

答案 2 :(得分:4)

您的项目是否为unicode项目?如果是这样,我认为TCHAR将等同于wchar_t而不是char,这会使您的转化尝试无效。 See here了解更多信息。

答案 3 :(得分:4)

这里有一些代码可以帮到你,它最初发布在www.wincli.com/?p=72但在这里我把它封装成一个小类:)

class char_args
{
private:
char **l_argn;
int arg_num;

int wstrlen(_TCHAR * wstr)
{
    int l_idx = 0;
    while (((char*)wstr)[l_idx] != 0) l_idx += 2;
    return l_idx;
}

// Allocate char string and copy TCHAR->char->string
char *wstrdup(_TCHAR *wSrc)
{
    int l_idx = 0;
    int l_len = wstrlen(wSrc);
    char *l_nstr = (char *)malloc(l_len);
    if (l_nstr) {
        do {
            l_nstr[l_idx] = (char)wSrc[l_idx];
            l_idx++;
        } while ((char)wSrc[l_idx] != 0);
    }
    l_nstr[l_idx] = 0;
    return l_nstr;
}

char_args & operator=(const char_args&); // does not allow assignment of class
char_args(const char_args&); // does not allow copy construction

public:
char_args(int argcc, _TCHAR* argv[]) : arg_num(argcc)
{
    l_argn = (char **)malloc(argcc *sizeof(char*));
    for (int idx = 0; idx < argcc; idx++) l_argn[idx] = wstrdup(argv[idx]);
}

~char_args()
{
    for(int idx = 0; idx < arg_num; idx++) if (l_argn[idx]) free(l_argn[idx]);
    free(l_argn);
}

const char * operator[](const int &i)
{
    if (i < arg_num) return l_argn[i]; else return 0;
}

const int argc() { return arg_num; }
};

以下是使用代码的演示:

int _tmain(int argc, _TCHAR* argv[])
{
  char_args C_ARGV(argc, argv);
  for(int i = 0; i  < C_ARGV.argc(); i++) cout << C_ARGV[i] << endl;
}