1. 程式人生 > >MFC 中L 和 _T() 巨集

MFC 中L 和 _T() 巨集

_T("")是一個巨集,定義在tchar.h下 .

#define  _T(x) __T(x)

#define  __T(x)  x

#define __T(x)  L##x

TCHAR*  p =_T("Hello");

       他的作用是讓你的程式支援Unicode編碼 ,  因為Windows使用 兩種字符集 ANSI 和 UNICODE , 前者就是通常使用的單位元組方式 , 但這種方式處理像中文這項雙位元組字元不方便,

容易出現半個漢字的情況. 而後者是雙位元組的方式,方便處理雙位元組字元. 

       如果你編譯一個程式為ANSI 方式, _T 實際不起任何作用. 而如果編譯一個程式為UNICODE 方式,則編譯器會把 _T("Hello") 字串以UNICODE方式儲存;

       _T和L 的區別在於,L不管你是以什麼方式編譯的,一律以UNICODE方式儲存;

LPSTR:32bit指標指向一個字元串,每個字元佔1位元組 LPCSTR:32-bit指標指向一個常字元串,每個字元佔1位元組 LPCTSTR:32-bit指標指向一個常字元串,每字元可能佔1位元組或2位元組,取決於Unicode是否定義 LPTSTR:32-bit指標字元可能佔1位元組或2位元組,取決於Unicode是否定義 L是表示字串資源為Unicode的。 比如 wchar_tStr[] = L"Hello World!"; 這個就是雙位元組儲存字元了。 _T是一個適配的巨集~
#ifdef _UNICODE的時候 _T就是L 沒有#ifdef _UNICODE的時候 _T就是ANSI的。 比如 LPTSTR lpStr = new TCHAR[32]; TCHAR* szBuf = _T("Hello"); 以上兩句使得無論是在UNICODE編譯條件下還是在ANSI編譯條件下都是正確編譯的。 而且MS推薦你使用相匹配的字串函式 比如處理LPTSTR或者LPCTSTR的時候,不要用strlen ,而是要用_tcslen 否則在UNICODE的編譯條件下,strlen不能處理wchar_t*的字串。 T是非常有意思的一個符號(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一種中間型別,既不明確表示使用 MBCS,也不明確表示使用 UNICODE。那到底使用哪種
字符集
?編譯的時候才決定

相關推薦

MFC L _T() 巨集

_T("")是一個巨集,定義在tchar.h下 . #define  _T(x) __T(x) #define  __T(x)  x #define __T(x)  L##x TCHAR*  p =_T("Hello");        他的作用是讓你的程式支援Uni

C++L_T()之區別

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

C++,Windows/MFC_L_T()之區別

字串前面加L表示該字串是Unicode字串。 _T是一個巨集,如果專案使用了Unicode字符集(定義了UNICODE巨集),則自

MFCL, _T(),TEXT,_TEXT區別以及含義

一、在字串前加一個L作用:    如 L"我的字串" 表示將ANSI字串轉換成unicode的字串,就是每個字元佔用兩個位元組。    strlen("asd") = 3;     strlen(L"asd") = 6;    二、 _T巨集可以把一個引號引起來的字串,根據你的環境設定,使得編譯器會根據編譯目

MFC建立使用執行緒的方法

有關建立執行緒的問題有三種方法: 1.C語言函式,呼叫_beginthread(); 2.API函式,呼叫CreateThread(); 3.MFC函式,呼叫AfxBeginThread(); 推薦使用MFC函式AfxBeginThread(); 利用

MFCTCHARCHAR型別的互轉

//將TCHAR轉為char    //*tchar是TCHAR型別指標,*_char是char型別指標    TcharToChar (const TCHAR * tchar,&n

MFCOnPaint()OnDraw()

在檢視畫的圖象或者文字,當視窗改變後為什麼不見了?OnDraw()和OnPaint()兩個都是解決上面的問題,有什麼不同?(引用自百度) OnDraw()和OnPaint()好象兄弟倆,因為它們的工作類似。 至於不見了的問題簡單,因為當你的視窗改變後,會產生無效區域,這

MFCsetimerontimer定時器函式到時間不能觸發執行是因為WM_TIMER訊息的優先順序低

MFC中setimer和ontimer定時器函式到時間不能觸發執行, 因為WM_TIMER訊息的優先順序低,所以會優先處理高級別其他訊息,如 WM_PAINT訊息重複觸發介面的重繪, WM_TIMER無處理的機會。訊息

MFCSendMessagePostMessage兩種傳送訊息用法

前一段時間做專案,用到訊息響應機制,為了記憶,特發與此!待事件充裕之時再進行整理。 1.可通過SendMessage或PostMessage傳送訊息; SendMessage是傳送訊息之後待訊息響應執行完才返回;而PostMessage將訊息傳送出去之後就立刻返回。 2

linuxlikely()unlikely()巨集

The gcc C compiler has a built-in directive that optimizes conditional branches as either very likely taken or very unlikely taken. The

MFCCHtmlViewJS的相互呼叫

沒廢話,直接上步驟: 1、建立一個繼承自CHtmlView的類; 2、建構函式中新增 CNewHtmlView::CNewHtmlView() { // 允許自動化 EnableAutomation(); } 3、過載 virtual HRESULT OnGetExte

MFC_T巨集

Windows使用兩種字符集ANSI和UNICODE, 前者就是通常使用的單位元組方式,但這種方式處理象中文這樣的雙位元組字元不方便,容易出現半個漢字的情況。 而後者是雙位元組方式,方便處理雙位元組字元。 Windows NT的所有與字元有關的函式都提供兩種方式的版

GCC -L、-rpath-rpath-link的區別

目錄 恢復 固定 成功 ref exist fyi man手冊 錯誤 GCC 中 -L、-rpath和-rpath-link的區別 來源 http://blog.csdn.net/q1302182594/article/details/42102961 關於這3個參數的說明

MFC傳送自定義訊息機制,PostMessageSendMessage方式

       MFC中有種訊息佇列,使用PostMessage()或者SendMessage()給窗體傳送自定義訊息,當窗體接收到訊息時呼叫該訊息對應繫結的方法。 PostMessage:把訊息投放到執行緒的訊息佇列,不等訊息被處理就立即返回;Send

在linux,$*[email protected]有什麼區別?

看了很多的文章,依然似懂非懂。現在,終於理解了它們兩者之間的區別。 $*會把當前指令碼的所有引數作為一個引數傳遞給子指令碼。(在英文中,*字元有“所有”的意思) [email protected]會把當前指令碼的所有引數分別作為一個引數傳遞給子指令碼。(在英文中,@字元有“獨立”的

#define巨集定義的###用法區別

參考Difference between # and ## 簡單來說,在巨集定義中,#是將變數轉換成字串的作用,而##是連線兩個引數作用 ###exaplem #include <iostream> #define stringize_indire

MFC選單響應事件ON_UPDATE_COMMAND_UION_COMMAND訊息區別,OnMenuSelect事件介紹

第一個是響應開啟選單的命令的  第二個是你開啟這個選單時,處理這個選單的狀態,比如選中、變灰等等。 比如WINDOWS自帶的記事本程式,它的"格式"選單下有個"自動換行",那麼在編寫記事本這個程式時,對文字進行自動換行或不自動換行的操作就要放在ON_COMMAND訊息響應函式裡,而"自

記:巨集定義的###的作用

核心中有很多的巨集定義,在巨集定義define中經常看到兩個字串##和#,這裡把它的用法做一下說明:  一、 ##是一個連線符號,用於把引數連在一起         例如:          &n

MFC PreTranslateMessage(MSG* pMsg)截獲按鈕編輯框的訊息進行預處理

在類嚮導自動為對話方塊新增PreTranslateMessage(MSG* pMsg)函式; BOOL CjilutestDlg::PreTranslateMessage(MSG* pMsg) {     // TODO:  在此新增專用程式碼和/或呼叫基類     if

MFC的模態對話方塊非模態對話方塊

MFC筆記之模態對話方塊和非模態對話方塊 迫於科研的進度壓力,我還是選擇了MFC最為工具去開發裝置除錯軟體,最初想用Qt來創新一下,然而串列埠的通訊一直沒有成功,而且周圍沒有人用Qt使得我在遇到問題無法