1. 程式人生 > >C++中_T()和L的區別

C++中_T()和L的區別

前言

本文旨在介紹於VC++常見的兩個型別:_T()和L

概念

字串前面加L表示該字串是Unicode字串。

_T是一個巨集,如果專案使用了Unicode字符集(定義了UNICODE巨集),則自動在字串前面加上L,否則字串不變。因此,Visual  C++裡面,定義字串的時候,用_T來保證相容性。VC支援ascii和unicode兩種字元型別,用_T可以保證從ascii編碼型別轉換到unicode編碼型別的時候,程式不需要修改。

分析

一、在字串前加一個L作用: 

如 L"我的字串" 表示將ANSI字串轉換成unicode的字串,就是每個字元佔用兩個位元組。 
strlen("asd") = 3; 

strlen(L"asd") = 6; 

二、 

_T巨集可以把一個引號引起來的字串,根據你的環境設定,使得編譯器會根據編譯目標環境選擇合適的(Unicode還是ANSI)字元處理方式 。
如果你定義了UNICODE,那麼_T巨集會把字串前面加一個L。這時 _T("ABCD") 相當於 L"ABCD" ,這是寬字串。 

如果沒有定義,那麼_T巨集不會在字串前面加那個L,_T("ABCD") 就等價於 "ABCD" 

三、TEXT,_TEXT 和_T 一樣的 

如下面三語句: 
TCHAR szStr1[] = TEXT("str1"); 
char szStr2[] = "str2"; 

WCHAR szStr3[] = L("str3"); 

那麼第一句話在定義了UNICODE時會解釋為第三句話,沒有定義時就等於第二句話。
但第二句話無論是否定義了UNICODE都是生成一個ANSI字串,而第三句話總是生成UNICODE字串。 

為了程式的可移植性,建議都用第一種表示方法。但在某些情況下,某個字元必須為ANSI或UNICODE,那就用後兩種方法。

總結

你要確定你需要的字串是寬字元還是窄字元。_T("")是說如果你定義了UNICODE 
那麼就是L"",沒有定義就是"";以下情況用_T()比較好,其他情況最好別用:
1,用THCAR,LPTSTR,LPCTSTR等tchar資料型別的時候

2,用_tprintf之類的_t版本執行時函式時候
3,像下面這樣有w和a版本的api,呼叫CreateFile的時候
#ifdef 
UNICODE
#define CreateFile CreateFileW
#else
#define CreateFile 
CreateFileA

#endif // !UNICODE

附錄

相關推薦

C++_T()L區別

前言 本文旨在介紹於VC++常見的兩個型別:_T()和L 概念 字串前面加L表示該字串是Unicode字串。 _T是一個巨集,如果專案使用了Unicode字符集(定義了UNICODE巨集),則自動在字串前面加上L,否則字串不變。因此,Visual  C++裡面,定義字串的

c++區別

string.h string.h是C語言裡面關於字元陣列的函式定義的標頭檔案,常用函式有strlen、strcmp、strcpy等等,更詳細的資訊可以自己檢視(面向過程) cstring CString常用於MFC程式設計中,是屬於MFC的類,如從對話方塊中利用GetW

C#closedispose區別

Close是停業整頓 Dispose是炸燬 停業了,可以通過公關,再重開。物還是原來的物 炸燬了,想再開張,就只有重頭建起 C#中解構函式是有垃圾蒐集器來呼叫的,當所引用的堆上的資料當無效時,會隱式呼叫。一般表現為當引用變數超出其作用域時就會呼叫。 Close函式和Dis

C++ #if #ifdef 區別

fde 編譯器 就是 開頭 編譯程序 如果 都是 條件 程序 以#開頭的都是預編譯指令,就是在正式編譯之前,編譯器做一些預處理的工作#if 條件語句程序段1 //如果條件語句成立,那麽就編譯程序段1#endif程序段2//如果條件不語句成立,那麽就編譯程序段2#ifndef

C#&&&,|||區別

.com blank img cnblogs png ref bsp 筆記 區別 當兩者都為邏輯運算符時。 其實沒什麽差別。 &&和||當已經確定結果時,不會對第二個操作數求值。也不知道什麽情況會用到這個差別。做個筆記好了。 http://blog.cs

C++typenameclass的區別

type .get true 能夠 class .... ray pla 依賴 在c++Template中很多地方都用到了typename與class這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢? 相信學習C++的人對class這個關鍵字都非常明白,clas

c#ClassStruct使用與性能的區別

