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

C/C++ 不透明指針:隱藏結構體定義的標準做法

     編輯:C++ 入門

動機

庫開發中需向用戶隱藏內部結構體細節 (如 libvlc_instance_t),僅暴露不完整類型指針,實現封裝與 ABI 穩定。

實現步驟 (Windows DLL 示例)

1. 內部定義頭文件 (僅庫內部可見)

// __opaque_def.h
struct OpaqueTest {
    int firstData;
    int secondData;
};

2. 對外接口頭文件 (用戶包含)

// opaque_def.h
typedef struct OpaqueTest OpaqueTest; // 前向宣告,不完整類型

__declspec(dllexport) OpaqueTest* opaque_test_new();
__declspec(dllexport) void opaque_test_set(OpaqueTest*, int, int);
__declspec(dllexport) void opaque_test_print(const OpaqueTest*);
__declspec(dllexport) void opaque_test_delete(OpaqueTest*);

3. 實現文件 (包含內部定義)

// opaque_def.cpp
#include "__opaque_def.h"
#include "opaque_def.h"
#include 

OpaqueTest* opaque_test_new() { return new OpaqueTest(); }
void opaque_test_set(OpaqueTest* p, int v1, int v2) {
    if (p) { p->firstData = v1; p->secondData = v2; }
}
void opaque_test_print(const OpaqueTest* p) {
    if (p) std::cout << "first=" << p->firstData << ", second=" << p->secondData << '\n';
}
void opaque_test_delete(OpaqueTest* p) { delete p; }

4. 用戶代碼 (僅見不完整類型)

#include "opaque_def.h"
int main() {
    OpaqueTest* obj = opaque_test_new();
    opaque_test_set(obj, 5, 6);
    opaque_test_print(obj); // 輸出: first=5, second=6
    opaque_test_delete(obj);
}

關鍵點

  • 用戶無法 `sizeof(OpaqueTest)`、無法直接訪問成員、無法在棧上分配,只能通過工廠函數獲取指針並傳遞給 API。
  • 內部結構變更 (增減成員) 不影響用戶代碼二進制兼容性,只需重新編譯庫。
  • C++ 中常用 class Impl; std::unique_ptr pImpl; (Pimpl 慣用語) 實現同樣效果。

編譯命令

# 建立動態庫
g++ -shared -fPIC -o libopaque.so opaque_def.cpp
# 用戶編譯
g++ -o test test.cpp -L. -lopaque
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved