程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 也說_T、_TEXT、TEXT、L,_t_text

也說_T、_TEXT、TEXT、L,_t_text

編輯:C++入門知識

也說_T、_TEXT、TEXT、L,_t_text


本片文章轉載自:http://www.cnblogs.com/sobe/archive/2011/03/14/1984188.html

 

 

百度或谷歌一下,有很多大牛早已經寫過無數相關的文章說明這幾個宏的作用

而我嘛,寫這篇東東當是給自己一個提醒,因為之前直接使用了L這個標志,搞到後來要自己手動轉編碼

MSDN中對於L的說明有一大堆英文,不過主要的就是:L是用來標志一個字符(串)為寬字符(串)

寬字符和多字節字符的說明如下:(引用自網絡)

寬字符,wide character,該字符集內每個字符使用相同的位長;

多字節字符,multibyte character,每個字符可以是一到多個字節不等,而某個字節序列的字符值由字符串或流(stream)所在的環境背景決定。

當你在VS2005以上版本的IDE工作時,可以選擇工作於這兩種不同的編碼方式下,而在Unicode方式下,則要對字符(串)常量前添加L來告訴編譯器它是寬字符

而MS為我們定義了好幾個相關的宏,下面來一一說明:

_T            //定義於tchar.h

_TEXT      //同樣定義於tchar.h,具體如下:

 

復制代碼 #define _T(x) __T(x)
#define _TEXT(x) __T(x)

#ifdef _UNICODE
#define __T(x) L ## x //第210行
#else
#define __T(x) x //第858行
#endif 復制代碼

 

TEXT     //定義於winnt.h

 

復制代碼 #define TEXT(quote) __TEXT(quote)

#ifdef UNICODE
#define __TEXT(quote) L##quote
#else /* UNICODE */
#define __TEXT(quote) quote
#endif /* UNICODE */ 復制代碼

 

當我看到這裡的時候,一下子頭暈了,不知道大家有沒有注意到下面兩個問題:

1.這三個宏分別在兩個不同的文件被定義,看上去一個是運行時的頭文件,一個是Win的頭文件

2.前面兩個根據_UNICODE來確定宏內容,另一個則是根據UNICODE

那如果要同時使用這三個宏的話,那不是要同時定義_UNICODE和UNICODE?帶著問題,我把項目的屬性修改一下

當設置為Unicode編碼的時候,編譯器命令選項中的確同時加入了_UNICODE和UNICODE

看來這應該又是MS的歷史遺留問題拉,搜索一下才發現:(引自網絡)

 

Jeffrey Richter在《Windows核心編程》中說,_UNICODE宏用於C運行期頭文件,而UNICODE宏則用於Windows頭文件.當編譯源代碼模塊時,通常必須同時定義這兩個宏.

 

嘻嘻,無意發現的~~~~扯遠拉~~~~

看IDE自動生成的代碼,大都使用TEXT這個,應該是因為IDE生成的都是基於Win的代碼,使用這個也很正常吧

從上面的分析可得:

這幾個宏的效果都是一個的,還是建議大家有事沒事都加上其中一個(_T、_TEXT、TEXT)

而L嘛,個人認為還是不要在代碼中直接使用

好拉,就這麼多,歡迎各位大牛來圍觀指正~~~

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved