opaque struct——c/c++如何隐藏内部结构体的定义?

opaque struct——c/c++如何隐藏内部结构体的定义?学习过VLC的童鞋都会看得类似这样的代码:/**Thisstructureisopaque.Itrepresentsalibvlcinstance*/typedefstructlibvlc_instance_t libvlc_instance_t;但是怎么也找不到libvlc_instance_t的定义,难道说libvlc_instance_t没有定义吗?不是

大家好,欢迎来到IT知识分享网。opaque struct——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 <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^

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/15088.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信