簡化.NET裝配庫

來源:互聯網
上載者:User
簡化.NET裝配庫
作者: ZDNET   www.ASPCool.com 時間:2002-5-3 15:55:08  閱讀次數:4601

     Microsoft .NET的受管C++最終大大簡化了構造更準確.NET裝配庫的方式。這種簡化主要是由裝配庫的自我說明特性所帶來的。這對受管C++程式員具有怎樣的意義呢?實際上,以往在建立傳統C++庫時精心建立的各種標頭檔在裝配代碼的情況下已不再成為必要的組成部分了(除了出於維護的目的)。
  
  
  從個人觀點看,我認為維護標頭檔是令人痛苦的,所以我當然很高興這些標頭檔能從我的視野中消失。在編程的時候我經常忘記用來索引庫所需要的一個或者多個標頭檔,而且我還不得不找遍包含檔案的內容來檢索遺失資料類型的定義。更糟糕的是,把原始碼分成兩半令我始終不得不在糾正錯誤的處境下工作。比如我就經常犯下這樣的錯誤,忘了把所有的包含檔案打包或者令.h和.cpp檔案沒有保持同步。
  
  由於裝配過程中不再需要標頭檔了,所以你可以用新型的、經過改進的方法構造源檔案。但在討論到這些方法之前,先不妨讓我們看看建立裝配的傳統方法是怎麼回事。
  
  
  傳統方法
  
  建立庫的傳統C++方法是這樣的,首先建立一套說明庫內各個功能的標頭檔。接著,在各個源檔案裡實現這些標頭檔中定義的全部功能。每一個源檔案連同其關聯的標頭檔,經過編譯器編譯之後產生目標檔案,所有的目標檔案再串連起來形成庫檔案。圖A顯示的就是以上的傳統過程。
  
  圖A
  
  
  
  建立庫的傳統方式
  
  
  為了要採用這些標頭檔呢?原因是,有了它們,在以後引用類的時候,所有的類、結構和變數等等都能得到方便的定義。
  
  產生裝配也可以採用同樣的方式。唯一的差別是必須設定受管C++標誌。
  
  以下在清單A、B、C和D中顯示的樣本對如何用傳統C++方法建立裝配進行了說明。
  
  清單A 顯示Cards.h標頭檔中的內容。該檔案定義了處於Cards 名稱空間中的enum類型Suits類和Card類。注意,在受管C++語言中,關鍵詞public要放在enum和類的前面,兩者都需要接受公用訪問。
  
  清單B 顯示的是對類的構造器和成員方法的實現。清單C定義了第2個類:Deck。注意, Card類就用在Deck類的內部,然而其標頭檔中卻沒有對它進行聲明。實際上,在編譯過程中,標頭檔會整個一堆地粘貼到源檔案裡去。所以,我們只要在Deck.cpp源檔案的Deck.h之前包含Card.h檔案就可以了。這樣,Card類首先粘貼,因而,Deck類也就獲得了需要的定義。
  
  清單D 顯示了最終產生庫的源檔案。注意,正如我們先前提到的那樣, Card.h包含在Deck.h之前。
  
  在命令列環境下建立庫的命令很簡單。文法如下:
  cl source1.cpp source2.cpp ... sourceN.cpp /CLR /LD /o OutputName.dll
  
  C++編譯器會擷取源檔案的名字列表。然後讀取/CLR參數,等於告訴編譯器我們正在使用受管擴充。然後,/LD參數告訴連接器建立.dll,最後/o參數告訴要建立的.dll檔案的名稱。
  
  編譯以上的例子執行如下命令即可:
  cl card.cpp deck.cpp /CLR /LD /o cards.dll
  
  新型的裝配方法
  
  由於不再需要分離標頭檔和源檔案,所以我們可以利用新舉措對庫進行編碼。首先,只用一個類(.h)檔案對類進行編碼——包括其定義和實現等。然後用單一的串連(.cpp)檔案包含所有的類檔案。這裡唯一要注意的就是一定要把類檔案放到正確的地方以便在用到它之前各種對象都能準確定義。不過,這個小麻煩不也是傳統方法也要遭遇的嗎?圖B顯示了新型的裝配過程。
  
  圖B
  
  
  
  新型的裝配方法
  
  
  採用以上方法,你只需要維護一半數量的檔案了。因為定義和原始碼都放到了一起,所以它們不可能失去同步。結果,維護庫的任務也變得相當簡單。此外,檔案的可讀性大大提高,文檔只需要放在一個地方即可,這真是個好法子。
  
  清單E、F和G則顯示以上建立的同一庫,但採用了這種新方法。
  
  正如你看到的那樣,清單E是傳統方法下的Card.h和Card.cpp檔案。基本上替代了分離檔案的定義方法,我就是直接把實現代碼放到了類定義中。
  
  同樣的,清單F則是傳統Deck.h和Deck.cpp檔案的組合。同傳統方法一樣,你可以在這一類的範圍內訪問其他類而不必在檔案中定義後者。連接器需要保證類定義放在了正確的位置以便它們能在用到之前得到定義。
  
  清單G 中的串連檔案是唯一與眾不同的檔案,因為它只包含了include聲明。受管C++編譯器只編譯.cpp檔案,所以為了讓編譯器能多管點事,你就得有這個檔案。這種檔案的便利之處在於從庫內添加或者刪除類變得方便多了,你只需要把組成庫的所有類都放在某一位置即可。在開發過程中,連接器檔案是存放測試代碼的絕佳位置。
  
  這種構造裝配庫的方法可以把編譯運行命令簡化到下面的地步:
  cl cards.cpp /CLR /LD
  
  
  小結
  
  自我說明的裝配有可能會大大簡化我們的編碼方式,主要原因是不再需要把原始碼模組分解為源檔案和標頭檔。文中的舉例清楚地顯示出構造裝配庫的新方法所帶來的莫大益處。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.