回收 數據結構 com 垃圾回收 父類 改變 med .cn 指針 在Unity中很多已經定義為結構體的數據結構 Vector2, Vector3 和 Vector4 Rect Color和Color32 Bounds Touch 1.Class為引用類型,Str

C#MonitorLock以及區別

能夠 program tor 試圖 tro 指定 object span () 原文地址:http://www.cnblogs.com/chengxingliang/p/3150731.html   Monitor對象   1.Monitor.Enter(object)方法

C#Convertparse的區別

處理 捕獲 用戶 整數 request 存在 query 轉換 中間 Convert.ToInt32()與int.Parse()的區別(1)這兩個方法的最大不同是它們對null值的處理方法: Convert.ToInt32(null)會返回0而不會產生任何異常,但int.P

C#&&&的區別

poi log sha 與操作 位運算 orm 第一個 pre 繼續 SiKi老師讓我們自行查一下&和&&的區別,So... 1)&和&&都可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都為tru

C/C++nearfar的區別

語言 補充 detail net 計算機體系結構 偏移 單元 體系結構 all C/C++中near和far的區別 關鍵字near和far受目標計算機體系結構的影響。目前編程中使用不多。 near關鍵字創建一個指向可尋址內存低端部分的目標指針。這些

C#virtualabstract的區別

tool 保留 到你 variable var 入口 printf static write 解讀一 c# 中 Abstract和Virtual比較容易混淆,都與繼承有關,並且涉及override的使用。下面討論一下二者的區別: 一、Virtual方法(虛方法)   vir

C#AbstractVirtual的區別

保留 一個 strac 虛擬 ati AI 靜態方法 void ride c# 中 Abstract和Virtual比較容易混淆,都與繼承有關,並且涉及override的使用。下面討論一下二者的區別: 一、Virtual方法(虛方法)   virtual 關鍵字用於在基

C#知識點總結系列:3、C#DelegateEvent以及它們的區別

的區別 sent () exit 功能 final 通知 bsp t對象 1.Monitor.Enter(object)方法是獲取鎖,Monitor.Exit(object)方法是釋放鎖,這就是Monitor最常用的兩個方法,當然在使用過程中為了避免獲取鎖之後因為異常,致鎖

C++指標引用的區別、以及引用取地址符&的區別

一. 指標和引用的區別 對於指標來說,它是一個地址,這個地址是一個數值,那麼就意味這個數值可以為0(空指標),也可以為其他,即指標可以不指向任何東西。 而對於引用來說,他是一個外號,外號一定是“某個存在物體”的外號,所以引用不能為空,即不能存在空引用。例如我們給小明起了個外號:明明,那我們說

c#DelegateEvent區別

     記:( 如果想直接進入正題請略過這段)最近開始積累一些以前知道的和不知道的C#,Unity3D,Shader知識。上大學的時候只顧好好考研,好好打球,好好彈吉他,沒有太多接觸技術部落格(誰知後來硬生生成了一個文藝的程式設計師。。。)。讀研的時候寫部落

初夏小談:C++“指標”“引用“”的區別

1.引用只能繫結一個實體,而指標可以指向不同實體2.使用指標時要判空,而引用不需要因此更安全3.引用在定義時必須初始化,指標不做要求4.在sizeof中:引用結果是引用型別的大小,但指標始終是地址空間所佔位元組個數 void Size() { long long x =

C#refout的區別

C#中的ref和out提供了值型別按引用進行傳遞的解決方案,當然引用型別也可以用ref和out修飾,但這樣已經失去了意義。因為引用資料型別本來就是傳遞的引用本身而非值的拷貝。ref和out關鍵字將告訴編譯器,現在傳遞的是引數的地址而不是引數本身,這和引用型別預設的傳遞方式是一樣的。 ref和

C#委託事件的區別

大致來說,委託是一個類,該類內部維護著一個欄位,指向一個方法。事件可以被看作一個委託型別的變數,通過事件註冊、取消多個委託或方法。本篇分別通過委託和事件執行多個方法,從中體會兩者的區別。   □ 通過委託執行方法 class Program { st

c++引用指標的區別

指標和引用的區別: (1)當引用被建立時,它必須被初始化。而指標則可以在任何時候被初始化。 (2)一旦一個引用被初始化為指向一個物件,它就不能被改變為對另一個物件的引用。而指標則可以在任何時候指向另一個物件。 (3)不可能有NULL引用。必須確保引用是和一塊合法