从DLL导出POD结构

时间:2016-08-08 10:06:36

标签: c++ visual-c++ dllexport

考虑以下来源library.cpp

struct parameter {
    const char *path;
    int num;
    bool flag;
    /* and many, many more members... */
};

__declspec(dllexport) void func(const parameter &);

这将编译到库library.dll

据我了解,导出声明只导出函数和数据。由于结构parameter没有定义任何函数,因此这里没有必要,我省略了它。

但是

dumpbin.exe /EXPORTS library.dll

揭示,这里确实存在真正的差异:方法operator = (const parameter &)将被导出。

问题:导出parameter是否有任何重要原因,即在__declspec(dllexport)前添加parameter? POD结构的最佳实践是什么。

1 个答案:

答案 0 :(得分:0)

通常情况下,像struct这样的POD只包含数据(也是基本类型)而没有函数,只是在" .h"与相应的.dll一起提供的文件。

//MyDLL.h -------------------------------------------------
#ifndef __MYDLL_DOT_H__
#define __MYDLL_DOT_H__

struct parameter 
{
    const char *path;
    int num;
    bool flag;
};

#ifdef __DLLEXPORT__
__declspec(dllexport) void func(const parameter &);
#else
__declspec(dllimport) void func(const parameter &);
#endif

#endif //#ifndef __MYDLL_DOT_H__
//MyDLL.h -------------------------------------------------


//Client_Of_MyDLL.cpp -------------------------------------
#include "MyDLL.h"

int main()
{
    parameter stParameters;
    //initialize parameters of stParameters
    func(stParameters); 
}
//Client_Of_MyDLL.cpp -------------------------------------

编辑:由于POD包含纯数据,因此DLLDLL的客户端中此类POD的声明保持不变。这里纯粹的数据意味着没有member functions即使POD有另一个struct说,B里面有一些member function B::func()。那么,没有重要的理由将结构与函数一起导出。