2010-09-03 84 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