庫開發中需向用戶隱藏內部結構體細節 (如 libvlc_instance_t),僅暴露不完整類型指針,實現封裝與 ABI 穩定。
// __opaque_def.h
struct OpaqueTest {
int firstData;
int secondData;
};
// 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*);
// 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; }
#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);
}
class Impl; std::unique_ptr pImpl; (Pimpl 慣用語) 實現同樣效果。# 建立動態庫
g++ -shared -fPIC -o libopaque.so opaque_def.cpp
# 用戶編譯
g++ -o test test.cpp -L. -lopaque