opaque struct——c/c++如何隐藏内部结构体的定义?
来源:互联网 发布:陶瓷铺贴软件 编辑:程序博客网 时间:2024/05/18 01:47
学习过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 <iostream>
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 <iostream>
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^
- opaque struct——c/c++如何隐藏内部结构体的定义?
- 初学c/c++——定义结构体(struct)
- C语言的struct定义
- linux C 结构体struct的定义和初始化
- C语言学习-struct结构体定义你自己的数据类型
- C——struct
- C++struct里定义函数
- C Abstract——Struct 结构体
- Gun C 和 VC对struct定义的一点不同
- c与c++中enum和struct定义的区别
- c/c++ struct的定义、声明、对齐方式
- C/C++ struct 结构体定义 用法详解
- Object-C学习(五):结构体(struct)、typedef、以及与#define宏定义的区别
- C语言 枚举(enum)、宏定义(#define)、结构体(struct)的一种联合应用
- 从C到C++——结构体(struct)的涅槃
- c的struct
- C++--struct的用法
- C语言结构体(struct)常见定义和使用-struct
- android 仿IPhone ExpandableListView
- .NET中的静态与非静态的异同。
- iOS:请解答以下路径分别是用来存放什么的?
- ios开发Objective-C可变参数函数
- 充电足球:可为手机充电 每个售价99美元
- opaque struct——c/c++如何隐藏内部结构体的定义?
- Convert Sorted Array to Binary Search Tree 将数组转换成二叉查找树
- “控件设置ContextMenuStrip属性后,第一次右击不显示菜单”解决方法
- Kali linux 安装chrome
- 《新理解矩阵1》:矩阵是什么?
- 无锁程序设计(CAS)
- 红帽与CentOS合作推动开源在云计算中的创新
- 软件质量BUG等级定义
- 挑战庞果英雄会之最小操作数(失败求指教)