而我嘛,寫這篇東東當是給自己乙個提醒,因為之前直接使用了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
#definetext(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...