關於C 巨集 AFX EXT CLASS

2021-06-08 14:39:54 字數 2095 閱讀 8101

出處:

使用 afx_ext_class 匯出和匯入

擴充套件dell使用 afx_ext_class 巨集匯出類;鏈結到擴充套件 dll 的可執行檔案使用該巨集匯入類。使用 afx_ext_class 巨集,用於生成擴充套件 dll 的相同標頭檔案可以與鏈結到 dll 的可執行檔案一起使用。

在 dll 的標頭檔案中,將 afx_ext_class 關鍵字新增到類的宣告中,如下所示:

class afx_ext_class cmyclass : public cdocument                                  ;

當定義了預處理 _afxdll 和 _afxext 時,該巨集被 mfc 定義為 __declsp(dllexport).但當定義了 _afxdll 而未定義 _afxext 時,該巨集被定義為 __declspec(dllimport)。定義後,預處理器符號 _afxdll 指示共享 mfc 版本正在由目標可執行檔案(dll 或應用程式)使用。當 _afxdll 和 _afxext 都定義了時,這指示目標可執行檔案是擴充套件 dll。

由於從擴充套件 dll 匯出時,afx_ext_class 被定義為 __declspec(dllexport),因此可以匯出整個類,而不必將該類的所有符號的修飾名放到 .def 檔案中。此方法由 mfc 示例 dllhusk 使用。

雖然使用此方法可以避免建立 .def 檔案和類的所有修飾名,但由於名稱可以按序號匯出,建立 .def 檔案的效率更高。若要使用 .def 檔案匯出方法,請將下列**放在標頭檔案的開頭和結尾處:

#undef afx_data

#define afx_data afx_ext_data

// #undef afx_data

#define afx_data

警告   匯出內聯函式時要小心,因為它們有可能導致版本衝突。內聯函式擴充套件到應用程式**中;因此,如果以後重寫內聯函式,除非重新編譯應用程式本身,否則內聯函式不會被更新。(通常,不用重新生成使用 dll 函式的應用程式就可以更新 dll 函式。)

匯出類中的個別成員

有時,您可能希望匯出類中的個別成員。例如,如果匯出 cdialog 派生類,可能只需要匯出建構函式和 domodal 呼叫。可以對需要匯出的個別成員使用 afx_ext_class。

例如:class cexampledialog : public cdialog

;您不再匯出類的所有成員,但由於 mfc 巨集的工作方式,您可能會遇到其他問題。幾個 mfc 的 helper 巨集實際宣告或定義資料成員。因此,還必須從 dll 匯出這些資料成員。

例如,當生成擴充套件 dll 時,declare_dynamic 巨集的定義如下:

#define declare_dynamic(class_name)

protected:

static cruntimeclass* pascal _getbaseclass();

public:

static afx_data cruntimeclass class##class_name;

virtual cruntimeclass* getruntimeclass() const;

以 static afx_data 打頭的行宣告類的內部靜態物件。若要正確匯出該類並從客戶端可執行檔案訪問執行時資訊,必須匯出此靜態物件。由於靜態物件是用 afx_data 修飾符宣告的,因此只需在生成 dll 時將 afx_data 定義為 __declspec(dllexport),並在生成客戶端可執行檔案時將 afx_data 定義為 __declspec(dllimport)。由於已經以此方式定義了 afx_ext_class,因此只需參考類定義,將 afx_data 重定義為與 afx_ext_class 相同。

例如:#undef afx_data

#define afx_data afx_ext_class

class cexampleview : public cview

;#undef afx_data

#define afx_data

mfc 總是在其巨集的內部定義的資料項上使用 afx_data 符號,因此該技術適用於所有這類情況。例如,它適用於 declare_message_map。

注意   如果匯出整個類而非選定的類成員,靜態資料成員將自動匯出。

c語言中關於巨集

我們在寫c語言程式中,已經初步了解到了 define的用法,下面對 define做乙個詳細的用法說明。格式如下 define name stuff有了這條指令之後,每當有name出現,就會被預處理器替換為stuff。例 define reg register define do forever fo...

關於C語言中的巨集

define pi 3.14 define zhouchang r 2 pi r 定義帶引數的巨集 undef pi 結束巨集 使用 ifdef ifndef else endif執行條件編譯 ifdefine 巨集名稱 語句 else 語句 endif define age 39 int main...

C語言 關於巨集的 與

巨集中 和 的用法 一 一般用法 我們使用 把巨集引數變為乙個字串,用 把兩個巨集引數貼合在一起.用法 1 2 3 4 5 6 7 8 9 10 11 include include usingnamespacestd define str s s define cons a,b int a e b...