2014-01-21 66 views
5

我已被要求添加功能到現有的舊項目,但我無法讓它建立。 它處理unicode字符串,但我得到了很多有關使用TCHAR的錯誤。特別是幾乎每個錯誤都是TCHAR無法轉換爲或用作wchar_t。 從我在許多不同的文章中看到的,我嘗試使用#define _UNICODE或#define UNICODE,但沒有人解決了這個問題。使用TCHAR的錯誤,無法轉換爲wchar_t

這裏是一塊代碼的:

#include <windows.h> 
#include <wininet.h> 
#include <tchar.h> 
#include <iostream> 
#include <fstream> 
#include <strsafe.h> 
#include <string> 
#include <list> 
#include <cctype> 
#include <winnt.h> 
#include <atlconv.h> 

#pragma comment(lib,"wininet.lib") 

using namespace std; 

TCHAR *tags[] = { _T("aa"), _T("bb"), _T("cc"), 
NULL }; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 


int i = 0; 


for (i = 1; i<argc; i++) { 
    if (wcscmp(argv[i], _T("-h")) == 0) { 
     ... 
    } 
    else if (wcscmp(argv[i], _T("-f")) == 0) { 
     ... 
    } 


... 
} 

在上述線例如使用wcscmp時,我得到

argument of type "_TCHAR *" is incompatible with parameter of type "const wchar_t *" 
關於argv的

[I]

argument of type "const char *" is incompatible with parameter of type "const wchar_t *" 

regar ding _T(「 - h」)。

任何建議將非常感激。

回答

8

該代碼已被寫入目標Unicode而不是MBCS。這可以通過使用接受參數const wchar_t*wcscmp來辨別。

另一方面,有部分代碼使用TCHAR和相關的宏。現在,TCHAR是根據是否定義了_UNICODE或而解析爲charwchar_t的宏。詳情請諮詢documentation

TCHAR的使用源自開發人員希望爲Windows NT/2000(同時支持ANSI和Unicode API)和Windows 95/98(僅具有ANSI API)編寫代碼的日子。使用TCHAR允許使用通用的代碼庫。編譯定義爲NT/2000的_UNICODE,並編譯定義爲95/98的_MBCS

如果你用這種風格編碼,那麼你寫_tcscmp而不是wcscmp。對於Unicode版本,它解析爲wcscmp,對於MBCS版本,則解析爲_mbscmp

現在你通常不需要編寫代碼來支持95/98。你可以選擇忽略這些平臺。在這種情況下,您應該鎖定Unicode並停止使用TCHAR及相關的宏。將_T("..")替換爲L".."。將tmain替換爲wmain。將TCHAR替換爲wchar_t。等等。

您不需要進行這些更改。你可以簡單地定位Unicode,你的代碼將被編譯。但是,TCHAR成語已在您的代碼庫中不一致地應用。請注意使用_tmain,TCHAR,但也請撥打wcscmp。所以你的代碼無法編譯,除非它的目標是Unicode。所以你放棄TCHAR就不會丟失任何東西。你獲得的是清晰度。您可以停止使用這些宏,並避免它們提供的所有混淆。間接是一個很好的工具,但如果不需要,那麼它只會導致混淆和混淆。

+0

非常好的答案!我真的想知道這種編碼實際上是否有必要。感謝大衛! – yiannis

1

看起來你並沒有構建你的Unicode應用程序,因此請檢查你的項目設置。

如果您使用的是像wcscmp這樣的寬字符串函數,那麼使用_T()宏就沒有意義了,因爲您的come在非Unicode模式下編譯時無法編譯。如果需要在<tchar.h>(例如_tcscmp)中使用TCHAR知道的功能,則需要在兩種模式下編譯代碼。

如果你總是想一個字符串要寬,然後放置L在由例如L"Hello, world"

+0

感謝您的幫助。改變設置可解決問題,所以我想知道您說的是否有任何情況下我想在非Unicode模式下編譯? – yiannis

+0

@yiannis我試着在我的回答中解決這個問題。我認爲你應該做的不僅僅是切換到Unicode定位。我認爲你應該擺脫使用不一致的令人困惑的'TCHAR'成語。 –

1

如果您正在使用Visual Studio,設置字符集使用Unicode字符下項目配置設置物業

我想你可以使用#define UNICODE,但是確保在任何包含之前執行它。