2010-09-03 28 views
0

设定在一个项目,我需要设置“使用Unicode字符集”配置属性>常规>字符集。使用Unicode字符在VS 2008中的项目设置

在编译项目,错误C2664返回这个代码:

char Filename[25] = {0}; 
GetLocalTime(&st); 
sprintf(Filename,TEXT("C:\\CpmMicr%02d%02d%04d.log"), st.wDay,st.wMonth,st.wYear); 

当我改变了字符集配置为“未设置”或“多字节字符集” 项目编译没有任何错误。

请建议我上应该做些什么来解决这个问题。

感谢您的任何潜在的建议。

Lakshmi。

回答

1

这是因为你使用了TEXT宏。如果用定义的_UNICODE进行编译,它会自动将L放在字符串文字之前。由于您使用了非Unicode函数sprintf(),因此爆炸了。它想要一个char *,而不是wchar_t *。

这里有三种基本方案:

  1. 删除文本宏
  2. 使用TCHAR和相应的字符串函数始终
  3. 使用Unicode声明在你的代码,为wchar_t []和标准的swprintf()。

没有真正意义上的2,没有主流操作系统左边那个不是原生的Unicode。

+0

嗨汉斯帕桑特, 解决方案3,这是上述固定的错误。因为我迁移旧项目向VS2008,有很多地方,这些修补程序有被应用,有没有在项目设置任何其他可能的修改,可以产生相同的结果? 拉克希米。 – Lakshmi 2010-09-03 15:21:00

+0

好,如果在ansi字符串函数中使用TEXT()或_T(),那么代码中会有很多错误,请告诉你关于他们的事情。否则没有魔术棒来修复这样的错误。 – 2010-09-03 15:33:16

+0

这是一个宏的宏。智能感知只显示你的第一关。这与你的问题有什么关系? – 2010-09-03 16:02:39

1

非常难以给出一个确切的修正而代码(请张贴相关部分),但有可能你正试图分配一个char *于WCHAR *或反之亦然。 例如

std::basic_string<wchar_t> someString("test"); //C2664 here 

应该

std::basic_string<wchar_t> someString(L"test"); 

编辑:在你的代码的问题是,你使用TEXT宏,以便在一个Unicode生成,这将是一个宽字符,sprintf的需要为const char *虽然。我不知道为什么它曾经在VS的早期版本中工作?使用wsprintf并将Filename更改为宽字符,或者删除TEXT宏。

+0

OK,..没有编译器不要选择Unicode字符集时,添加之前“测试”,“L”?下面是返回错误c2664的代码:char Filename [25] = {0}; GetLocalTime(&st); sprintf(文件名,TEXT(“C:\\ CpmMicr%02d%02d%04d.log”),st.wDay,st.wMonth,st.wYear); – Lakshmi 2010-09-03 15:01:59

+0

删除TEXT宏同样适用 由于我“M迁移旧项目向VS2008,有很多地方,这些修补程序已得到应用。我想知道,如果在项目设置任何可能的修改,可能会产生同样的结果? – Lakshmi 2010-09-03 15:28:23