首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC++

VC DLL 導出 C++ 類別:__declspec 與 .def 兩大方案完整對比

     編輯:VC++

C++ 類別導出兩大方案

建立 Win32 DLL 專案,定義類別 CInDLL 需供外部專案使用。導出類別需在生成的 DLL 匯入庫保留足夠符號資訊,兩種主流方案:

方案一:__declspec(dllexport/dllimport) — 簡單但需雙重維護

// 導出時
class __declspec(dllexport) CInDLL { ... };

// 使用時 (客戶端專案)
class __declspec(dllimport) CInDLL { ... };

缺點:標頭檔需視建置端切換巨集,維護麻煩。

方案二:巨集切換 .def 方案 — 專業標準作法

標頭檔定義巨集,實作檔定義導出標記:

// CInDLL.h
#ifdef _CLASSINDLL
    #define CLASSINDLL_CLASS_DECL __declspec(dllexport)
#else
    #define CLASSINDLL_CLASS_DECL __declspec(dllimport)
#endif

class CLASSINDLL_CLASS_DECL CInDLL {
public:
    CInDLL();
    // ...
};
// CInDLL.cpp
#define _CLASSINDLL  // 定義導出標記
#include "CInDLL.h"

CInDLL::CInDLL() { }
 // ...

運作原理

  • 建置 DLL 專案時:_CLASSINDLL 已定義 → CLASSINDLL_CLASS_DECL 展開為 __declspec(dllexport),類別匯出
  • 客戶端專案包含標頭檔時:未定義 _CLASSINDLL → 展開為 __declspec(dllimport),類別匯入
  • 無需修改標頭檔,一碼雙用

補充:模組定義檔 (.def) 替代方案

亦可使用 .def 檔案列出導出符號,避免標頭檔污染,但維護較繁瑣。現代 VC 專案推薦巨集方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved