成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

剖析ATL與WTL CString的實現機制

開發 后端
我們今天要討論的是ATL和MFC中的頭文件,把它搞清楚。另外還要給大家講清楚CString的實現機制。

話說CString這個東西困擾了很多年輕人,因為它會引起詭異的編譯錯誤,今天跟著我一起來深入ATL、WTL頭文件,來把這個東西搞個清清楚楚。

【涉及到頭文件】

ATL : atlstr.h, atlsimpstr.h

MFC : cstringt.h、afxstr.h

WTL : atlmisc.h

ATL和MFC有關剪不斷理還亂的關系,為了更容易分析,我們先要理清這四個頭文件間的關系。觀察相互間觀察順序,可以得出:

atlstr.h引用cstringt.h,cstring引用atlsimpstr.h,afxstr.h引用cstringt.h,由此可得出下圖:

【atlsimpstr.h 都干了什么】

1、定義了 CStringData 和 CNilStringData 類(前篇已述,此處略)

2、定義了 ChTraitsBase 類,類如下:

此類比較簡單,功能是為不同的字符類型,建立新的統一的名稱。另外,這里使用到了模板特化技術。

3、定義了CSimpleStringT類,此類的功能是,在ChTraitBase定義的統一名稱的基礎上,提供字符串一些基本的操作功能函數。

t_bMFCDLL可無視。另外,注意,此處所操作的字符串對象,都是CStringData(前篇已述)

總述:在atlsimpstr.h中,我們發現了3個令人感興趣的東西,CStringData 是字符串操作單元,ChTraitBase提供字符串變量統一命名服務,而CSimpStringT是一個基于CStringData字符串操作單元的簡易的CString(注意,只是簡易,其中并未提供我們常用的CString中的那些函數)。

【cstringt.h 都干了什么】

1、定義了 ChTraitsCRT 類,如下:

該類繼承atlsimpstr.h中的 ChTraitsBase 類,然后在父類提供服務的基礎上,提供一系列字符串底層操作函數。思考:為什么此處用繼承?而CSimpleStringT使用提typedef?

2、定義了 _MFCDLLTraitsCheck 類,如下:

 這里再一次用到了模板特化技術,該類用于檢測當前使用的StringTraits是ATL定義的還是MFC定義的。(ATL定義的叫StrTraitATL,MFC定義的叫StrTraitMFC,后面會提到)

3、定義了 CStringT 類,如下:

 注意了,CStringT 就是CString的真身!前面說到,CSimpStringT操作CStringData字符串操作單元,提供基本的字符串操作功能,而CStringT繼承CSimpleStringT,利用StringTraits,包裝更高級的功能函數。而這些更高級的功能函數,就是我們通常調用CString時所使用到的那些函數。

【atlstr.h 都干了什么】

1、定義了 CAtlStringMgr 類。(前文已述)

2、定義了 ChTraitsOS 類,如下:

和 ChTraitCRT相對應,ChTraitsOS繼承atlsimpstr.h中的 ChTraitsBase 類,然后在父類提供服務的基礎上,提供一系列字符串底層操作函數。

和 ChTraitCRT相比,他倆提供的函數大部相關,少數不同,另外相同函數名的實現不一定相同。

3、定義了 StrTraitATL 類,如下:

和 StrTraitMFC相對應,該類提供字符串資源管理函數和CStringData內存管理器的ATL版。

4、定義了CSTRING,如下:

【afxstr.h 都干了什么】

1、定義了 StrTraitMFC,如下:

上文已述,和StrTraitATL相對,本類提供的功能實現都封閉在MFC中。

2、定義了CString,如下:

【atlmisc.h 都干了什么】

打開atlmisc.h,可以發現此文件只不過是定義了一些結構體,定義了一個CString的簡易版。因為ATL CString依賴于MFC頭文件,所以,如果在使用CSTRING而又不想加入過多其它文件時,WTL CSTRING提供了一個很好的選擇。

所有文件都分析后,我們發現,atl、mfc、wtl分別定義了一個CString。其中atl和mfc中的CString都是基于CStringT,只有一個地方是不同的,即CStringT所引用的StringTrait(即StrTraitsATL 還是 StrTraitMFC)。而WTL CString 的實現是獨立的,是一個真正的類。另外 ,StringTrait引用的Iterator是可選的(即底層字符串操作封裝)。

***,我們發現ATL和MFC中涉及CString的類關系有些復雜。

為什么ATL和MFC的CString頭文件要攪在一起?

上文的分析有些雜亂,我們通過一張圖來更加清晰的觀察,如下:

上圖中,用圈圈住的頭文件表示ATL頭文件,沒被圈的代表MFC頭文件。另外,在頭文件旁邊字符,表示各個頭文件中實現的類。

現在讓我們仔細觀看,整個貌似平衡的設計中,其實有著很多的不平衡。我想問:

1、為什么MFC頭文件cstringt.h要包含atl頭文件atlsimpstr.h?為什么ATL頭文件要包含cstringt.h?ATL搞ATL的,MFC搞MFC的,各不相干,起不更好?

2、ChTraitOS 放在 atlstr.h 中,而 ChTraitCRT 放在 cstringt.h中,他倆功能是類似的,邏輯上是相對的,為神馬在文件層次上卻不對齊,要如此的別扭?

話說中國人看待問題的時候,往往把某一大類看作一蹴而就的***的整體。譬如Tencent很賺錢,很大,產品推出快,人們就認為Tencent內部有著良好的組織架構。這里我要告訴大家的是,任何大規模的東西,都是一點一滴積累起來的。ATL也是,MFC也是。這兩個東西不是一個月、兩個月的開發就成了現在的樣子的,他們都是逐步疊加,逐步改進才成了今天這個強大的庫的。扯了這些,是要告訴大家,要以變化、積累、動態來看待和分析事物的衍生。

好了,現在我們來看為什么微軟會搞出這么別扭的結構。

話說,某一天ATL開發小組發現老是操作char,太低效,STL的string也不是很好用,于是乎,他們做了一個為ATL服務的簡單的字符串類,名字叫 CSimpleStringT,通過typedef,定義成了 CSimpleString。

后天某一天,MFC的人也發現char和string超不好用,他們發現公司的ATL小組已經做了一個成熟CSimpleString類,于是MFC小組拿來直接使用。在使用中,MFC小組的人發現CSimpleString做的太簡單了,有很多的功能,它都不提供,另外,類函數設計的也不好用。于是MFC小組的成員決定擴展CSimpleString,他們將擴展的代碼寫進cstringt.h中,另外抽離出對外的接口頭文件afxstr.h,將定義放在了這。(到這里,我們發現了上面提到問題的發生點,MFC的頭文件繼承了ATL頭文件)。

又到后來,MFC小組的某個成員(主程級)轉到了ATL小組,來到ATL小組后,他發現,平日用慣了CString,現在要用CSimpleString真TM憋屈,于是他建議在ATL中自封裝一個CStrnig。ATL小組發現,繼然MFC的CString已經做得這么成熟穩定且好用了,自己沒必要再另起爐灶,另外,他們發現cstringt.h是獨立于MFC其它文件的,雖然屬于MFC小組(MFC小組所寫),但是引用的卻都是atl的頭文件,因此,引用cstringt.h不會融入MFC其它旁大的文件,因此可行。所以綜合以上考慮,ATL小組直接繼承于cstringt頭文件,派生了自己的CString,放在了atlstr.h中。(注意,連名字取得都和afxstr.h相對應,到這里,我們又看到,ATL頭文件繼承了MFC頭文件)。

就這樣,誕生了兩份CSring。日子很平淡的一天一天過去,直到有一天,有個項目要混用ATL和MFC,他們發現,有兩份CString,編譯不過!因為ATL的CString畢竟只是模仿MFC,于是ATL讓路,加上了宏定義 #ifndef _AFX ,意即,在沒有使用MFC時,ATL才定義CString。

ATL 和 MFC CString的故事講完了,相信大家對CString相關文件目前結構的來龍去脈應該很清楚了。但是WTL呢?為什么WTL也要定義一個CString?話說WTL編寫過程中,WTL組的后生小輩們看了ATL的CString代碼,他們覺得咋這CString搞得咋這么復雜呢?看得頭都大了,于是他們設計了一個四兩撥千斤的CString,不繼承任何東西,不依賴任何東西,就是一個簡簡單單的類。在初期,他們工作得很好,但是到后期,他們發現,如果兩個人的代碼用的是不同的CString的話,那么將代碼合并的時候,編譯不過,和之前遇到的問題一樣,會產生兩個CString,于是WTL不得不加了另外一個宏 _WTL_NO_CSTRING 來禁止WTL CString的編譯。

好了,故事全都講完了,ATL、WTL、MFC,結論是,先有CAtlSimpleString,后有MFC CString,再有ATL CString,***有WTL CString,唉,微軟的人搞這么復雜干嘛呢……

原文鏈接:http://www.cnblogs.com/tekkaman/archive/2011/04/20/2022650.html

 

責任編輯:彭凡 來源: 博客園
相關推薦

2011-04-21 10:45:34

ATLWTLCString

2023-10-26 08:12:37

Java變量類型

2010-08-04 13:52:53

Flex事件機制

2025-02-12 00:29:58

2018-01-26 17:36:12

2023-07-07 10:41:00

Javajar文件

2020-07-19 10:26:47

Kubernetes數據結構

2010-02-04 16:58:29

C++類庫

2025-02-27 00:32:35

2012-02-08 10:37:42

Java反射

2025-03-26 11:30:40

2025-04-18 04:05:00

2009-09-23 17:48:00

Hibernate事務

2012-02-08 09:44:52

Java反射

2021-01-10 10:30:24

站點隔離Chrome漏洞

2020-11-20 07:55:55

Linux內核映射

2022-10-08 10:10:58

內存技術安全

2022-03-11 09:12:06

MySQLMDL

2011-06-13 10:21:25

QT 信號 槽機制

2012-02-08 09:53:25

Java反射
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美综合视频在线 | 免费人成激情视频在线观看冫 | 日本精品一区二区 | 欧美视频精品 | 成人精品系列 | 欧美精品一区二区在线观看 | 国产欧美日韩精品一区二区三区 | 久久久91精品国产一区二区三区 | 97免费在线观看视频 | 正在播放国产精品 | 精品久久中文字幕 | 天天视频一区二区三区 | 亚洲国产精品久久久久婷婷老年 | 久久精品美女 | 久久99视频 | 久久成人一区 | 1000部精品久久久久久久久 | 91电影在线| 在线观看中文字幕视频 | 狠狠操狠狠操 | 亚洲精品久久久久久国产精华液 | 人人九九精 | 永久免费av | 成人精品久久 | 欧美一区二区在线观看 | 成人三级av | 成人免费视频7777777 | 欧美一级免费 | 色婷婷综合久久久中文字幕 | 成人午夜高清 | 欧美精品中文字幕久久二区 | 午夜精品在线 | 91精品国产91久久久久久密臀 | 日本一级淫片免费啪啪3 | 欧美综合国产精品久久丁香 | 成人在线精品视频 | 免费日本视频 | 自拍第一页| 我爱操 | 日本一区二区三区免费观看 | 欧美色欧美亚洲另类七区 |