巨集 T TEXT TEXT L區別

2021-07-07 06:52:52 字數 1863 閱讀 2708

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

msdn中對於l的說明有一大堆英文,不過主要的就是:l是用來標誌乙個字元(串)為寬字元(串)

寬字元和多位元組字元的說明如下:(引用自網路)

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

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

當你在vs2005以上版本的ide工作時,可以選擇工作於這兩種不同的編碼方式下,而在unicode方式下,則要對字元(串)常量前新增l來告訴編譯器它是寬字元

_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。列舉常量屬於常量,但巨集不是常量 3。列舉常量具有型別,但巨集沒有型別,列舉變數具有與普通變數相同的諸如作用域 值等性質,但巨集沒有,巨集不是語言的一部分,它是一種預處理替換符。列舉型別主要用於限制性輸入,例如,某個函式...

巨集和函式的區別

巨集定義又稱巨集代替,巨集替換,其宣告方式為 define name parameter list stuff。其中,parameter list 引數列表 是乙個有逗號分隔的符號列表,它們可能出現在stuff中。必須注意的是,引數列表的左括號必須與name緊密相連,如果兩者之間有任何空格存在,則引...

巨集和函式的區別

巨集非常頻繁的運用於執行簡單的計算。那麼,為什麼不用函式呢?1.巨集在使用時比函式在程式的規模和速度更勝一籌。2.函式的引數必須申明為乙個特定的型別,於是它只能在型別合適的表示式使用。而巨集為無型別替換。而有些情況只能用巨集,就是按型別申請空間時。如 define malloc n,type typ...