關於C++中的包含編譯模型和分別編譯模型

來源:互聯網
上載者:User

這段時間在學習C++中的模板,在網上看到有對"包含編譯模型"和"分別編譯模型"的說法:

看C++ templates吧,裡面對這個問題討論得很詳細。 
包含編譯模型就是類模板的聲明和定義放在一個標頭檔裡 
分離模型就是和將聲明與實現分開 
不過要用到export關鍵字

根據我對書中內容的理解:

標準C++為編譯模板定義了兩種模型:包含模型和分別模型,這兩種方式很大程度上是相同的:類定義和函式宣告
放在標頭檔中,而函數定義和成員定義放在源檔案中.這兩種模型不同之處在於,編譯器怎樣使用來自源檔案的定義而已.

對"包含編譯模型",可以通過在聲明函數模板或類模板的標頭檔中添加一條#include指示使定義可用,
從而引入包含相關定義的源檔案.如下:

---------------------
// header file utlities.h
#ifndef AAAA_H
#define AAAA_H
template <class T> int compare(const T&, const T&);
......
#include "utilities.cc"
#endif

=======---------------
//implementation file utlities.cc
template <class T> int compare(const T &v1,const T &v2)
{
  //implemente
  ......
}
-------------------

這一策略使我們能夠保持標頭檔和實現檔案分離.

本書的作者並不是說"包含編譯模型"就是將申明和定義放在同一個標頭檔中.這裡分別放在了utlities.h和utlities.cc中,
只是在utlities.h時用了#include "utlities.cc".

而"分離編譯模型"只是在使用了關鍵字"export"來告訴編譯器模板定義在哪裡引用.
如果在標頭檔類聲明中使用了export,則該標頭檔只能被源檔案使用一次;
如果在實現檔案中使用了export,有兩種情況:

一種是在實現檔案的開頭加上
export template <class Type> class Xxxx;
#include "Xxxx.h"
//others definitions
....

這類情況中,匯出類成員都會自動聲明為匯出.
另一種情況就是對個別成員聲明要匯出的,只能對個別成員使用export.

"包含編譯模型"並不是類模板的聲明和定義放在一個標頭檔裡;
"分離編譯模型"也並不是將申明和定義分開.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.