程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> opaque struct——c/c++如何隱藏內部結構體的定義?

opaque struct——c/c++如何隱藏內部結構體的定義?

編輯:C++入門知識

學習過VLC的童鞋都會看得類似這樣的代碼:
/** This structure is opaque. It represents a libvlc instance */
typedef struct libvlc_instance_t libvlc_instance_t;
但是怎麼也找不到libvlc_instance_t的定義,難道說libvlc_instance_t沒有定義嗎?不是的,其實libvlc_instance_t

是定義了的,在一個“私有的頭文件”中定義的。看一個例子就明白來。
1、創建一個動態庫工程,名為libOpaqueStruct,

libOpaqueStruct.h為工程自動生成的代碼,保留內容如下:

//libOpaqueStruct.h
#ifdef LIBOPAQUESTRUCT_EXPORTS
#define LIBOPAQUESTRUCT_API __declspec(dllexport)
#else
#define LIBOPAQUESTRUCT_API __declspec(dllimport)
#endif

2、添加內部結構體定義頭文件
//__opaque_def.h
#ifndef __OPAQUE_DEF_H
#define __OPAQUE_DEF_H

struct opaque_test
{
int firstData;
int secondData;
};
#endif

3、添加對外接口定義頭文件
//opaque_def.h
#ifndef OPAQUE_DEF_H
#define OPAQUE_DEF_H
#include "libOpaqueStruct.h"

typedef struct opaque_test opaque_test;

LIBOPAQUESTRUCT_API opaque_test * opaque_test_new();
LIBOPAQUESTRUCT_API void opaque_test_set(opaque_test * p_opaque_test, int v1, int v2);
LIBOPAQUESTRUCT_API void opaque_test_print(const opaque_test * p_opaque_test);
LIBOPAQUESTRUCT_API void opaque_test_delete(opaque_test * p_opaque_test);


#endif //OPAQUE_DEF_H

4、添加實現文件
//opaque_def.cpp
#include "__opaque_def.h"
#include "opaque_def.h"
#include
using namespace std;

opaque_test * opaque_test_new()
{
return new opaque_test();
}
void opaque_test_set(opaque_test * p_opaque_test, int v1, int v2)
{
if (p_opaque_test != NULL)
{
p_opaque_test->firstData = v1;
p_opaque_test->secondData = v2;
}
}
void opaque_test_print(const opaque_test * p_opaque_test)
{
if (p_opaque_test != NULL)
{
cout << "the first data is "
<< p_opaque_test->firstData
<< " and the second data is "
<< p_opaque_test->secondData
<< endl;
}
}
void opaque_test_delete(opaque_test * p_opaque_test)
{
delete p_opaque_test;
p_opaque_test = NULL;
}

5、最好編譯,生成libOpaqueStruct.dll和libOpaqueStruct.lib
編譯中,如果報錯,在工程屬性中,取消預編譯即可。

下面來調用我們的dll
6、創建一個控制台程序名為test,把頭文件(opaque_def.h和libOpaqueStruct.h)放到./libOpaueStruct/inc/下面,
把lib文件(libOpaqueStruct.lib)放到./libOpaueStruct/lib/下面,dll放到生成的test.exe中,把libOpaqueStruct.lib配到你的工程中去。

這些是最基本的東西,相信你懂的。
//test.cpp
#include "stdafx.h"
#include "libOpaueStruct/inc/opaque_def.h"
#include
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
opaque_test * p_opaque_test = opaque_test_new();
opaque_test_set(p_opaque_test, 5, 6);
opaque_test_print(p_opaque_test);
system("pause");

opaque_test_delete(p_opaque_test);
return 0;
}

7、編譯test,運行,屏幕上顯示:
the first data is 5 and the second data is 6

從這個例子,可以學習到如何隱藏內部結構體的定義,Windows API應該就是這樣實現的。在今後的工作中,也這樣寫dll吧。

大神裝,裝大神!^v^

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved